Эта статья из цикла статей «Стилизация дочерних тем», который состоит из следующих пунктов:
- Основы создания дочерней темы WordPress
- Модульная CSS-стилизация в дочерних темах WordPress.
- Использование хуков фильтров в дочерних темах WordPress.
- Использование хуков действий в дочерних темах WordPress.
В данной записи мы посмотрим на то, как использовать в своих интересах хуки фильтров в дочерних темах WordPress. Хуки фильтров – мощный инструмент, используемый при создании тем. Благодаря хукам, вы можете управлять HTML-кодом, создаваемым вашей темой, без необходимости работы с различными файлами шаблонов.
Как работают хуки фильтров в WordPress
Если вы знаете, как работают хуки фильтров, вы сможете без проблем отфильтровать любую функцию вашей темы. Однако если вы хотите отфильтровать какую-либо функцию вашей дочерней темы, вам понадобится немного поработать с PHP. К счастью, ничего сложного в этом нет.
Если вы решили немного поэкспериментировать с PHP, держите в уме следующее правило: файл функций должен начинаться и заканчиваться открывающим и закрывающим PHP-тегом. Никаких дополнительных строк кода до или после этих тегов быть не должно. Пример:
<?php // We're going to be pasting our code between those PHP tags above and below this comment ?>
Давайте взглянем на структуру хуков фильтров:
// We'll use this form if we're going to just outright replace something function my_function_name() { // Your custom code goes here, between the curly braces } add_filter('filter_name','my_function_name');
В этом примере мы просто написали несколько строк PHP-кода. Мы создали функцию:
function my_function_name() { // Your custom code goes here, between the curly braces }
Затем мы сообщили WordPress, чтобы система взяла эту функцию и использовала my_function_name вместо оригинального контента или кода, который был возвращен filter_name.
add_filter('filter_name','my_function_name');
Здесь filter_name – ключ к нашему действию. Где-то в недрах WordPress или в коде нашей родительской темы есть функция, которая выглядит примерно так:
function super_stuff() { $stuff = 'bacon'; echo apply_filters ( 'filter_name' , $stuff ); }
Вы поняли, что значит последняя строка в функции super_stuff? Команда echo означает «вывести на экран», однако самую важную роль здесь играет apply_filters. В нем мы и получаем наш фильтр filter_name. Любая функция, определенная в коде WordPress или стоящая в коде родительской темы, может быть отфильтрована другой функцией, находящейся в плагине или, что более важно для нашего руководства, в дочерней теме WP.
Этот подход несет в себе массу преимуществ! Если вы до сих пор не поняли его, ничего страшного! Я сторонник обучения с помощью копирования и вставки кода. Давайте попробуем отфильтровать некоторые функции темы на практике.
Фильтрация функций темы
Активируйте дочернюю тему Chiron, созданную нами на прошлом этапе, и сделайте файл функций, если его до сих пор нет (chiron/functions.php). Начнем мы с фильтрации одной из самой запутанной на первый взгляд функции в нашей родительской теме Thematic — thematic_postheader.
В действительности ничего сложного в ней нет. Давайте взглянем на сокращенную версию thematic_postheader, которая содержит в себе практически все, что вы должны уже знать:
// Information in Post Header // Basically the stuff you see at the top of every post function thematic_postheader() { global $id, $post, $authordata; // The Post Title $posttitle = apply_filters('thematic_postheader_posttitle',$posttitle); // The Post Meta $postmeta = apply_filters('thematic_postheader_postmeta',$postmeta); // Is this a post or a page? if ($post->post_type == 'page' || is_404()) { // If it's a page show only the Post Title $postheader = $posttitle; } else { // If it's a post show the Post Title and The Post Meta $postheader = $posttitle . $postmeta; } // Echo the Post Header echo apply_filters( 'thematic_postheader', $postheader ); // Filter to override default post header }
Изучили код? В нем есть 3 apply_filters, один для самой thematic_postheader, и 2 для контента внутри нее — заголовка записи и метаданных записи.
Хорошо. Давайте сделаем что-нибудь глупое. К примеру, давайте заменим весь контент на текст … «бекон». Скопируйте фрагмент кода в файл функций вашей дочерней темы, сохраните и обновите ваш тестовый сайт.
function childtheme_postheader() { echo 'bacon'; } add_filter('thematic_postheader','childtheme_postheader');
Заголовки записей и их метаданные пропадут, а вместо них будет красоваться текст… «бекон». Не слишком полезный пример, но зато с его помощью вы поняли, как фильтровать вывод любой фильтруемой функции.
Теперь давайте попробуем создать другую – более полезную – функцию. Удалим предыдущий фрагмент кода из файла функций.
Возможно, вам понадобилось добавить блок div ко всем заголовкам записей в вашей теме. Может быть, вы хотите создать сложный бэкграунд-эффект или же хотите изменить позиционирование каких-то элементов. Мы будем фильтровать переменную в thematic_postheader, которая возвращает заголовок записи; таким образом, мы внесем изменения в вывод кода без непосредственного редактирования файлов шаблонов.
Скопируйте следующий фрагмент кода в файл функций вашей дочерней темы и обновите тестовый сайт:
function childtheme_posttitle($posttitle) { return '<div class="containing">' . $posttitle . '</div>'; } add_filter('thematic_postheader_posttitle','childtheme_posttitle');
Проверьте исходный код вашего тестового сайта. Вы добавили блок div к каждому заголовку записи на вашем сайте. С помощью 4 строк кода.
Заметьте изменения, которые мы сделали в этой функции. Мы добавили переменную в строке 1 и вернули ее в строке 2. Таким образом, мы получили доступ к контенту оригинальной функции, которую мы фильтруем. Это очень мощный метод.
Вы получили всю необходимую информацию, чтобы самостоятельно отфильтровать функции родительской темы в своей дочерней теме.
Теперь вам осталось только найти все существующие в WP фильтры. Сделать это можно с помощью Кодекса.
Источник: themeshaper.com
Вечер добрый ! Спасибо за статью. Я еще несилен , но подскажите как определить или где взять или как создать filter_name
Вместо filter_name надо вставлять название фильтра. Вот примеры существующих в WP фильтров:
http://codex.wordpress.org/Plugin_API/Filter_Reference
День добрый.Указывая точку ввода filter_name , как сохранить во время обновления темы. Или как указать точку ввода