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

Запуск сообщества wiki для сбора целей лучших практик для разработки плагинов. Этот вопрос был вдохновлен комментариями EAMann о wp-хакерах .

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

ОБНОВЛЕНИЕ: . Увидев первые несколько ответов, становится ясно, что нам нужно иметь только одну идею /предложение /лучшую практику на каждый ответ, и люди должны просмотреть список, чтобы убедиться, что дубликатов нет размещение.

125 голосов | спросил 3 revs, 2 users 100%
MikeSchinkel
1 Jam1000000amThu, 01 Jan 1970 03:00:00 +030070 1970, 03:00:00

30 ответов


65

Использование действий и фильтров

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

  

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

     

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

     

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

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

  

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

Похожие

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
52

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

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

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

Связанные

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
48

Поддержка I18n

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

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

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

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

Так как WordPress 4.6 +

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

Учитывая плагин с текстовым доменом «my-plugin», WordPress теперь ПЕРВЫЙ ищет файл перевода в:
/wp-content/languages/plugins/my-plugin-en_US.mo

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

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

Первая проверка была добавлена ​​в 4.6 и дает пользователям определенное место для добавления языкового файла, так как раньше им нужно было знать, где разработчик добавил языковой файл, теперь пользователю просто нужно знать текстовый домен плагина: /wp-content/languages/plugins/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/' 
    );
}
ответил bueltge 13 PM000000100000002831 2010, 22:12:28
44

Убедитесь, что плагины не генерируют ошибок с помощью WP_DEBUG

Всегда проверяйте свои плагины с помощью WP_DEBUG включился и в идеале включил его в течение всего процесса разработки. Плагин не должен бросать ЛЮБЫЕ ошибки с помощью WP_DEBUG. Это включает устаревшие уведомления и непроверенные индексы.

Чтобы включить отладку, отредактируйте файл wp-config.php, чтобы константа WP_DEBUG была установлена ​​в true. Подробнее см. Codex on Debug .

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
39

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

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

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

Связанные

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
32

Предотвращение внедрения SQL с входными данными

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

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

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
32

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

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

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

Похожие

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
29

Префикс Все объекты глобального пространства имен

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

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

Связанные

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
29

Использовать код PHP5, ориентированный на класс и объект

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

// 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
    }
}
ответил bueltge 13 PM000000100000002831 2010, 22:12:28
24

Деактивация не должна вызывать потерю данных

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

Связанные

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
22

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

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

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
20

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

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

Связанные

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
18

Изменить имя папки плагина

/плагин /pluginname /{различных}

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

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

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

Связанные:

  • plugins_url() для удобной связи с ресурсами, включенными в плагин.
ответил bueltge 13 PM000000100000002831 2010, 22:12:28
18

Использовать 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() связан оттуда, и следующий билет будет следовать. Комментарии, критики и amp; такое оценивается.

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
17

Свернуть имена, добавленные в глобальное пространство имен

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

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

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

Связанные

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
16

Защита пользователей подключаемых модулей

(ранее: анонимная связь API)

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

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
16

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

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

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

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
16

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

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

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

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

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
14

Плагины хоста на WordPress.org

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

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
14

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

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

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

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
12

Настройки модуля импорта /экспорта

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

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

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

Связанные

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
12

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

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

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

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

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
11

Умрите со стилем

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

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

Связанный:
ответил bueltge 13 PM000000100000002831 2010, 22:12:28
10

Предложение расширяемых форм

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

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

Похожие

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
10

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

Лучше сказать 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);

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

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
9

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

Пример:

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

  • Использовать плагины Hook_loaded

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

Update: небольшой живой пример: плагин-svn-trunk-страница и псевдо-пример

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

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
8

Лицензионные плагины под совместимой лицензией GPL

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

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

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
8

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

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

ответил bueltge 13 PM000000100000002831 2010, 22:12:28
7

Минимизировать побочные эффекты удаленных источников данных и веб-сервисов

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

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

Один из возможных STEP - это (например, отправьте сообщение на ping.fm): Создайте буферную таблицу, скажем: ping_fm_buffer_post ( дата, время, сообщение, submit_time, статус )

  1. Для каждого раза, когда вы хотите отправить обновление на ping.fm, добавьте его в эту таблицу.
  2. Теперь нам нужно создать плагин для обработки этих данных. Этот плагин будет работать через crontab, чтобы проверять каждое обновление, которое еще не отправлено.
  3. Поскольку у нас есть эта таблица, мы также можем перечислить каждое сообщение, отправленное на ping.fm, и проверить статус каждого сообщения. На всякий случай, если на стороне ping.fm есть проблема, мы можем повторно отправить его.
ответил bueltge 13 PM000000100000002831 2010, 22:12:28
7

Проверьте свой плагин

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

На основе этого ответа Ethan Seifert в тестовый вопрос, это хорошая практика:

  • Тестирование вашего модуля должно проверять наименьшее количество действий, которые может выполнять класс.
  • Когда вы дойдете до уровня функционального тестирования, вы можете проверить свой код на зависимости Wordpress.
  • В зависимости от того, что делает ваш плагин, рассмотрите возможность использования тестов на основе Selenium, которые проверяют наличие данных в DOM с помощью идентификаторов
ответил bueltge 13 PM000000100000002831 2010, 22:12:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132