Исследуем фильтры в WordPress: Вступительная часть

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

В основе этого способа лежат хуки - фильтры и действия WordPress. Без них мы не сможем воспользоваться расширяемостью WordPress в полной мере. В этой серии статей мы остановимся на фильтрах для WP - одном из лучших методов настройки для этой CMS. Серия состоит из семи частей. В них все наше внимание мы сосредоточим на следующем:

  • определим понятия WordPress-фильтра;
  • рассмотрим методы их внедрения в систему;
  • приведем примеры использования (в статье, которую вы читаете сейчас);
  • изучим 50 WordPress – фильтров (по десять в каждой статье) с примерами;
  • и напишем итоговую статью, в которой резюмируем проведенную работу.

Есть буквально сотни WordPress-фильтров в ядре и эти 50 примеров только малая часть из них (около 10%), так что вы сами можете добавить что-то из того списка и предложить примеры использования новых фильтров.

В любом случае, время для введения в WordPress-фильтры настало. Давайте начнем!

Что такое WordPress - фильтр

В Кодексе WordPress фильтрам дано следующее определение:

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


Итак, фильтр это функция на php, которая записывается в стек вызовов встроенной системы фильтров WordPress. Но в себе она может содержать сторонние функции и другие конструкции. Фильтр является одним из двух видов хуков (hooks) в WordPress. Второй - действие (action), но это предмет для другой серии статей.

Возможно, эта тема покажется вам сложной, но фильтры (как и действия) очень легко понять. Вначале моего знакомства с этими понятиями мне самому показалось все довольно сложным и запутанным, но, увидев, насколько они просты, я познакомился с сотнями фильтров и действий, просто изучая кодекс WordPress или копаясь в исходном коде. Определенно, вам также стоит узнать о сотнях фильтров. Но для начала вы должны научиться их использовать.

Используем фильтры в WordPress

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

В этой статье мы собираемся проделать четыре вещи:

  • Создадим функцию фильтра;
  • Сделать из нее хук;
  • Убрать функцию из фильтра;
  • Создать свой собственный фильтр.

Создаем функцию и прикрепляем ее к фильтру

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

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

Сложно? На самом деле, нет. В приведенном ниже примере, мы напишем код функции, которая удаляет гласные во всем тексте:

<?php

function remove_the_vowels( $title ) {
    $title = preg_replace( '/[aeiou]/i', '', $title );
    return $title;
}

?>

Функция берет строку заголовка $title, удаляет гласные и возвращает строку. Довольно просто, верно? Теперь прыгнем на уровень выше, сделаем хук, и прицепим его к фильтру:

<?php

function remove_the_vowels( $title ) {
    $title = preg_replace( '/[aeiou]/i', '', $title );
    return $title;
}

add_filter( 'the_title', 'remove_the_vowels' );

?>

Заметили новую функцию? Взглянем на add_filter():

<?php

add_filter( $tag, $function_to_add, $priority, $accepted_args );

?>
  • $tag (обязательный параметр) – имя фильтра;
  • $function_to_add (обязательный параметр) – имя функции для хука;
  • $priority (опция) – Целое число для определения момента исполнения функции. По умолчанию равно 10: Функция сработает раньше, если вы снизите значение, и позже, если вы повысите его;
  • $accepted_args (опция) - Значение, нужное чтобы определить количество аргументов, которые пропускает фильтр. Значение по умолчанию равно1.

Удаляем фильтр

Конечно же, мы также можем убрать функцию, прикрепленную к фильтру. Для этого используем функцию remove_filter(). И смотрим, как она работает:

<?php

remove_filter( $tag, $function_to_remove, $priority );

?>

Параметры такие же, как и в случае с add_filter():

  • $tag (обязательный параметр) – имя фильтра;
  • $function_to_remove (обязательный параметр) – имя функции для удаления;
  • $priority (опция) - приоритет функции (определено при первом подключении функции).

Еще одна функция, remove_all_filters(), у которой всего лишь два параметра ($tag и $priority), в которых указываются имя функции и приоритет. Имя функции говорит само за себя. Она отключает все функции, прицепленные к фильтру.

Создаем свой собственный фильтр

Хотите знать, как создаются фильтры? Для этого существует специальная функция apply_filters(), находящаяся в ядре. Конечно же, ее можно использовать и вне ядра, и это означает то, что мы можем создавать фильтры внутри наших плагинов.
Посмотрим, как это работает на практике:

<?php

apply_filters( $tag, $value, $var1, $var2 /* ...и так далее */ );

?>
  • $tag (обязательный параметр) – имя привязываемой функции;
  • $value (обязательный параметр) - значение, которое будет меняться функцией, подключенной к фильтру через add_filter();
  • $var1, $var2 и так далее (опционально) – параметры фильтра (столько, сколько потребуется). Функция фильтра может использовать эти параметры, но они не смогут быть возвращены функциями.

Подумаем над таким примером: Представьте, что вы пишите функцию, которая возвращает только известную цитату Питера Гриффина:

<?php

function peter_griffin_quote() {
    $quote = "The bird is the word.";
    return $quote;
}

?>

Если вы хотите дать возможность пользователю отфильтровать эту цитату (не трогая код вашего плагина), вам нужно использовать функцию apply_filters() следующим образом:

<?php

function peter_griffin_quote() {
    $quote = "The bird is the word.";
    return apply_filters( 'peter_griffin_quote', $quote );
}

?>

Таким образом, другой разработчик сможет использовать ваш плагин и обработать данные вашей функции как в этом примере:

<?php

function change_the_quote( $quote ) {
    $quote = str_replace( 'bird', 'nerd', $quote );
    return $quote;
}

add_filter( 'peter_griffin_quote', 'change_the_quote' );

?>

Теперь, каждый раз, когда будет вызвана функция peter_griffin_quote(), цитата Питера будет слегка видоизменяться, при этом код плагина останется неизменным. Отлично!

Заключение

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

  • login_errors;
  • comment_post_redirect;
  • allowed_redirect_hosts;
  • body_class;
  • locale;
  • sanitize_user;
  • the_content;
  • the_password_form;
  • the_terms;
  • wp_mail_from.

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

И если вам понравилось то, что вы читаете в этой статье, не забудьте поделиться ею!

Увидимся на следующем уроке!