MikeSchinkel
  • 0
Гуру

Объективные рекомендации по разработке плагинов? [закрыто]

  • 0
  1. Я действительно не понимаю, как вики сообщества должна правильно работать с этим (и другими) с SE, но, возможно, это вопрос о мета. Это будет только накапливать в основном обманы в ответах.

    • 0
  2. Используйте действия и фильтры

    Если вы считаете, что люди хотели бы добавить или изменить некоторые данные: предоставьте команду apply_filters() перед возвратом.

    PS Одна вещь, которую я нахожу немного разочаровывающей, и ваш вопрос касается процента плагинов, которые предназначены только для конечных пользователей, то есть у которых нет собственных крючков. Представьте, если бы WordPress был разработан как большинство плагинов? Это было бы негибким и очень нишевым решением.

    Может быть, все было бы иначе, если бы WordPress имел возможность автоматически устанавливать плагины, от которых зависели бы другие плагины? Как правило, мне приходится писать многие функции, которые мне нужны, с нуля, потому что клиенты хотят, чтобы все было определенным образом, а доступные плагины, в то время как 90% есть, не позволяют мне гибко обновлять оставшиеся 10%.

    Я действительно хочу, чтобы лидеры сообщества WordPress нашли способ гарантировать, что плагины вознаграждаются за следование лучшим практикам (например, добавление хуков для других разработчиков), так же, как хорошие ответы вознаграждаются на сайте StackExchange.

    Возьмем пример из другого вопроса :

    Пример: я хочу что-то сделать в своем плагине, когда кто-то ретвитит статью. Если бы в каком-нибудь популярном плагине для ретвитов был специальный хук, к которому я мог бы подключиться и запустить, это было бы здорово. Его нет, поэтому я могу изменить их плагин, чтобы включить его, но это работает только для моей копии, и я не хочу пытаться распространять ее.

    Связанный

    • 0
  3. Загрузить скрипты/CSS с помощью wp_enqueue_script иwp_enqueue_style

    Плагины не должны загружать / пытаться загружать дубликаты версий файлов JS / CSS, особенно jQuery и других файлов JS, включенных в WP Core.

    Плагины всегда следует использовать wp_enqueue_script и wp_enqueue_style при связывании файлов JS и CSS и никогда напрямую через <script> теги.

    Связанный

    • 0
  4. поддержка I18n

    Все выходные строки должны быть связаны с соответствующим текстовым доменом, чтобы обеспечить интернационализацию заинтересованными сторонами, даже если разработчик не заинтересован в переводе своего собственного подключаемого модуля.

    Обратите внимание, что очень важно загружать языковые файлы во время init действия, чтобы пользователь мог подключиться к действию.

    См. Кодекс: I18n для разработчиков WordPress

    А также эту статью: Правильная загрузка языковых файлов WP.

    Начиная с WordPress 4.6+

    WP 4.6 изменил порядок загрузки и проверенные местоположения, что значительно упростило работу разработчиков и пользователей.

    Учитывая плагин с текстовым доменом «my-plugin», WordPress теперь будет СНАЧАЛА искать файл перевода в:
    /wp-content/languages/plugins/my-plugin-en_US.mo

    Если ему не удастся найти его там, он будет искать его там, где плагин говорит ему искать (обычно в папке «язык» подключаемых модулей, если следует кодексу):
    /wp-content/plugins/my-plugin/languages/my- плагин-en_US.mo

    Наконец, если языковой файл не найден, он проверит расположение по умолчанию:
    /wp-content/languages/my-plugin-en_US.mo.

    Первая проверка была добавлена ​​в 4.6 и дает пользователям определенное место для добавления языкового файла, так как раньше им нужно было знать, где разработчик добавил языковой файл, теперь пользователю просто нужно знать текстовый домен плагина: /wp-content/ языки/плагины/TEXTDOMAIN-LOCAL.mo


    Ниже приведен старый способ (не актуален с WP 4.6+)

    […]
    Наконец, я хотел бы отметить, что важно загружать пользовательские языковые файлы из WP_LANG_DIR перед загрузкой языковых файлов, которые поставляются с плагином. При загрузке нескольких mo-файлов для одного и того же домена будет использоваться первый найденный перевод. Таким образом, языковые файлы, предоставляемые плагином, будут служить запасным вариантом для строк, не переведенных пользователем.

    public function load_plugin_textdomain()
    {
        $domain = 'my-plugin';
        // The "plugin_locale" filter is also used in load_plugin_textdomain()
        $locale = apply_filters( 'plugin_locale', get_locale(), $domain );
    
        load_textdomain( 
                $domain, 
                WP_LANG_DIR . '/my-plugin/' . $domain . '-' . $locale . '.mo' 
        );
        load_plugin_textdomain( 
                $domain, 
                FALSE, 
                dirname( plugin_basename(__FILE__) ) . '/languages/' 
        );
    }
    
    • 0
  5. Убедитесь, что плагины не генерируют ошибок с помощью WP_DEBUG

    Всегда проверяйте свои плагины с WP_DEBUG включенными и, в идеале, включите их на протяжении всего процесса разработки. Плагин не должен выдавать НИКАКИХ ошибок при WP_DEBUG включении. Сюда входят устаревшие уведомления и непроверенные индексы.

    Чтобы включить отладку, отредактируйте wp-config.php файл так, чтобы для WP_DEBUG константы было установлено значение true . Дополнительные сведения см. в Кодексе об отладке.

    • 0
  6. Первое использование существующих функций в ядре WordPress

    Если можете: используйте существующие функции, включенные в ядро ​​WordPress, вместо того, чтобы писать свои собственные. Разрабатывайте пользовательские функции PHP только в том случае, если в ядре WordPress нет подходящей функции.

    Одним из преимуществ является то, что вы можете использовать «журнал устаревших уведомлений», чтобы легко отслеживать функции, которые следует заменить. Еще одним преимуществом является то, что пользователи могут просматривать документацию по функциям в Кодексе и лучше понимать, что делает плагин, даже если они не являются опытными PHP-разработчиками.

    Связанный

    • 0
  7. Удаление должно удалить все данные плагина

    После удаления из установки WordPress плагин должен удалить все файлы, папки, записи базы данных и таблицы, которые он создал, а также значения параметров, которые он создал.

    Плагины могут предлагать возможность экспорта/импорта настроек, чтобы их можно было сохранить вне WordPress перед удалением.

    Связанный

    • 0
  8. Предотвращение SQL-инъекций с входными данными

    Плагин должен дезинфицировать весь пользовательский ввод, полученный прямо или косвенно (например, через $_POST или$_GET ), прежде чем использовать входные значения для запроса к базе данных MySQL.

    См.: Форматирование операторов SQL.

    • 0
  9. Префикс всех элементов глобального пространства имен

    Плагин должен правильно префиксировать ВСЕ элементы глобального пространства имен (константы, функции, классы, переменные, даже такие вещи, как пользовательские таксономии, типы сообщений, виджеты и т. д.). Например, не создавайте функцию с именем init() ; вместо этого назовите это что-то вроде jpb_init() .

    Его общий должен использовать префикс из трех или четырех букв перед именами или использовать функцию пространства имен PHP. Сравните: однобуквенный префикс для констант класса PHP?

    Связанный

    • 0
  10. Используйте классовый и объектно-ориентированный код PHP5

    Нет причин не писать чистый объектно-ориентированный код PHP5. Поддержка PHP4 будет прекращена после следующего выпуска (WP 3.1). Конечно, вы можете добавить префикс ко всем именам ваших функций, чтобы они заканчивались бесконечно_длинными_именами_функций_с_лотами_из_подчеркивания, но гораздо проще просто написать простой класс и объединить все в нем. Кроме того, поместите свой класс в отдельный файл и назовите его соответствующим образом, чтобы вы могли легко расширять и поддерживать его:

    // in functions.php
    require 'inc/class-my-cool-plugin.php';
    new MyCoolPlugin();
    
    // in inc/class-my-cool-plugin.php
    class MyCoolPlugin {
        function __construct() {
            // add filter hooks, wp_enqueue_script, etc.
    
            // To assign a method from your class to a WP 
            // function do something like this
            add_action('admin_menu', array($this, "admin"));
        }
    
        public function admin() {
            // public methods, for use outside of the class
            // Note that methods used in other WP functions 
            // (such as add_action) should be public
        }
    
        private function somethingelse() {
            // methods you only use inside this class
        }
    }
    
    • 0
  11. Деактивация не должна провоцировать потерю данных

    Плагин не должен удалять свои данные после деактивации.

    Связанный

    • 0
  12. Включайте только те файлы, которые вам нужны…

    Если вы работаете с интерфейсом, не включайте код, относящийся к области администрирования.

    • 0
  13. Объявить о потере данных при удалении плагина

    После удаления плагин должен сообщить пользователю, что он будет удалять свои данные, и получить подтверждение того, что пользователь согласен с удалением данных, прежде чем делать это, и плагин также должен разрешить пользователю сохранить данные после удаления. (Эта идея от @EAMann.)

    Связанный

    • 0
  14. Позвольте изменить имя папки плагина

    /плагины/название плагина/{разные}

    «Имя плагина», используемое для папки, всегда должно быть изменчивым.

    Обычно это решается путем определения констант и последовательного их использования во всем плагине.

    Излишне говорить, что многие популярные плагины являются грешниками.

    Связанный:

    • plugins_url() для удобства ссылок на ресурсы, входящие в состав плагина.
    • 0
  15. Используйте WordPress (встроенный) Обработка ошибок

    Не делайте этого только в том случае, return; если какой-то пользовательский ввод был неправильным. Сообщите им некоторую информацию о том, что было сделано неправильно.

    function some_example_fn( $args = array() ) 
    {
        // If value was not set, build an error message
        if ( ! isset( $args['some_value'] ) )
            $error = new WP_Error( 'some_value', sprintf( __( 'You have forgotten to specify the %1$s for your function. %2$s Error triggered inside %3$s on line %4$s.', TEXTDOMAIN ), '$args['some_value']', "\n", __FILE__, __LINE__ ) );
    
        // die & print error message & code - for admins only!
        if ( isset( $error ) && is_wp_error( $error ) && current_user_can( 'manage_options' ) ) 
            wp_die( $error->get_error_code(), 'Theme Error: Missing Argument' );
    
        // Elseif no error was triggered continue...
    }
    

    Одна ошибка (объект) на всех

    Вы можете настроить глобальный объект ошибки для вашей темы или плагина во время начальной загрузки:

    function bootstrap_the_theme()
    {
        global $prefix_error, $prefix_theme_name;
        // Take the theme name as error ID:
        $theme_data = wp_get_theme();
        $prefix_theme_name = $theme_data->Name;
        $prefix_error = new WP_Error( $theme_data->Name );
    
        include // whatever, etc...
    }
    add_action( 'after_setup_theme', 'bootstrap_the_theme' );
    

    Позже вы можете добавить неограниченное количество ошибок по запросу:

    function some_theme_fn( $args )
    {
        global $prefix_error, $prefix_theme_name;
        $theme_data = wp_get_theme();
        if ( ! $args['whatever'] && current_user_can( 'manage_options' ) ) // some required value not set
            $prefix_error->add( $prefix_theme_name, sprintf( 'The function %1$s needs the argument %2$s set.', __FUNCTION__, '$args['whatever']' ) );
    
        // continue function...
    }
    

    Затем вы можете получить их все в конце вашей темы. Таким образом, вы не прерываете рендеринг страницы и можете вывести все свои ошибки для разработки.

    function dump_theme_errors()
    {
        global $prefix_error, $prefix_theme_name;
    
        // Not an admin? OR: No error(s)?
        if ( ! current_user_can( 'manage_options' ) ! is_wp_error( $prefix_error ) )
            return;
    
        $theme_errors = $prefix_error->get_error_messages( $prefix_theme_name );
        echo '<h3>Theme Errors</h3>';
        foreach ( $theme_errors as $error )
            echo "{$error}\n";
    }
    add_action( 'shutdown', 'dump_theme_errors' );
    

    Вы можете найти дополнительную информацию в этом Q. Связанный тикет, чтобы исправить «совместную работу» WP_Error и wp_die() связан оттуда, и другой тикет последует. Комментарии, критика и тому подобное приветствуются.

    • 0
  16. Минимизация имен, добавленных в глобальное пространство имен

    Плагин должен максимально уменьшить свое влияние, минимизировав количество имен, которые он добавляет в глобальное пространство имен.

    Это можно сделать, инкапсулировав функции плагина в класс или используя функцию пространств имен PHP. Префикс всего также может помочь, но это не так гибко.

    Наряду с функциями и классами плагин не должен вводить глобальные переменные. Использование классов обычно делает их устаревшими и упрощает обслуживание плагинов.

    Связанный

    • 0
  17. Комментарий с использованием PhpDoc

    Лучшая практика близка к стилю PhpDoc. Если вы не используете такую ​​IDE, как «Eclipse», вы можете просто взглянуть на руководство по PhpDoc.

    Вам не нужно точно знать, как это работает. Профессиональные разработчики в любом случае могут читать код, и им просто нужно это как резюме. Программисты-любители и пользователи могут оценить, как вы объясните это на том же уровне знаний.

    • 0
  18. Используйте API настроек перед add_option

    Вместо того, чтобы добавлять параметры в БД с помощью функции add_option, вы должны хранить их в виде массива с помощью API настроек, который позаботится обо всем за вас.

    Используйте API модификаций тем перед add_option

    API модификаций — довольно простая конструкция и безопасный способ, позволяющий добавлять и извлекать параметры. Все сохраняется как сериализованное значение в вашей базе данных. Легко, безопасно и просто.

    • 0
  19. Защита конфиденциальности пользователей плагинов

    (ранее: анонимное общение через API)

    Если подключаемый модуль связывается с внешней системой или API (например, с каким-либо веб-сервисом), он должен делать это анонимно или предоставлять пользователю возможность анонимности, которая гарантирует, что никакие данные, относящиеся к пользователю подключаемого модуля, не будут бесконтрольно передаваться третьей стороне.

    • 0
  20. Хост-плагины на WordPress.org

    Используйте репозиторий SVN, предоставленный на WordPress.org, для размещения плагинов. Это облегчает взаимодействие с пользователем при обновлении, и если вы никогда раньше не использовали SVN, вы действительно поймете, используя его в контексте, который оправдывает это.

    • 0
  21. Обеспечение контроля доступа с помощью разрешений

    Во многих случаях пользователи могут не хотеть, чтобы все имели доступ к областям, созданным вашим плагином, особенно с плагинами, которые выполняют несколько сложных операций, одной жестко запрограммированной проверки возможностей может быть недостаточно.

    По крайней мере, у вас должны быть соответствующие проверки возможностей для всех видов процедур, для которых может использоваться ваш плагин.

    • 0
  22. Импорт/экспорт настроек плагина

    Это не так распространено среди плагинов, но если ваш плагин имеет (некоторые) настройки, он должен обеспечивать импорт/экспорт данных, таких как конфигурация и пользовательский ввод.

    Импорт/экспорт повышает удобство использования плагина.

    Примером плагина, который имеет такие функции импорта и экспорта (а также механизм отмены), является Breadcrumb NavXT (плагин WordPress) (полное раскрытие: небольшой код, написанный мной, большая часть была сделана mtekk).

    Связанный

    • 0
  23. Организуйте свой код

    Всегда трудно читать код, написанный не в том порядке, в котором он выполняется. Сначала включите/требуйте, определите, wp_enqueue_style & _script и т. д., затем функции, которые нужны плагину/теме, и, наконец, конструктор (например, экран администратора, элементы, которые интегрируются в тему, и т. д.).

    Попробуйте разделить такие вещи, как css и js, в их собственных папках. Также попробуйте сделать это с помощью вспомогательных функций, таких как сглаживание массивов и тому подобное. Сохранение «основного» файла как можно более чистым и легко читаемым — это способ, который помогает пользователям, разработчикам и вам, когда вы пытаетесь обновить через год и не видели код в течение более длительного времени.

    Также хорошо иметь структуру, которую вы часто повторяете, чтобы вы всегда находили выход. Разработка в известной структуре на разных проектах даст вам время сделать ее лучше, и даже если ваш клиент переключится на другого разработчика, вы никогда не услышите «он оставил хаос». Это создает вашу репутацию и должно быть долгосрочной целью.

    • 0
  24. Умереть со стилем

    умереть достойно Все плагины (и даже темы) функции должны использовать wp_die() в критических местах, чтобы предложить пользователю немного информации о том, что произошло. Ошибки PHP раздражают и wp_die могут дать пользователю красиво оформленное сообщение о том, что плагин (или они) сделали неправильно. Кроме того, если у пользователя деактивирована отладка, плагин просто сломается.

    Использование wp_die() также помогает, чтобы ваши плагины/темы были совместимы с набором тестов wordpress.

    Связанный:

    • 0
  25. Предоставление экранов справки для пользователей

    Лучше сказать RTFM (нажмите «помощь») в качестве ответа, чем снова и снова отвечать на вопрос.

    /**
      * Add contextual help for this screen
      * 
      * @param $rtfm
      * @uses get_current_screen
      */ 
      function ContextualHelp( /*string*/ $rtfm) 
      { 
         $current_screen = get_current_screen();
         if ($current_screen->id == $this->_pageid) 
         {
            $rtfm .= '<h3>The WordPress Plugin - Screen A</h3>';
            $rtfm .= '<p>Here are some tips: donate to me ' .
         }
         return $rtfm; 
      }
    add_action('contextual_help', array($this,'ContextualHelp'),1,1);
    

    обновление/примечание: (см. комментарии от kaiser): приведенный выше пример должен использоваться в классе

    • 0
  26. Предлагайте расширяемые формы

    Когда плагин предлагает возможность ввода данных, он всегда должен иметь хук в конце, прямо перед кнопкой «отправить» и/или «сбросить», чтобы разработчики могли легко расширить форму не только полями, но и кнопками.

    См.: API настроек

    Связанный

    • 0
  27. включить функцию всегда через хук, а не напрямую.

    Пример:

    • Не используйте для включения класса плагина через новый без хука

    • Используйте хук plugins_loaded

      // add the class to WP                                   
      function my_plugin_start() {                                                               
          new my_plugin();   
      }                                                        
      add_action( 'plugins_loaded', 'my_plugin_start' );
      

    Обновление: небольшой живой пример: Plugin-svn-trunk-page и псевдопример

    //avoid direct calls to this file where wp core files not present
    if (!function_exists ('add_action')) {
            header('Status: 403 Forbidden');
            header('HTTP/1.1 403 Forbidden');
            exit();
    }
    
    if ( !class_exists( 'plugin_class' ) ) {
        class plugin_class {
    
            function __construct() {
            }
    
        } // end class
    
        function plugin_start() {
    
            new plugin_class();
        }
    
        add_action( 'plugins_loaded', 'plugin_start' );
    } // end class_exists
    

    Вы также можете загрузить через mu_plugins_loaded при мультисайтовой установке, см. кодекс для ссылки на действие: http://codex.wordpress.org/Plugin_API/Action_Reference Также здесь вы видите, как включить wP с этим хуком: http://adambrown. info/p/wp_hooks/hook/plugins_loaded?version=2.1&file=wp-settings.php Я использую это очень часто, и это не так сложно и рано, лучше как жесткий новый класс();

    • 0
  28. Лицензионные плагины под лицензией, совместимой с GPL

    Плагины и темы должны иметь лицензию, совместимую с WordPress. Это позволяет распространять их вместе с WordPress как «программу». Рекомендуемая лицензия — GPL. Позаботьтесь о том, чтобы все библиотеки кода, включенные в подключаемый модуль, были совместимы с одной и той же лицензией.

    (Это было проблемой и предметом серьезных дискуссий как в прошлом, так и в настоящем.)

    • 0
  29. Описание вашего плагина должно точно описывать функции вашего плагина. Есть 10 избранных почтовых плагинов. Все они отображают избранные сообщения, но многие из них имеют разные функции. Должно быть легко сравнить ваш плагин с аналогичными плагинами, прочитав описание.

    Вы должны избегать хвастовства тем, насколько прост ваш плагин, если он действительно не очень простой. Вы должны включать в описание полезные ссылки, такие как ссылка на настройки.

    • 0
  30. Минимизация побочных эффектов удаленных источников данных и веб-сервисов

    Плагин должен кэшировать/защищать запросы веб-сервиса и/или XMLRPC/SOAP через уровень кэширования/поставщика данных, если вы используете их, чтобы не делать фронт-запросы, ожидающие (медленного) ответа веб-сервиса.

    Это включает в себя загрузку RSS-канала и других страниц. Разработайте свои плагины так, чтобы они запрашивали данные в фоновом режиме.

    Один из возможных ШАГОВ (в качестве примера возьмем публикацию на ping.fm): создайте буферную таблицу, скажем: ping_fm_buffer_post(дата, время, сообщение, представленное_время, статус)

    1. Каждый раз, когда вы хотите отправить обновление на ping.fm, добавляйте его в эту таблицу.
    2. Теперь нам нужно создать плагин для обработки этих данных. Этот плагин будет запускаться через crontab для проверки каждого еще не отправленного обновления.
    3. Поскольку у нас есть эта таблица, мы также можем перечислить все сообщения, отправленные на ping.fm, и проверить статус каждого сообщения. На всякий случай, если возникнут проблемы на стороне ping.fm, мы можем повторно отправить запрос.
    • 0
  31. Протестируйте свой плагин

    У нас обязательно должны быть какие-то инструменты тестирования в нашей среде разработки плагинов.

    Основываясь на этом ответе Итана Зайферта на тестовый вопрос, рекомендуется следовать следующим рекомендациям:

    • Ваше модульное тестирование должно проверять наименьшее количество поведения, которое может выполнить класс.
    • Когда вы дойдете до уровня функционального тестирования, вы сможете протестировать свой код с зависимостями WordPress.
    • В зависимости от того, что делает ваш плагин, рассмотрите возможность использования тестов на основе Selenium, которые проверяют наличие данных в DOM с помощью идентификаторов.
    • 0
  32. [url=https://loans-online-apply.com/]payday loans bad credit[/url]
    loans sam online payday
    [url=https://youloan24.com/]payday loan same day deposit[/url]
    cash advance
    [url=https://loanstoonline.com/]quick cash loan[/url]
    payday loan

    • 0

Оставить ответ

You must login to add an answer.