Добавление кастомных хуков в WordPress: Custom Filters

Сегодня мы поговорим о системе хуков в WordPress. Мы рассмотрим хуки действий и фильтры, и их роль в развитии WordPress.

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

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

Смотрите также:

  • Добавление кастомных хуков в WordPress: Custom Actions
  • Советы для начинающих разработку веб-сайта на WordPress
  • Руководство по кастомным типам записей WordPress
  • Custom Post Types: пользовательские таксономии, фильтры и архивы в WordPress
  • Что такое Форматы записей в WordPress и для чего они нужны
  • Что следует знать о форматах записей в WordPress

Приступим!

Освежим в памяти

В предыдущей статье на эту тему мы увидели, как хуки являются внедрением событийно-ориентированной архитектуры. Мы выделили пару моментов:

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

И потом на примере содержимого мы увидели, как это действует на WordPress. Мы рассказали о его преимуществах и о внедрении собственных хуков действия.

К тому же, мы узнали о тонком различии:

Хуки действий предназначены для работы с функциональностью, а фильтры – с данными.

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

До того, как мы начнём, необходимо убедиться, что наша среда разработки настроена и готова к работе.

Приступим

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

  • wordpress
  • Веб-сервер
  • Копия PHP
  • База данных

В основном Apache, PHP и MySQL можно без проблем установить без труда. Если вы опытный посетитель, то можете использовать что-то типа Nginx и альтернативную базу данных. Если это так – прекрасно, но в этом руководстве мы будем использовать наш начальный список.

Понимание фильтров в WordPress

WordPress Codex предлагает полный набор ресурсов для тех, кто хочет узнать всё о фильтрах. Как мы говорили, он даёт такое определение фильтрам:

Пользовательские Фильтры отличаются от пользовательских Действий, так как пользовательские Действия могут вам добавить или удалить код из существующих Действий. А пользовательские Фильтры могут вам заменить конкретные данные(к примеру, переменную), находящиеся в существующем Действии.

Но если вам интересен весь список доступных фильтров на WordPress, то обязательно посетите эту страницу в Codex. У многих фильтров есть ссылка на собственную страницу с документацией.

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

Немного о приоритетах и настройках

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

Как пример можно без труда использовать следующую строку кода:

add_filter( 'author_edit_pre', 'filter_function_name', 10, 2);

Это говорит нам о 4 вещах:

  1. Имя фильтра – это то, к чему мы подсоединяемся
  2. Имя возможности – это то, что должно быть вызвано
  3. Приоритет, когда функцию должна быть вызвана
  4. Число настроек, которые должна принять функцию

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

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

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

Работа с фильтрами

Перед началом работы с фильтрами, давайте создадим собственный файл в корне директории темы Twenty Sixteen. Мы назовём файл tutsplus-filters.php. А в файл functions.php мы добавим следующую строчку кода:

include_once( get_template_directory(). '/tutsplus-filters.php');

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

Фильтрация контента поста

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

Это похоже на принцип работы хуков действий WordPress, но тут меняются данные, а не поведение.

1. Регистрация нашего фильтра

Для регистрации нашего фильтра надо знать 2 вещи:

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

Поскольку мы собираемся настроить содержимое записи, то мы можем использовать фильтр the_content. Суть возможности заключается в следующем — Она принимает один аргумент, контент записи, может нам поменять его, и потом возвращает его пользователю.

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

Давайте назовём нашу пользовательскую возможность tutsplus_the_content, а потом зарегистрируем её на WordPress.

add_filter( 'the_content', 'tutsplus_the_content');function tutsplus_the_content( $content) { return $content;}

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

2. Изменение содержимого

Давайте заставим возможность настроить данные. Для этого необходимо:

  1. Убедится, что запись можно посмотреть в отдельном окне
  2. Добавить сообщение вверх записи, где сообщается, что содержимое записи был изменён

Это не лучший метод использовать фильтр, но зато вы поймёте, как вы можете без труда менять возможность.

Вот так должен выглядеть код. Обратите внимание на комментарии в коде:

add_filter( 'the_content', 'tutsplus_the_content');function tutsplus_the_content( $content) { // Don't proceed with this function if we're not viewing a single post. if(! is_single()) { return $content; } // First, define the message to be displayed.    $html.= '<p>';        $html.= 'This is a custom message created by a hooked function.';    $html.= '</p>';     // Now prepend it to the content.    $content = $html.= $content;     return $content;}

Если вы посмотрите на основную страницу блога, то все записи будут выглядеть стандартно, без изменений. Но если вы зайдете отдельно на страницу записи, то увидите, что вверху появилась новая фраза:

This is a custom message created by a hooked function.

А сейчас давайте сделаем что-то более продвинутое. Давайте удалим все гласные из содержимого поста. Прежде чем вернём его на WordPress.

Для этого используем следующий программный код:

add_filter( 'the_content', 'tutsplus_the_content');function tutsplus_the_content( $content) {     // Don't proceed with this function if we're not viewing a single post.    if(! is_single()) {        return $content;    }     // First, remove all of the vowels from the content using a regular expression.    $content = preg_replace( '$[aeiou]$i', '', $content);     // Then, define the message to be displayed.    $html.= '<p>';        $html .= 'This is a custom message created by a hooked function.';    $html .= '</p>';     // And now prepend it to the content.    $content = $html .= $content;     return $content;}

Вставив код, сохраните изменения и зайдите на любую запись в WordPress.

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

Вот так будет выглядеть финальный результат:

add_filter( 'the_content', 'tutsplus_the_content' );function tutsplus_the_content( $content ) {     // Don't proceed with this function if we're not viewing a single post.    if ( ! is_single() ) {        return $content;    }     $content = _tutsplus_strip_vowels( $content );    $content = _tutsplus_add_message( $content );     return $content;} function _tutsplus_strip_vowels( $content ) {    return preg_replace( '$[aeiou]$i', '', $content );} function _tutsplus_add_message( $content ) {     $html .= '<p>';        $html .= 'This is a custom message created by a hooked function.';    $html .= '</p>';     return ( $html . $content );}

И снова, внедрение фильтра – это не самое практичное и полезное, что вы можете сделать, но это показывает, что мы можем делать, когда настраиваем наши собственные возможности.

Определение пользовательских фильтров

Запросто использовать существующие фильтры. Как мы говорили ранее, без труда вызвать add_filter, указав название фильтра, а далее название возможности, которую мы хотим вызвать для фильтра данных.

Но что если мы хотим создать наш собственный фильтр? Наверное, мы хотим создать фильтр, который сделает все буквы в нашем посте строчными? Или фильтр, который удалит все гласные из записи?

Понимание apply_filters

И вот тут мы начинаем интересоваться apply_filters . Эта конкретная функцию принимает 2 аргумента:

  1. тэг, который определяет название хука фильтра
  2. значение, которое относится к значению применения фильтра

Примером может послужить get_the_content в ядре WordPress, вы можете заметить, что он передает особое значение the_content_more_link через apply_filters.

Это полезно знать, но как же нам определить наш собственный пользовательский фильтр, который все смогут применить через apply_filters?

Добавление наших собственных фильтров

Добавить наши собственные фильтры без труда. Нам необходимо определить те же 4 вещи, которые мы описали выше:

  1. Название фильтра
  2. Возможность, которую должен вызвать фильтр
  3. Приоритет возможности
  4. Число аргументов, которых он должен принять

Давайте начнём с простого примера.

Сделать все буквы строчными

Во-первых, мы хотим дать фильтру приоритет 10. Мы знаем, что он примет всего один аргумент, контент, так что мы пропустим номер 1 при добавлении фильтра:

add_filter( 'tutsplus_lowercase_all', 'tutsplus_lowercase_all_callback', 10, 1 );

Далее мы определим тело простой возможности, которая использует возможность PHP strtolower для понижения регистра, не важно при этом, какое значение было передано, и возвращаем её.

function tutsplus_lowercase_all_callback( $content ) {    return strtolower( $content );}

Конечная версия кода будет выглядеть так:

add_filter( 'tutsplus_lowercase_all', 'tutsplus_lowercase_all_callback', 10, 1 );function tutsplus_lowercase_all_callback( $content ) {    return strtolower( $content );} add_filter( 'the_content', 'tutsplus_the_content' );function tutsplus_the_content( $content ) {     // Don't proceed with this function if we're not viewing a single post.    if ( ! is_single() ) {        return $content;    }     return apply_filters( 'tutsplus_lowercase_all', $content );}

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

Удаление всех гласных

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

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

Вот фильтр, который вызывается сам по себе:

add_filter( 'tutsplus_remove_vowels', 'tutsplus_remove_vowels_callback', 10, 1 );function tutsplus_remove_vowels_callback( $content ) {    return preg_replace( '$[aeiou]$i', '', $content );} add_filter( 'the_content', 'tutsplus_the_content' );function tutsplus_the_content( $content ) {     // Don't proceed with this function if we're not viewing a single post.    if ( ! is_single() ) {        return $content;    }     return apply_filters( 'tutsplus_remove_vowels', $content );}

Вызов всех фильтров вместе

Наконец, можно легко вызывать apply_filters много раз:

add_filter( 'tutsplus_remove_vowels', 'tutsplus_remove_vowels_callback', 10, 1 );function tutsplus_remove_vowels_callback( $content ) {    return preg_replace( '$[aeiou]$i', '', $content );} add_filter( 'tutsplus_lowercase_all', 'tutsplus_lowercase_all_callback', 10, 1 );function tutsplus_lowercase_all_callback( $content ) {    return strtolower( $content );} add_filter( 'the_content', 'tutsplus_the_content' );function tutsplus_the_content( $content ) {     // Don't proceed with this function if we're not viewing a single post.    if ( ! is_single() ) {        return $content;    }     return apply_filters( 'tutsplus_lowercase_all',                    apply_filters( 'tutsplus_remove_vowels', $content )                 );}

Заметьте, что это достигает тех же результатов, что и предыдущий пример. Есть ещё и иные методы, но целью данного руководства было научить вас, как написать собственный фильтр и как применить apply_filters в работе.

Итоги

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

Не бойтесь экспериментировать с кодом, который мы вам предоставили.

Источник: code.tutsplus.com

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *