Целевая рекомендация по разработке плагинов? [закрыто]
Запуск сообщества wiki для сбора целей лучших практик для разработки плагинов. Этот вопрос был вдохновлен комментариями EAMann о wp-хакерах .
Идея состоит в том, чтобы сотрудничать в отношении того, какие объективные передовые методы могут быть такими, чтобы мы могли в конечном итоге использовать их в процессе обзора совместной работы сообщества.
ОБНОВЛЕНИЕ: . Увидев первые несколько ответов, становится ясно, что нам нужно иметь только одну идею /предложение /лучшую практику на каждый ответ, и люди должны просмотреть список, чтобы убедиться, что дубликатов нет размещение.
30 ответов
Использование действий и фильтров
Если вы думаете, что люди хотели бы добавить или изменить некоторые данные: обеспечить apply_filters () перед возвратом .
P.S. Одна вещь, которую я нахожу немного разочаровывающей, и что ваши вопросы - это процент плагинов, которые предназначены только для конечных пользователей, т. Е. У них нет собственных крючков. Представьте, что WordPress был разработан как большинство плагинов? Это было бы негибким и очень нишевым решением.
Может быть, все будет по-другому, если WordPress должен иметь возможность автоматически устанавливать плагины, от которых зависели другие плагины? Как правило, мне приходится писать много функций, которые мне нужны с нуля, потому что клиенты хотят что-то определенным образом и доступные плагины, а 90% - не позволяют мне обновлять оставшиеся 10%.
Я действительно хочу, чтобы те, кто возглавлял сообщество WordPress, определяли способ гарантировать, что плагины вознаграждаются за использование лучших практик (например, добавление крючков для других разработчиков), так как хорошие ответы вознаграждаются на сайте StackExchange.
Возьмем пример из другого вопроса :
Пример. Я хочу что-то сделать в своем плагине, когда кто-то перепродает статью. Если бы был какой-то пользовательский крючок, каким бы популярным плагином для ретвитта я не мог подключиться и не сработал, это было бы здорово. Это не так, поэтому я могу изменить их плагин, чтобы включить его, но это работает только для моей копии, и я не хочу пытаться перераспределять его.
Похожие
Загрузить скрипты /CSS с помощью wp_enqueue_script
и wp_enqueue_style
Плагины не должны загружать /пытаться загружать повторяющиеся версии файлов JS /CSS, особенно jQuery и другие JS-файлы, включенные в WP Core.
Плагины всегда должны использовать wp_enqueue_script
и wp_enqueue_style
при связывании файлов JS и CSS и никогда напрямую с помощью тегов <script>
.
Связанные
Поддержка 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/'
);
}
Убедитесь, что плагины не генерируют ошибок с помощью WP_DEBUG
Всегда проверяйте свои плагины с помощью WP_DEBUG
включился и в идеале включил его в течение всего процесса разработки. Плагин не должен бросать ЛЮБЫЕ ошибки с помощью WP_DEBUG
. Это включает устаревшие уведомления и непроверенные индексы.
Чтобы включить отладку, отредактируйте файл wp-config.php
, чтобы константа WP_DEBUG
была установлена в true
. Подробнее см. Codex on Debug .
Первое использование существующих функций в ядре WordPress
Если вы можете: использовать существующие функции, включенные в ядро WordPress , вместо того, чтобы писать свои собственные. Только разрабатывайте пользовательские функции PHP, если в ядре WordPress не существует соответствующей ранее существовавшей функции.
Одно из преимуществ - вы можете использовать "устаревшие уведомления журнала" , чтобы легко отслеживать функции, которые необходимо заменить. Еще одно преимущество: пользователи могут просматривать документацию по функциям в Codex и лучше понимать, что делает плагин, даже если они не являются опытным разработчиком PHP.
Связанные
Предотвращение внедрения SQL с входными данными
Плагин должен дезинформировать все входные данные, полученные прямо или косвенно (например, через $_POST
или $_GET
) перед использованием входных значений для запроса базы данных MySQL.
Удаление должно удалить все данные плагина
После удаления из установки WordPress плагин должен удалить все созданные файлы, папки, записи в базе данных и таблицы , а также значения , которые он создал .
Плагины могут предлагать возможность экспорта /импорта параметров, поэтому настройки можно сохранить за пределами WordPress до удаления.
Похожие
Префикс Все объекты глобального пространства имен
Плагин должен правильно префикс ВСЕХ глобальных элементов пространства имен (константы, функции, классы, переменные, даже такие вещи, как пользовательские таксономии, типы сообщений, виджеты и т. д.). Например, не создавайте функцию с именем init()
; вместо этого назовите его что-то вроде jpb_init()
.
Его общий должен использовать префикс из трех или четырех букв перед именами или использовать Функция пространства имен PHP . Сравните: Однобуквенный префикс для констант класса PHP?
Связанные
Использовать код 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
}
}
Деактивация не должна вызывать потерю данных
Плагин не должен удалять любые его данные после деактивации .
Связанные
Включите только те файлы, которые вам нужны ...
Если вы находитесь в интерфейсе, не включайте код, относящийся к области администрирования.
Объявить об утрате данных при удалении плагинов
При удалении плагин должен запросить пользователя, что он будет удалять его данные , и получить подтверждение того, что пользователь в порядке с удалением данные перед этим и плагин должны также разрешить пользователю сохранять данные при удалении. (Эта идея от @EAMann.)
Связанные
Изменить имя папки плагина
/плагин /pluginname /{различных}
«pluginame», используемый для папки, всегда должен быть изменен.
Обычно это обрабатывается путем определения констант и последовательного использования их во всем плагине.
Излишне говорить, что многие популярные плагины - грешники.
Связанные:
-
plugins_url()
для удобной связи с ресурсами, включенными в плагин.
Использовать 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; такое оценивается.
Свернуть имена, добавленные в глобальное пространство имен
Плагин должен уменьшить его влияние как можно больше на , минимизируя количество имен, добавляемых в глобальное пространство имен .
Это можно сделать, инкапсулируя функции плагина в класс или используя Функция пространств имен PHP . Префикс все может помочь, но не так гибко.
Рядом с функциями и классами плагин не должен вводить глобальные переменные. Использование классов обычно устаревает, и это упрощает обслуживание плагинов.
Связанные
Защита пользователей подключаемых модулей
(ранее: анонимная связь API)
Если подключаемый модуль взаимодействует с внешней системой или API (например, с некоторым веб-сервисом), он должен делать это анонимно или предоставлять пользователю анонимную опцию, которая гарантирует, что никакие данные, связанные с пользователем плагина, не будут протекать на второй неконтролируемая сторона.
Комментарий с использованием PhpDoc
Лучшая практика близка к стилю PhpDoc. Если вы не используете IDE, например «Eclipse», вы можете просто взглянуть на на PhpDoc Руководство .
Вам не обязательно точно знать, как это работает. Профессиональные разработчики могут читать код в любом случае и просто нуждаются в этом как резюме. Кодировщики хоста и пользователи могут оценить, как вы объясните это на том же уровне знаний.
Используйте API настроек перед add_option
Вместо добавления параметров в БД с помощью функции add_option вы должны хранить их как массив с помощью API настроек , который заботится обо всем для вас.
Используйте API модификаций темы перед add_option
API модификаций - довольно простая конструкция и безопасный способ, позволяющий добавлять и извлекать параметры. Все будет сохранено как сериализованное значение в вашей базе данных. Легкий, безопасный и amp; простой.
Плагины хоста на WordPress.org
Используйте репозиторий SVN при условии на WordPress.org для размещения плагинов. Это упрощает обновление пользователей, и если вы никогда раньше не использовали SVN, вам действительно нужно понять, используя его в контексте, который его оправдывает.
Обеспечить контроль доступа с помощью разрешений
Во многих случаях пользователи могут не желать, чтобы у каждого был доступ к областям, созданным вашим плагином, особенно с плагинами, которые выполняют несколько сложных операций, одной проверки жестко запрограммированной функции может быть недостаточно.
По крайней мере, у вас есть соответствующие проверки работоспособности для всех различных типов процедур, для которых ваш плагин может использоваться.
Настройки модуля импорта /экспорта
Это не так распространено среди плагинов, но если ваш плагин имеет (некоторые) настройки, он должен предоставлять импорт /экспорт данных, таких как конфигурация и пользовательский ввод .
Импорт /Экспорт улучшает удобство использования плагина.
Пример-плагин с такими функциями импорта и экспорта (а также механизм отмены) Breadcrumb NavXT (Wordpress Plugin) (полное раскрытие: какой-то маленький код у меня там, большинство было сделано mtekk).
Связанные
Организуйте свой код
Всегда трудно прочитать код, который не написан в том порядке, в котором он выполняется. Сначала укажите /require, define, wp_enqueue_style & _script и т. д., то функции, которые требуется плагину /теме, и, наконец, строитель (например, экран администратора, материал, который интегрируется в тему и т. д.).
Попробуйте разделить такие вещи, как css и js, в своих собственных папках. Также попробуйте сделать это с помощью функций, которые являются только помощниками, такими как сплиттеры массивов и тому подобное. Сохранение «основного» файла как чистого и легкого для чтения, насколько это возможно, помогает пользователям, разработчикам и вам, когда вы пытаетесь обновить через год и больше не видели код в течение более длительного времени.
Также хорошо иметь структуру, которую вы часто повторяете, поэтому вы всегда найдете свой путь. Разработка в известной структуре в разных проектах даст вам время, чтобы сделать ее лучше, и даже если ваш клиент переключится на другого разработчика, вы никогда не услышите «он оставил хаос». Это создает вашу репутацию и должно быть долгосрочной целью.
Умрите со стилем
умереть достойно
Все функции плагинов (и даже темы) должны использовать wp_die()
в критических местах, чтобы предоставить пользователю небольшую информацию о том, что произошло. Ошибки Php раздражают, а wp_die
может дать пользователю приятное стилизованное сообщение о том, что плагин (или они) сделал неправильно. Кроме того, если пользователь отключил отладку, плагин просто сломается.
Использование wp_die()
также помогает вашим плагинам /темам совместимо с wordpress testsuite .
Предложение расширяемых форм
Когда плагин предлагает возможность ввода данных, он должен всегда иметь крючок в конце, прямо перед кнопкой «отправить» и /или «сбросить», чтобы разработчики могли легко расширить форму не только полями, но и кнопок.
Смотрите: API настроек
Похожие
Предоставление экранов справки для пользователей
Лучше сказать 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): приведенный выше пример должен использоваться в классе
включить функцию всегда через 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 Я использую это очень часто, и это не так сложно и рано, лучше, как жесткий новый класс ();
Лицензионные плагины под совместимой лицензией GPL
Плагины и темы должны быть лицензированы в соответствии с лицензией, совместимой с WordPress. Это позволяет им перераспределять с WordPress как «программу». Рекомендуемая лицензия GPL . Следите за тем, чтобы все библиотеки кода, входящие в состав подключаемого модуля, были совместимы с той же лицензией.
(Это было проблемой и серьезным пункт обсуждения и в прошлом, и present .)
Ваше описание плагина должно точно детализировать функции вашего плагина. Есть 10 популярных плагинов. Все они отображают сообщения, но многие из них имеют разные функции. Это должно быть легко сравнить ваш плагин с похожими плагинами, прочитав описание.
Вам следует избегать хвастовства о том, насколько простым является ваш плагин, если он действительно не очень простой. Вы должны включить полезные ссылки в описание, как ссылку на настройки.
Минимизировать побочные эффекты удаленных источников данных и веб-сервисов
Плагин должен Cache /Shield Webservice и /или XMLRPC /SOAP-запросы через уровень кэширования /передачи данных , если вы используете их поэтому не делать запросы на фронт, ожидающие (медленного) ответа веб-службы.
Это включает загрузку RSS-канала и других страниц. Создайте свои плагины, чтобы они запрашивали данные в фоновом режиме.
Один из возможных STEP - это (например, отправьте сообщение на ping.fm): Создайте буферную таблицу, скажем: ping_fm_buffer_post ( дата, время, сообщение, submit_time, статус )
- Для каждого раза, когда вы хотите отправить обновление на ping.fm, добавьте его в эту таблицу.
- Теперь нам нужно создать плагин для обработки этих данных. Этот плагин будет работать через crontab, чтобы проверять каждое обновление, которое еще не отправлено.
- Поскольку у нас есть эта таблица, мы также можем перечислить каждое сообщение, отправленное на ping.fm, и проверить статус каждого сообщения. На всякий случай, если на стороне ping.fm есть проблема, мы можем повторно отправить его.
Проверьте свой плагин
Мы должны окончательно иметь некоторые инструменты тестирования в нашей среде разработки плагинов.
На основе этого ответа Ethan Seifert в тестовый вопрос, это хорошая практика:
- Тестирование вашего модуля должно проверять наименьшее количество действий, которые может выполнять класс.
- Когда вы дойдете до уровня функционального тестирования, вы можете проверить свой код на зависимости Wordpress.
- В зависимости от того, что делает ваш плагин, рассмотрите возможность использования тестов на основе Selenium, которые проверяют наличие данных в DOM с помощью идентификаторов