От автора: вы ищите пошаговую инструкцию по разработке плагинов для WordPress, в которой будут учтены все важные аспекты? Если да, то вам повезло. В этом уроке будет рассмотрена базовая информация, которую вам необходимо знать для того, чтобы спроектировать свой плагин, а также будут даны направления для изучения наилучших практик.
Что такое плагины WordPress?
Плагины это один из мощнейших инструментов WordPress. По существу, плагины это модули, которые вы подключаете к своему сайту для того, чтобы активировать новые функции или элементы. Функционал, который можно добавить, зависит от назначения плагина. Существует масса плагинов, от простых (добавляют новые стили или вносят небольшие изменения в тему) до сложных (значительные изменения, такие как eCommerce интеграция или соединение со сторонними источниками). Плагины отличаются от тем и работают независимо при помощи хуков, фильтров, шорткодов, виджетов и пользовательского кода.
Плюсы, минусы и рекомендации
Плагины – отличный инструмент, разработчики и администраторы сайтов получают расширенный и повторно используемый функционал. Несмотря на всю красоту, у плагинов есть свои сильные и слабые стороны. Плюсы:
Плагин можно добавить почти в любую тему, и он будет работать правильно. Плагины были разработаны, как модули, т.е. их можно копировать в новые проекты (или распространять их), что замечательно.
Плагины работают, как контейнеры для всего вашего кода и элементов. Если бы вам понадобилось разработать в теме схожий функционал, то он смешался бы с основным кодом. В плагинах же весь функционал находится в отдельном пакете.
Плагины легко создавать, а также можно воспользоваться хуками и экшенами из WordPress.
Плагины можно создавать по принципу ООП, что делает код более надежным и управляемым.
Минусы:
Ограниченный доступ к темам сайта. Плагин не может вставить код напрямую в любое место в теме. В теме должны быть специальные места, в которые можно вставить плагин, такие как место для основного контента или под виджеты.
Бывают конфликты плагинов. Иногда другие плагины (или вообще тема) могут негативно влиять на плагин, что может полностью разрушить пользовательский опыт от сайта (к примеру, вы использовали WordPress медиа загрузчик, который обновился и перестал поддерживать старый функционал, разрушая ваш плагин).
Ограниченный доступ к шаблонам и дизайнам. Плагины обязаны обеспечивать функционал, а темы – стили.
Основные понятия – Экшены, Фильтры, Шорткоды, Виджеты и т.д.
Давайте выделим немного времени и обсудим ключевые понятия в разработке плагинов. Вы, должно быть, уже знакомы с этими понятиями, если вы работали с темами WordPress. Однако четкое понимание принципов работы поможет вам создавать простой в использовании и легкий в обслуживании функционал.
Экшены (Хуки)
Action хук – определенный набор действий, выполняемый WordPress в определенный момент времени. При запуске экшена будут найдены все прикрепленные к нему функции, функции будут выполнены в необходимом порядке. В WordPress существуют десятки экшенов, охватывающие основной функционал. Каждому экшену присвоено уникальное имя. К примеру, когда WordPress сохраняет пост (это может быть пост, страница или другой тип контента), вызывается save_post экшен, который ищет все прикрепленные к нему функции.
Все экшены задаются функцией do_action(). Функция принимает следующие параметры:
$tag (обязателен)
$args (необязателен, одна или более переменных)
В общем, каждому экшену будет присвоено название (тег) и необязательное количество дополнительных полезных переменных (это могут быть множество переменных или ноль).
Простой WordPress экшен
Давайте рассмотрим хук save_post. Хук принимает четыре значения. Первое – имя экшена, остальные три являются дополнительными (в которых хранятся ID поста, сам объект поста и существование или обновление поста)
1 2 |
// save_post action hook do_action('save_post', $post_ID, $post, $update); |
Экшен можно настроить таким образом, что при сохранении поста будет выполняться какой-либо еще функционал, такой как отправка email или обновление базы данных.
Создание собственного экшена
В WordPress есть множество готовых экшенов, но вы можете создать свой. Свои экшены помогут вам вызывать свой собственный функционал точечно в любом месте темы или плагина. Воспользуемся функцией do_action() для создания своего нового экшена. Мы будем создавать экшен, который будет вызываться сразу после запроса title на страницах.
1 2 |
//создаем новый экшен, который будет вызываться после запроса title do_action('page_subtitle', $post); |
Сначала будет отображен page, будет показан title как обычно, и только потом будет вызван наш хук page_subtitle. WordPress проверит все прикрепленные к экшену функции и выполнит их (будет передана глобальная переменная $post, чтобы функция знала, подзаголовок какой страницы показывать).
Выполнение своих функций по вызову экшена
Для вызова определенной функции во время работы экшена необходимо использовать add_action() для прикрепления функции. add_action принимает следующие параметры.
$hook (обязательный)
$function_to_add (обязательный)
$priority (опциональный)
$accepted_args(опциональный, но обязателен если в экшен передается более одной переменной)
Используем обязательные аргументы
Функцию add_action можно вызвать, передав ей в качестве значений имя хука и вызываемой функции. Это простейший способ вызова экшена.
1 2 3 4 5 6 |
//когда 'save_post' работал, вызываем функцию сохранения add_action('save_post','save_my_custom_post'); //Создаем нашу функцию сохранения function save_my_custom_post($post_id){ //код } |
Как видно, при появлении save_post мы сразу же прикрепляем нашу функцию save_my_custom_post, тем самым получая возможность сделать что-то после сохранения.
Используем все аргументы (Понимание приоритета и значений accepted_args)
Иногда обязательных значений недостаточно. В таких случаях для работы экшена вам необходимо вручную задать значения переменных $priority и $accepted_args.
Приоритет в экшене определяет порядок выполнения функций. По умолчанию экшены используют значение 10 в качестве переменной $priority. Можно задать как большее, так и меньшее значение, чтобы запускать свою функцию раньше или позже. Очень полезна, когда ваша тема или плагин используют тот же хук (вы можете задать, когда функцию следует запустить).
Переменная accepted_args указывает на количество переменных, переданных при вызове add_action. Количество аргументов по умолчанию, принимаемых экшеном, равно единице. Если же ваш экшен принимает несколько переменных, вы обязаны сообщить WordPress, сколько их будет. Рассмотрим экшен save_post.
1 2 3 4 5 6 7 8 9 10 |
//экшен сохранения поста, задан в WordPress do_action( 'save_post', $post_ID, $post, $update ); //добавим свою функцию в 'save_post' hook, добавив приоритет и args add_action('save_post','save_my_page_extended,10,3); //функция выполняемая во время сохранения (нам нужны 3 переменные) function save_my_page_extended($post_ID, $post, $update){ //нам доступны все переменные } |
Экшен save_post содержит множество переменных, которые можно в него передать, мы должны задать приоритет и количество передаваемых переменных. Как только мы сообщили WordPress, что мы будем передавать несколько переменных, их можно добавить в нашу функцию, тем самым получая к ним доступ.
Обобщение
В общем и целом, вы будете использовать функцию do_action внутри темы или плагина для запуска кода в различных местах (задавая значения, доступные любой функции из хука). Для добавления своей функции необходимо использовать add_action. Свой экшен можно вызвать с минимальным набором параметров (имя экшена и функции, которую вы хотите вызвать), или же вы можете добавить приоритет и количество передаваемых переменных.
Фильтры (хуки)
Фильтра WordPress это хук, принимающий переменную (или их набор) и возвращающий ее обратно после определенной модификации. Фильтры часто используются для манипуляции информацией по умолчанию. В WordPress заложены десятки фильтров, созданных при помощи функции apply_filters(). Функция принимает следующие аргументы:
$tag (обязательный)
$value (обязательный)
$var (опциональный)
Переменная $tag – название фильтра. $value – переменная или значение, которое необходимо отфильтровать. Переменная $var необязательная, но с ее помощью можно передать дополнительное значение в функцию. Плагины и темы часто создают фильтры таким образом, что вы можете изменять элементы без необходимости вносить изменения в код. Фильтры часто заданы внутри функций.
Простой фильтр WordPress
get_the_excerpt – фильтр, который можно использовать внутри цикла постов для получения доступа к отрывкам статьи. Фильтр является частью ядра WordPress, задается только название фильтра и название функции. Опциональных аргументов нет.
1 2 |
//получаем выдержку из поста, как задано в /wp-includes/post-template.php echo apply_filters( 'the_excerpt', get_the_excerpt() ); |
К фильтру the_excerpt можно прикрепить свою функцию и манипулировать выдержкой поста перед ее возвращением (к примеру, можно обернуть текст в контейнер, изменить контент или урезать длину текста).
Создание своего фильтра
Рассмотрим пример. Если мы в плагине создаем массив имен, то их можно отфильтровать при помощи хука apply_filters. Данный хук скажет WordPress, что значения могут быть изменены любой функцией, прикрепленной к хуку.
1 2 3 4 |
//Фильтруем наш массив имен $name_values = apply_filters('filter_name_array_values', array('Joanna','Peter') ); |
Такой фильтр поможет другим разработчикам (или вам) динамически изменять значения. Вообще, если вы пишите функцию или какой-либо другой функционал, создание фильтров считается хорошей практикой. С помощью фильтров мы расширяем элементы.
Выполнение своего фильтра
Для запуска своего фильтра необходимо вызвать функцию add_filter(). Функция принимает следующие аргументы:
$tag (обязательный)
$function_to_add (обязательный)
$priority (опциональный)
$accepted_args (опциональный, но обязательный при передаче нескольких аргументов)
Функция add_filter работает так же, как и add_action. Задается название вызываемого фильтра, название вызываемой функции. Посмотрим, как можно использовать данную функцию для фильтрации массива имен, созданного в предыдущем примере.
1 2 3 4 5 6 |
//Изменяем сохраненные значения имен во время фильтрации function add_new_names($names){ $names[] = 'Simon'; return $names; } add_filter('filter_name_array_values','add_new_names'); |
Как можно заметить, мы прикрепили функцию add_new_names к нашему фильтру filter_name_array_values. Функция принимает всего одну переменную $names. Когда мы задали наш фильтр выше при помощи apply_filters, мы установили значения по умолчанию Joanna и Peter для массива.
Наша функция взяла существующие значения (для простоты мы их назвали $names) и добавили новое значение Simon в конец массива.
В конце мы возвращаем все значения. Возвращать значения очень-очень важно, иначе все сломается. Причина в том, что любая прикрепленная к фильтру функция тоже получит эти значения. Если вы их не вернете, функциям не с чем будет работать.
Обобщение
Функция apply_filters используется для создания фильтров внутри тем или плагинов (в них передаются значения, которые необходимо отфильтровать). Для прикрепления своей собственной функции используется add_filter, с помощью чего можно манипулировать фильтруемым значением.
Шорткоды
Более подробно о шорткодах можно почитать в shortcode API на странице WordPress Codex или в предыдущей моей статье Кастомные шорткоды WordPress. Текст ниже будет кратким обобщением, которое поможет вам начать работать с шорткодами.
Так как ваши плагины, как правило, не имеют доступа к файлам темы, вам нужен способ отображать свой функционал конечному пользователю, и в то же время необходимо обеспечить легкую настройку для администратора.
Шорткоды это отличный способ решения данной проблемы. С их помощью разработчики могут создавать сложный функционал, который можно изменить при помощи простых значений и атрибутов. Шорткоды добавляются в визуальный редактор (или куда-то еще), и при просмотре их пользователями выполняется ваш код. Шорткод в редакторе:
На front-end стороне будет отображена кнопка:
Быстрый урок по шорткодам
Шорткод создается при помощи функции add_shortcode(). Первый передаваемый аргумент это название (name) шорткода, второй output_function. Функция output_function принимает три значения; attributes, content и name. Внутри функции создается сам шорткод и возвращается на экран. Параметры функции более подробно мы рассмотрим в нашем примере, пока что не будем обращать на них внимания. Рассмотрим простой пример:
1 2 3 4 5 6 7 8 |
//Добавляем шорткод add_shortcode('test_shortcode','my_shortcode_output'); //выводим на экран function my_shortcode_output($atts, $content = '', $tag){ $html = ''; $html .= '<p>Hello World</p>'; return $html; } |
Теперь когда мы добавили наш шорткод [test_shortcode] в редактор, он будет запускать нашу функцию и конвертировать результат в <p>Hello World</p>.
Виджеты
Если вы хотите более подробно изучить виджеты, сначала ознакомьтесь с WordPress Widget API codex. На этой странице говорится о том, что вам необходимо, а также на данной странице вы найдете задокументированные рабочие примеры. Виджеты крайне важный инструмент, так как это еще один способ выполнения кода плагинов, и в то же время интерфейс их использования очень прост. Пример шорткода с набором конфигураций.
Так как в большинстве тем поддерживается один или несколько сайдбаров, свой виджет даст ваш быстрый способ отображения вашей информации в теме. Виджеты сложнее шорткодов, однако следуют тем же самым принципам – задаются параметры для отображения, а затем она отображаются на front-end стороне.
Краткое введение в виджеты
Чтобы создать виджет, вам необходимо унаследовать класс WP_Widget. В WordPress был реализован ООП подход к созданию виджетов, они существуют как класс; данный класс необходимо наследовать или расширить для добавления своего функционала. Рассмотрим базовый пример виджета:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
//класс нашего виджета class my_widget extends WP_widget{ //конструктор (задает базовые элементы виджета) public function __construct(){ parent::__construct( 'my_widget', // Base ID 'My Widget', // Name array( 'description' => 'An awesome widget') // Args ); add_action('widgets_init',array($this,'register_widget')); } //отображение на стороне front-end public function widget($args,$instance ){ echo $args['before_widget']; echo $instance['title']; echo $args['after_widget']; } //back-end сторона public function form($instance){ $title = (isset($instance['title']) ? $instance['title'] : ''); echo '<input type="text" id="' . $this->get_field_id('title') . '" name="' . $this->get_field_name('title') . '" value="' . $title . '"/>'; } //сохранение public function save($new_instance, $old_instance){ $instance = array(); $title = $new_instance['title']; return $instance; } //регистрация виджета в WordPress public function register_widget(){ register_widget('my_widget'); } } $my_widget = new my_widget; |
Данный код создаст базовый виджет, в котором можно сохранить текстовое значение и отобразить его на экране. Как видно ниже вид не самый интересный.
Классы (Объектно-ориентированное проектирование)
Объектно-ориентированное проектирование (ООП) это техника разработки, в которой функционал строится вокруг концепции классов. Классы это способ хранения функций и значений внутри одного объекта, они дают вам единую точку разработки. Общая цель ООП это создание объекта, выполняющего ваш функционал.
Плагины – отличный кандидат для ООП, так как это модули, создающиеся для выполнения определенных задач на вашем веб-сайте. В плагинах обычно содержатся свои CSS и JS файлы наряду с возможными изображениями и дополнительными PHP файлами. ООП облегчит ваш процесс разработки. Наш пример виджета будет полностью объектно-ориентированным.
Следующие шаги
В данной статье было рассмотрено множество основных понятий, необходимых для разработки плагинов для WordPress. Следите за выходом следующей статьи, где мы полностью разберем код реального примера.
Автор: Simon Codrington
Источник: //www.sitepoint.com/
Редакция: Команда webformyself.
Комментарии (1)