Статьи

Добавление фильтров-хуков в ваш WordPress Theme Framework

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

Прежде чем продолжить, стоит дать краткий обзор различий между действиями и фильтрами:

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

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

1
2
3
<?php
apply_filters( ‘my_filter’, ‘code to be filtered goes here’ );
?>

Затем вы add_filter() доступ к этому фильтру, используя add_filter() , следующим образом:

1
2
3
4
5
6
<?php
function my_function() {
    // code for function here
}
add_filter( ‘my_filter’, ‘my_function’ );
?>

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

Чтобы следовать этому уроку, вам понадобится:

  • Разрабатываемая установка WordPress
  • Редактор кода
  • Если вы работаете с кодом, используемым в моей структуре, код из предыдущего урока .

В этом уроке я собираюсь добавить три хука фильтров в каркас:

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

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

Начните с названия сайта и описания. Откройте файл header.php вашей темы и найдите следующий код:

1
2
3
4
5
6
7
<div class=»site-name half left»>
    <!— site name and description — site name is inside a div element on all pages except the front page and/or main blog page, where it is in a h1 element —>
    <h1 id=»site-title»>
        <a href=»<?php echo home_url(); ?>» title=»<?php echo esc_attr( get_bloginfo( ‘name’, ‘display’ ) ); ?>» rel=»home»><?php bloginfo( ‘name’ );
    </h1>
    <h2 id=»site-description»><?php bloginfo( ‘description’ );
</div>

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

В каждом случае вы заменяете bloginfo() функцию get_bloginfo() , а затем добавляете echo перед apply_filters() . Начнем с названия сайта. Отредактируйте код внутри элемента h1 так, чтобы он читал:

1
2
3
4
5
<h1 id=»site-title»>
    <a href=»<?php echo home_url(); ?>» title=»<?php echo esc_attr( apply_filters( ‘wptutsplus_sitetitle’, get_bloginfo( ‘name’, ‘display’ ) ) ); ?>» rel=»home»>
        <?php echo apply_filters( ‘wptutsplus_sitetitle’, get_bloginfo( ‘name’ ) );
    </a>
</h1>

Как вы можете видеть, я добавил apply_filters() дважды здесь — один раз для атрибута title ссылки, а затем снова для отображаемого текста. Новый код ниже:

1
<?php echo apply_filters( ‘wptutsplus_sitetitle’, get_bloginfo( ‘name’ ) );

Это создает фильтр с именем wptutsplus_sitetitle и затем применяет его к функции get_bloginfo( 'name' ) . Это затем повторяется.

Теперь давайте сделаем то же самое с описанием сайта. Это немного проще, так как нет ссылки. Отредактируйте элемент h2 так, чтобы он читал:

1
2
3
<h2 id=»site-description»>
    <?php echo apply_filters( ‘wptutsplus_sitedescription’, get_bloginfo( ‘description’ ) );?>
</h2>

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

Далее я собираюсь добавить фильтр в колофон, который содержится в функции в моем файле functions.php . Это позволит пользователям моей структуры изменять или переопределять содержимое колофона.

Сначала откройте ваш файл functions.php и найдите этот блок кода:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
function wptp_colophon() { ?>
    <section class=»colophon» role=»contentinfo»>
        <small class=»copyright half left»>
            &copy;
        </small><!— #copyright —>
     
        <small class=»credits half right»>
            <?php _e( ‘Proudly powered by’, ‘tutsplus’ );
            <a href=»http://wordpress.org/»>WordPress</a>.
        </small><!— #credits —>
    </section><!—#colophon—>
 
<?php
}

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
function wptp_colophon() { ?>
    <section class=»colophon» role=»contentinfo»>
        <small class=»copyright half left»>
            &copy<a href=»<?php echo apply_filters( ‘wptp_colophon_link’, home_url( ‘/’ ) ?>»>) ?>»><?php echo apply_filters(‘wptp_colophon_name’, get_bloginfo( ‘name’ ) ); ?></a> 2014
        </small><!— #copyright —>
     
        <small class=»credits half right»>
            <?php _e( ‘Proudly powered by’, ‘tutsplus’ );
            <a href=»http://wordpress.org/»>WordPress</a>.
        </small><!— #credits —>
    </section><!—#colophon—>
 
<?php
}

Здесь я создал два фильтра:

  • echo apply_filters( 'wptp_colophon_link', home_url( '/' ) применяется к ссылке, на которую указывает имя.
  • echo apply_filters('wptp_colophon_name', get_bloginfo( 'name' ) ) применяется к самому имени.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
function wptp_amend_colophon_name() {
     
    $name = ‘Rachel McCollin’;
    return $name;
     
}
add_filter( ‘wptp_colophon_name’, ‘wptp_amend_colophon_name’ );
 
function wptp_amend_colophon_link() {
     
    $link = ‘http://rachelmccollin.co.uk’;
    return $link;
     
}
add_filter( ‘wptp_colophon_link’, ‘wptp_amend_colophon_link’ );

Каждая из этих функций возвращает статический контент вместо функции php в исходном фильтре, заменяя домашний URL и имя блога моим именем и URL моего блога:

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

В некоторых случаях вы можете обнаружить, что фильтр становится слишком сложным, и в этом случае вам нужно будет написать новую функцию или иногда создать новый файл шаблона. Например, если бы я хотел внести более существенные изменения в колофон, я бы добавил новую функцию wptp_colophon() в мою wptp_colophon() тему — поскольку wptp_colophon() в платформе является подключаемой, моя новая функция переопределит ее. Но если бы я захотел заменить весь нижний колонтитул, мне пришлось бы создать новый файл footer.php .

Однако фильтры могут быть полезны, чтобы избежать необходимости выполнять такую ​​радикальную работу — когда вы пишете файлы шаблонов вашей платформы, подумайте о том, что выводится, что ваши пользователи могут захотеть изменить, и оберните его в функцию apply_filters() .