Как сделать WordPress Плагин Расширяемый

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

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

Вот типичный сценарий: Вы, наконец, обнаружили, что плагин, который делает все, что вам нужно — за исключением одной крошечной важной вещи. Существует нет настройки или опции, чтобы включить эту крошечную вещь, так что вы просматриваете документацию и обнаружите, что вы не можете ничего с этим поделать. Вы запрашиваете функцию в форуме поддержки плагина WordPress — но не кости. В конце концов, вы удалить его и продолжить поиск.

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

Идеально было бы реализовать его. Но если функция была для очень специального случая использования, то добавлять его было бы непрактично. Это не было бы хорошо иметь плагин настройки, что только 0,1% ваших пользователей будет использовать для.

Вы хотите реализовать только функции, которые затрагивают большинство пользователей. В действительности, 80% пользователей используют 20% функций (правило 80/20). Таким образом, убедитесь, что любая новая функция является весьма востребованы, и что 80% ваших пользователей выиграют от него, прежде чем реализовать его. Если вы создали настройки для каждой функции, которая запрашивается, то ваш плагин станет сложным и раздутым — и никто не хочет этого.

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

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

Что делает плагин расширяемым?

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

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

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

Типичный пример плагина

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

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


function get_some_post_titles() {
  $args = array(
      'posts_per_page' => 3,
  );

  $posts = get_posts( $args );

  $output = '
    '; foreach ( $posts as $post ) { $output .= '
  • ' . $post->post_title . '
  • '; } $output .= '
'; return $output; }

В то время как этот код работает и выполняет работу, он не совсем разлиён.

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

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

В том числе сто настроек не является ответом

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

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

Что делать, если пользователь хочет сделать любой из следующих (сценарии мы вернемся позже):

  • отображение продуктов или сообщений WooCommerce из определенной категории;
  • отобразить предметы в карусели, предоставленные другим плагином, а не в виде простого списка;
  • выполнить пользовательский запрос базы данных, а затем использовать эти сообщения запроса в списке.

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

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

Итак, как мы будем решать эту проблему? Мы бы сделали плагин выдыхаемым.

Добавление наших собственных крючков, чтобы сделать его расширяемым

Изучая код плагина выше, мы видим несколько операций, которые выполняет основная функция:

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

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

В общем, это хорошие области, чтобы добавить крючки для плагина:

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

Типичный пример расширяемого плагина

Принимая эти правила, мы можем добавить следующие фильтры, чтобы сделать наш плагин расширяемым:

  • добавить myplugin_get_posts_args для изменения get_posts аргументов,
  • добавить myplugin_get_posts для переопределения результатов, get_posts
  • добавить myplugin_list_item для настройки генерации ввода списка,
  • добавить myplugin_get_some_post_titles для переопределения возвращенного генерируемого списка.

Вот код снова со всеми крючками, добавленными в:


function get_some_post_titles() {
  $args = array(
      'posts_per_page' => 3,
  );

  // Let other people modify the arguments.
  $posts = get_posts( apply_filters( 'myplugin_get_posts_args', $args ) );

  // Let other people modify the post array, which will be used for display.
  $posts = apply_filters( 'myplugin_get_posts', $posts, $args );

  $output = '
    '; foreach ( $posts as $post ) { // Let other people modify the list entry. $output .= '
  • ' . apply_filters( 'myplugin_list_item', $post->post_title, $post ) . '
  • '; } $output .= '
'; // Let other people modify our output list. return apply_filters( 'myplugin_get_some_post_titles', $output, $args ); }

Вы также можете получить код выше в архиве GitHub.

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

Namespacing и контекст для крючков

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

  • Мы именовании крючки с myplugin_ .
    Это гарантирует, что имя крючка не противоречит крючку какого-то другого плагина. Это просто хорошая практика, потому что если другой крюк с тем же именем называется, это может привести к нежелательным эффектам.
  • Мы также передавая ссылку $args на во всех крючков для контекста.
    Я делаю это так, что если другие используют этот фильтр, чтобы изменить что-то в потоке кода, они могут использовать этот параметр в $args качестве ссылки, чтобы получить представление о том, почему крючок был вызван, так что они могут выполнять свои корректировки соответственно.

Эффекты наших крючков

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

  • Если пользователь хочет отобразить продукты WooCommerce или сообщения из определенной категории,то либо они могут использовать фильтр, myplugin_get_posts_args чтобы добавить свои собственные аргументы, когда плагин запросы должности, или они могут использовать, myplugin_get_posts чтобы полностью переопределить сообщения с их собственными Список.
  • Если пользователь хочет отобразить элементы в карусели, предоставляемые другим плагином,а не как простой список, то они могут переопределить весь выход функции с myplugin_get_some_post_titles , и вместо этого вывести карусели оттуда.
  • Если пользователь хочет выполнить пользовательский запрос базы данных, а затем использовать публикации этого запроса в списке, то, подобно первому сценарию, он может использовать myplugin_get_posts для использования собственного запроса базы данных и изменения массива публикаций.

Гораздо лучше!

Быстрый пример того, как использовать наши фильтры

Разработчики могут использовать add_filter для подключения к нашим фильтрам выше (или использовать для add_action действий).

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

add_filter( 'myplugin_get_posts_args', 'show_only_woocommerce_products' );
function show_only_woocommerce_products( $args ) {
   $args['post_type'] = 'product';
   return $args;
}

Мы также можем использовать крючки действий

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

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

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

«Отлично! Но почему я должен заботиться о том, чтобы мой плагин расширяемый?

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

Он открывает плагин для более возможности настройки

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

Это позволяет людям вносить изменения, не касаясь кода плагина

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

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

Заключение

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

Взгляните на плагины, такие как WooCommerce, Easy Digital Загрузки и ACF. Эти плагины расширяются, и вы можете легко сказать, потому что многие другие плагины в WordPress плагины каталог добавить функциональность к ним. Они также обеспечивают широкий спектр действий и фильтр крючки, которые изменяют различные аспекты плагинов. Правила большого пальца я перечислил выше пришли в моем исследовании о них.

Вот несколько вынос, чтобы сделать ваш плагин расширяемым:

  • Следуйте принципу открытого/закрытого. Другие люди не должны ототрачить код, чтобы что-то изменить.
  • Чтобы сделать ваш плагин расширяемым, добавьте крючки в этих местах:
    • вокруг и в рамках основных процессов,
    • при создании вывода HTML,
    • для изменения запросов должности или базы данных,
    • перед возвращением значений из функции.
  • Namespace имена ваших крючков с именем вашего плагина, чтобы предотвратить конфликты именования.
  • Попробуйте передать другие переменные, которые связаны с крючком, так что другие люди получают некоторый контекст того, что происходит в крючке.
  • Не забудьте задокументировать крючки вашего плагина, чтобы другие люди могли узнать о них.

Дальнейшее чтение

Вот некоторые ресурсы, если вы хотите узнать больше о расширении плагинов:

Источник: smashingmagazine.com

Великолепный Журнал

Великолепный, сокрушительный, разящий (см. перевод smashing) независимый журнал о веб-разработке. Основан в 2006 году в Германии. Имеет няшный дизайн и кучу крутых авторов, которых читают 2 млн человек в месяц.

Добавить комментарий

%d такие блоггеры, как: