WordPress: Использование хуков фильтров

WordPress: Использование хуков фильтров

Помимо добавления функциональности или контента, часто нужно работать с контентом иным образом. Например модифицировать или удалять его частично или полностью перед тем тем как он будет показан пользователю на странице. Данную возможность в WordPress предоставляют так называемые filter хуки. filter хуки - это второй тип хуков в WordPress. Напомню, что нам уже известен один вид хуков: action. В этом рецепте мы напишем плагин, который будет использовать filter хук для модификации заголовков страниц, а конкретно он будет добавлять к заголовку текущей страницы тип контента этой самой страницы.

  1. Перейдите в каталог плагинов WordPress: wp-content/plugins
  2. Создайте новую директорию для плагина под названием title-filter
  3. Зайдите в директорию плагина и создайте php-файл: title-filter.php
  4. Откройте ваш новый файл в текстовом редакторе и добавьте необходимый комментарий-заголовок назвав плагин "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
    */
    
    
  5. Добавьте следующую строку кода, которая прикрепит функцию к хуку wp_title, который выполняется когда WordPress подготавливает заголовок страницы (title) перед выводом его в тег head страницы:
        add_filter( 'wp_title', 'title_filter' );
    
  6. Далее добавим реализацию прикрепленной 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;
    }
    
  7. Сохраняем файл
  8. Идем в админку нашего сайта во вкладку Plugins
  9. Находим наш плагин в списке и активируем его

Если вы все сделали правильно, то увидите что ваши заголовки страниц приняли вид: ТИП >> ЗАГОЛОВОК

Как это работает...

Функция 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 позволит вам использовать свои собственные типы фильтров и инициировать их выполнение тогда, когда вам это потребуется.

Предыдущие статьи этого цикла:

  1. WordPress: С чего начинаются плагины
  2. WordPress: Добавление контента в тег head страниц
  3. WordPress: Функции для работы с путями

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


Защитный код
Обновить



Кто на сайте
Сейчас 189 гостей онлайн