Завершающие советы по разработке дополнений для WordPress

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

Советы по разработке дополнений для WordPress

  • стандарты кода WordPress;
  • как избежать конфликтов имён в глобальном пространстве имён (префиксы и классы);
  • комментарии в коде;
  • безопасность.

Больше советов по разработке дополнений для WordPress

  • правильный способ добавления скриптов и стилей (register, enqueue и localize);
  • AJAX-вызовы;
  • фильтры и события.

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

1. Отладка

Самое первое, что вы должны сделать, прежде чем начать писать код плагина – разрешить отладку, как это рекомендует документация WordPress. Так вы увидите всё, что происходит в системе: ошибки, предупреждения, информацию интерпретатора.

Чтобы разрешить отладку, добавьте в ваш файл wp-config.php следующий код:

define('WP_DEBUG', true);

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

Если вы хотите сохранить данные об ошибках в файле вместо их вывода в браузер, вы можете добавить к объявлению WP_DEBUG следующие директивы:

// all errors will be saved to a debug.log log file inside the /wp-content/ directory
define('WP_DEBUG_LOG', true);

// not display errors in HTML
define('WP_DEBUG_DISPLAY', false);

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

define('SAVEQUERIES', true);

Обычно я использую все эти настройки (особенно последнюю) совместно с плагинами Debug Bar и Debug Bar Console. Если вы ещё не знаете о них, попробуйте сразу их установить и начать использовать при отладке плагина или темы. Вы увидите, как это упростит работу.

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

2. Документация

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

Я рекомендую разделять документацию на секции или разделы, самые важные из которых должны освещать следующие вопросы:

  • установка;
  • настройка;
  • краткое руководство по использованию;
  • часто возникающие вопросы;
  • требования.

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

Если ваш плагин создаёт фильтры или функции обратного вызова, их описание лучше вынести на отдельные страницы.

Вкладки

Вкладки в справке – отличный способ помочь пользователям в работе с плагином или темой, не перенаправляя их на другой сайт. Обычно информация в этих вкладках зависит от контекста текущей страницы:

Вкладки

Например, один из моих плагинов, Social PopUP, использует вкладку справки, чтобы объяснить использование шорткодов:

Вкладки - 2

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

/**
 * Initialize the plugin by loading admin scripts & styles and adding a
 * settings page and menu.
 *
 * @since     1.0.0
 */
function __construct(){
    [...]
    //Help Tab
    add_action( 'load-post.php',  array( $this, 'my_admin_add_help_tab') );
}

/**
 * Add help tab to the spucpt post type
 * @since  1.0
 * @return void
 */
function my_admin_add_help_tab () {

    $screen = get_current_screen();

    if( 'spucpt' != $screen->id ) {
        return;
    }

    // Add my_help_tab if post type is spucpt
    $screen->add_help_tab( array(
        'id'        => 'my_help_tab',
        'title'     => __( 'Shortcodes' ),
        'content'   => 'Hello content goes here',
    ) );
}

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

Для добавления справки на страницу опций вы можете воспользоваться кодом, который приведён как образец в кодексе WordPress:

<?php 
add_action('admin_menu', 'my_admin_add_page');
function my_admin_add_page() {

    $my_admin_page = add_options_page( __( 'My Admin Page', 'map' ), __( 'My Admin Page', 'map' ), 'manage_options', 'map', 'my_admin_page' );

    // Adds my_help_tab when my_admin_page loads
    add_action( 'load-' . $my_admin_page, 'my_admin_add_help_tab' );
}

function my_admin_add_help_tab () {

    $screen = get_current_screen();

    // Add my_help_tab if current screen is My Admin Page
    $screen->add_help_tab( array(
        'id'        => 'my_help_tab',
        'title'     => __( 'My Help Tab' ),
        'content'   => '<p>' . __( 'Descriptive content that will show in My Help Tab-body goes here.' ) . '</p>',
    ) );
}
?>

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

3. Интернационализация

