Исследуем фильтры в WordPress: Вступительная часть
На сегодняшний день WordPress – одна из самых популярных систем управления контентом в мире. Одна из причин, благодаря которым она заслужила такую популярность, является возможность быстрого расширения функционала. В этой серии статей мы расскажем о фильтрах – одним из лучших способов точной настройки WordPress.
В основе этого способа лежат хуки - фильтры и действия WordPress. Без них мы не сможем воспользоваться расширяемостью WordPress в полной мере. В этой серии статей мы остановимся на фильтрах для WP - одном из лучших методов настройки для этой CMS. Серия состоит из семи частей. В них все наше внимание мы сосредоточим на следующем:
- определим понятия WordPress-фильтра;
- рассмотрим методы их внедрения в систему;
- приведем примеры использования (в статье, которую вы читаете сейчас);
- изучим 50 WordPress – фильтров (по десять в каждой статье) с примерами;
- и напишем итоговую статью, в которой резюмируем проведенную работу.
Есть буквально сотни WordPress-фильтров в ядре и эти 50 примеров только малая часть из них (около 10%), так что вы сами можете добавить что-то из того списка и предложить примеры использования новых фильтров.
В любом случае, время для введения в 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.
Мне не терпится приступить к написанию следующей статьи из этой серии, и я надеюсь, что она окажется полезна вам, так же, как и мне. Если вы думаете, что сможете помочь мне с уроками, предлагая другие фильтры или примеры, не стесняйтесь, поделитесь своими мыслями в комментариях.
И если вам понравилось то, что вы читаете в этой статье, не забудьте поделиться ею!
Увидимся на следующем уроке!