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

Дата публикации:Апрель 10, 2013

Эта статья из цикла статей «Стилизация дочерних тем», который состоит из следующих пунктов:

  1. Основы создания дочерней темы WordPress
  2. Модульная CSS-стилизация в дочерних темах WordPress.
  3. Использование хуков фильтров в дочерних темах WordPress.
  4. Использование хуков действий в дочерних темах 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

Поделиться

3 комментария

  1. Юрий says:

    Вечер добрый ! Спасибо за статью. Я еще несилен , но подскажите как определить или где взять или как создать filter_name

  2. Юрий says:

    День добрый.Указывая точку ввода filter_name , как сохранить во время обновления темы. Или как указать точку ввода

Оставить комментарий

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

Получать новые комментарии по электронной почте. Вы можете подписаться без комментирования.