WordPress: Использование хуков фильтров
Помимо добавления функциональности или контента, часто нужно работать с контентом иным образом. Например модифицировать или удалять его частично или полностью перед тем тем как он будет показан пользователю на странице. Данную возможность в WordPress предоставляют так называемые filter хуки. filter хуки - это второй тип хуков в WordPress. Напомню, что нам уже известен один вид хуков: action. В этом рецепте мы напишем плагин, который будет использовать filter хук для модификации заголовков страниц, а конкретно он будет добавлять к заголовку текущей страницы тип контента этой самой страницы.
- Перейдите в каталог плагинов WordPress: wp-content/plugins
- Создайте новую директорию для плагина под названием title-filter
- Зайдите в директорию плагина и создайте php-файл: title-filter.php
-
Откройте ваш новый файл в текстовом редакторе и добавьте необходимый комментарий-заголовок назвав плагин "Title Filter"
<?php /* Plugin Name: Title Filter Plugin URI: Description: Page Title Filter Version: 1.0 Author: Somebody Author URI: http://xxxxxx.xx/ License: GPLv2 */
-
Добавьте следующую строку кода, которая прикрепит функцию к хуку
wp_title,
который выполняется когда WordPress подготавливает заголовок страницы (title)
перед выводом его в тег head страницы:
add_filter( 'wp_title', 'title_filter' );
-
Далее добавим реализацию прикрепленной callback-функции:
function title_filter( $title ) { // Установим в заголовок тип контента if ( is_front_page() ) $new_title = 'Front Page >> '; elseif ( get_post_type() == 'page' ) $new_title = 'Page >> '; elseif ( get_post_type() == 'post' ) $new_title = 'Post >> '; if ( isset( $new_title ) ) { return $new_title . $title; } return $title; }
- Сохраняем файл
- Идем в админку нашего сайта во вкладку Plugins
- Находим наш плагин в списке и активируем его
Если вы все сделали правильно, то увидите что ваши заголовки страниц приняли вид: ТИП >> ЗАГОЛОВОК
Как это работает...
Функция add_filter используется для того что бы вы могли подцеплять к хукам типа filter свои callback-функции. Хуки типа filter позволяют плагинам изменять, дополнять, удалять или полностью менять данные в процессе их подготовки WordPress - ом перед тем как он отдаст их пользователю. Для этого в callback-функции хуков фильтров должны принимать аргумент - данные с которыми нужно будет что-то сделать.
Про функции filter-хуков удобно думать так как будто это действительно некие фильтры в которые втекают и вытекают данные, с которыми в этих фильтрах что то происходит.
В отличии от callback-функций action - хуков в callback-функциях filter-хуков желательно воздержаться от непосредственно вывода данных в поток при помощи инструкция типа print, echo и т.п. т.к. работа этих функций происходит до того момента как содержимое будет полностью готово для отправки пользователю то результаты могут быть непредсказуемы и ожидаемая строка, которую вы выведете с помощью echo например, в итоге может оказаться где угодно на странице. Вместо этого callback-функции filter-хуков обязаны вернуть результат своей работы при помощи инструкции return.
При более детальном взгляде можно заметить сходство функции add_filter с уже знакомой нам функцией add_action, с которой мы познакомились ранее:
add_filter( $hook_name, $your_function_name, [$priority], [$accepted_args] );
Первый параметр - это строка, имя хука, к которому привяжется пользовательская функция. Это имя нужно постараться написать без ошибок; в противном случае наша функция не будет вываться, и к тому же мы не увидим никакого сообщения об ошибке - помните об этом факте.
Вторым параметром является имя callback-функции, которая будет вызываться при инициализации хука. Эта функция может иметь любое имя, с единственным условием - оно должно быть уникальным, чтобы избежать коллизий с именами функций из других плагинов, или из кода WordPress. В этом рецепте имя функции строится из имени плагина, что делает его более-менее уникальным.
Параметр priority является необязательным (заключен в квадратные скобки) и имеет значение по умолчанию - 10. Это приоритет выполнения привязанной callback-функции относительно других функций, привязанных к этому же хуку.
В любом плагине можно зарегистрировать одну или более callback-функции на нужный filter hook, с помощью функции add_filter. Функции навешенные на один и тот же хук ставятся в очередь. Так вот параметр priority - делает эту очередь приоритетной.
Если вам нужно, чтобы ваша функция вызывалась до или после других функций, навешенных на этот же хук - измените значение параметра priority.
Последний параметр: accepted_args, имеет значение по умолчанию 1. Ему всегда должно быть присвоено число. Этот параметр устанавливает число аргументов, которые будут переданы привязанной callback-функции. Если вы будете использовать фильтры, которые передают много параметров в callback-функции, то вы должны явно указать их число в этом параметре.
Помимо демонстрации того как изменить заголовок страницы этот наш плагин так же демонстрирует как можно использовать некоторые WordPress функции-условия и WordPres функции-запросы.
Функция is_front_page очень удобна, когда нужно сделать так что бы код выполнялся только на фронтенде, но не в админке (или наоборот с инвертированием результата). Эта функция вернет Boolean true или false и её очень удобно использовать в операторах-условиях.
Помимо posts, pages и пользовательских типов постов, WordPress может отображать множество информации на сайте. Для создания плагинов, которые будут адаптироваться ко всем этим типам контента, функция get_post_type может быть очень удобна, она возвращает тип WordPress поста.
Так же по аналогии с функцией do_action для action хуков, для filter хуков так же существует функция явного вызова на выполнение всех прикрепленных хуку функций это функция : apply_filters
apply_filters( $tag, $value, $var ... );Данный функционал так же по аналогии с функцией do_action позволит вам использовать свои собственные типы фильтров и инициировать их выполнение тогда, когда вам это потребуется.
Предыдущие статьи этого цикла: