Руководство для начинающих по добавлению собственных хуков

Привет, друзья!

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

Хотите что-то сделать, как только опубликовано сообщение? Хотите изменить длину анонса? Хотите создать свою собственную страницу просмотра страниц? Найти правильный хук (hook) — это все, что вам нужно.

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

Ко мне часто поступают вопросы про хостинг, которым я пользуюсь и поэтому решил указать хостинг в статье https://sprinthost.ru. Вы можете попробовать попользоваться хостингом 30 дней бесплатно. Чтобы понять, как будет работать Ваш сайт на этом хостинге просто перенести свой сайт (в этом поможет поддержка хостинга бесплатно) и и таким образом сможете понять подходит хостинг Вам или нет. На этом хостинге находятся сайты с 20 000 тысяч посещаемость и сайты чувствуют себя отлично. Рекомендую! Да, если делать оплату на 1 год то получаете скидку 25%. И что мне нравится - тех. поддержка всегда помогает в технических вопросах, за что им спасибо. Как Вы понимаете не всегда проходит всё гладко и нет желания, чтобы сайт не был доступен тем самым страдал трафик и доход.

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

Руководство для начинающих по добавлению собственных хуков

Почему нам нужны хуки

Чтобы показать вам, как выглядят удивительные хуки, давайте рассмотрим пример из реального мира: Advanced Custom Fields. Этот плагин позволяет добавлять гибкие поля пользовательских данных в сообщения: мы говорим о Google Maps, числовых полях, множественном выборе и многом другом.

Все это делается с помощью приятного пользовательского интерфейса, все, что вам нужно сделать, это использовать такие функции, как get_field() или the_field() во фронтенде. Все пойдет нормально.

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

Если ACF (Advanced Custom Fields) не имеет хуков, это будет сложно сделать, вам может понадобиться использовать механизм вне ACF, чтобы сохранить это поле. К счастью, мы охвачены acf/save_post действием. Вы можете использовать это действие для изменения $_POST данных до его сохранения — идеальное время для конвертации цены в рубли.

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

Как хуки работают внутри

Чтобы создать наши собственные хуки, мы сделаем именно то, что WordPress делает внутри — используем функции do_action() и apply_filters() для выполнения всех подключенных функций. Давайте обратимся к исходному коду WordPress, чтобы увидеть, как они работают.

WordPress использует wp_trim_excerpt() — внутреннюю функцию для создания анонса. В WordPress 4.1 эта функция определена в wp-includes/formatting.php, начиная с строки 2542. Если обратить внимание на строку 2560, вы должны увидеть следующее:

$excerpt_length = apply_filters ('excerpt_length', 55);

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

add_filter ('excerpt_length', 'zacompom_a_excerpt', 20);
zacompom_a_excerpt ($length) {
    return $ length - 10;
}

add_filter ('excerpt_length', 'zacompom_b_excerpt', 32);
zacompom_b_excerpt ($length) {
    return 104;
}

add_filter ('excerpt_length', 'zacompom_c_excerpt', 16);
zacompom_c_excerpt ($length) {
    return 20;
}

В конце концов длина анонса будет составлять 104 слова. Фильтры выполняются в порядке очередности. Поэтому сначала выполняется функция zacompom_c_excerpt. Если никакая другая функция не была подключена, длина теперь будет 20 слов. Затем функция zacompom_a_excerpt вступает в силу, и длина становится 10 слов. Наконец, функция zacompom_b_excerpt срабатывает, делая длину 104 слова.

do_action() использует тот же самый механизм, выполняющий все функции, связанные с хуком, определяемым как первый параметр.

Обратите внимание, что этот шаблон полностью закрыт, он не зависит от каких-либо специальных определений. Вы можете использовать do_action( ‘lol_hook’ ) где угодно, в худшем случае, никакие функции не привязаны к lol_hook. Другими словами, у нас уже есть инфраструктура для создания собственных хуков!

Создание собственных хуков

Как я упоминал выше, все, что нам нужно сделать, это обязательно использовать do_action() и/или add_filter и обязательно документировать его. Таким образом, кодеры и пользователи действительно узнают, что они есть.

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

    $args = array (
    'post_type' => 'attachment',
    'post_status' => 'any',
    'orderby' => 'date',
    'order' => 'DESC',
    'posts_per_page' => 10,
    'fields '=>' ids '
);
$images = new WP_Query ($args);
$gallery = '[' .'gallery ids = "'. implode (', ', $images).' ''. ']';
echo do_shortcode ($gallery);

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

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

$posts_per_page = apply_filters( 'my_gallery/posts_per_page', 10 );

В этом случае вам нужно будет использовать $posts_per_page переменную в массиве. Возможно, лучшим решением было бы изменить весь массив. Это позволит другим плагинам (или вам, в будущем) добавлять категории, теги и другие ограничения на галереи — вот полный код:

    $args = array (
    'post_type' => 'attachment',
    'post_status' => 'any',
    'orderby' => 'date',
    'order' => 'DESC',
    'posts_per_page' => 10,
    'fields '=>' ids '
);

$args = apply_filters ('my_gallery / query_args', $args);

$images = new WP_Query ($args);
$gallery = '[' .'gallery ids = "'. implode (', ', $images).' ''. ']';
echo do_shortcode ($gallery);

Вот и все. Другие плагины теперь могут использовать хук my_gallery/query_args для изменения функциональности созданных галерей.

Замечание об именовании: передняя косая черта вообще не нужна. Вы можете использовать «my_plugin_query_args» или любой другой формат, который вы хотите. Я предпочитаю косую черту, потому что в ней четко говорится о создании плагина и его функциональных возможностях.

И в заключении

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

Вместо того, чтобы добавлять хук в order, post status, post_type и posts_per_page по отдельности, я добавил фильтр, который может модифицировать сразу весь массив. В другие куски данных может не иметь смысла добавлять хуки, это в конечном счете зависит от вас.

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

До скорых встреч!


Обо мне
Юрич:
Занимаюсь созданием сайтов на WordPress более 6 лет. Ранее работал в нескольких веб-студиях и решил делиться своим опытом на данном сайте. Пишите комментарии, буду рад общению.

Заказать сайт