Интернационализация (AKA i18n, потому что между первой “i” и последней “n” в слове “Internationalization” помещается ровно 18 букв) – это вишенка на торте, символизирующем качественный программный продукт.

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

В чём разница между интернационализацией и локализацией?

Интернационализация (i18n) – это процесс построения программного продукта, который может быть без проблем переведён на другие языки. Локализация (l10n) – собственно процесс перевода.

Как WordPress поддерживает перевод?

WordPress использует популярную библиотеку gettext, работу которой можно кратко описать так:

  • разработчики оборачивают переводимые строки в вызов специальной функции;
  • специальные утилиты разбирают код, выделяют из него строки, нуждающиеся в переводе, и сохраняют их в файлах формата POT (Portable Object Template);
  • переводчики работают с POT-файлами, а результат их работы выражается в PO-файлах (тот же POT, только с переводом);
  • PO компилируется в бинарный формат MO для ускорения доступа к строкам во время выполнения программы.

Как создавать переводимые строки?

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

Есть несколько способов создать переводимые строки в зависимости от способа их использования: используется ли строка как переменная, выводится ли на экран при помощи echo и т. д. Наиболее часто используемыми функциями-обёртками являются __() и _e(). Давайте рассмотрим их применение на конкретных примерах:

// creating a variable
$hello =  __( 'Hello, Im a translatable string', 'my-text-domain' );

echo '<h2>'. __( 'Hello, Im a translatable string', 'my-text-domain' ) . '</h2>';

// to do an echo you can use
_e( 'Hello, Im a translatable string', 'my-text-domain' );

// When you have variables in the string you do:
printf( __( 'We deleted %d posts.', 'my-text-domain' ), $count );

// Or multiple variables
printf( __( 'Your name is %1$s, and your last name is %2$s.', 'my-text-domain' ), $name, $lastname );

Другая полезная функция – _n() – используется для множественного числа. Эта функция принимает 4 аргумента:

  • singular – форма единственного числа;
  • plural – форма множественного числа;
  • count – количество объектов, которое определяет, какая форма будет использована;
  • text domain – идентификатор text-domain.

Если вернуться к предыдущему примеру, то переписать его с применением _n() можно следующим образом:

printf( _n( 'We deleted one post.', 'We deleted %d posts.', $count, 'my-text-domain' ), $count );

Если вам придётся переводить строки, используемые в JavaScript, вы можете передать их туда при помощи функции wp_localize_script(), которую мы обсуждали во второй статье данного цикла:

wp_enqueue_script( 'script-handle', … );
wp_localize_script( 'script-handle', 'objectL10n', array(
    'alert'         => __( 'This is an alert message', 'my-text-domain' ),
    'submit'        => __( 'Submit', 'my-text-domain' ),
) );

Включение перевода плагина

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

function myplugin_init() {

    $plugin_dir = basename( dirname( __FILE__ ) );
    load_plugin_textdomain( 'my-text-domain', false, $plugin_dir );
}
add_action( 'plugins_loaded', 'myplugin_init' );

Этот код будет пытаться загрузить из каталога вашего плагина MO-файл с именем my-text-domain-{locale}.mo. Часть {locale} будет заменена на код языка в зависимости от языковых настроек файла wp_config.php. Например, если мой язык настроен так:

define ('WPLANG', 'es_ES');

файл, который WordPress попытается загрузить, будет называться my-text-domain-es_ES.po. С темами дело обстоит примерно так же, плюс необходимо добавить в файл functions.php такой код:

load_theme_textdomain( 'my_theme_textdomain' );

Основное отличие состоит в том, что система будет искать файл {locale}.mo вместо my-text-domain-{locale}.mo, как в предыдущем примере.

Дополнительные сведения об i18n содержатся в Кодексе WordPress.

Заключение

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

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

Буду рад, если вы примете участие в обсуждении этой серии статей.

РедакцияПеревод статьи «Final Tips for Best Practices in WordPress Development»