Статьи

Добавление пользовательских хуков в WordPress: пользовательские фильтры

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

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

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

Прежде чем приступить к работе с хуками, я кратко опишу то, что обсуждалось в предыдущей статье, а затем мы пойдем дальше.

С сказал, что, давайте начнем.

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

  • Программное обеспечение имеет определенные точки, в которых оно передает сообщение о том, что что-то произошло.
  • Мы, как разработчики, можем написать код, который прослушивает это сообщение, а затем отвечает на него собственным кодом.

А затем по всему контенту мы рассмотрели, как именно этот шаблон реализован в WordPress. Мы говорили о том, как мы можем воспользоваться этим, а затем мы говорили о том, как мы можем реализовать наши собственные действия.

Мы также признали тонкое различие:

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

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

В конечном счете, речь идет о попытке повеселиться и увидеть ощутимые результаты благодаря работе, которую мы делаем, изучая все об этом мощном аспекте WordPress.

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

Напомним из предыдущей статьи, что наша локальная среда разработки должна состоять из следующего:

  • WordPress 4.5.2
  • ваш предпочтительный IDE
  • веб-сервер
  • копия PHP
  • база данных

Для многих Apache, PHP и MySQL могут быть легко установлены. Если вы более продвинуты, то можете использовать что-то вроде Nginx и альтернативную базу данных. Если это так, это нормально, но для целей этого урока я предполагаю, что у вас есть первое.

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

Как только вы настроитесь, мы будем готовы продолжить.

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

Пользовательские фильтры отличаются от пользовательских действий, поскольку пользовательские действия позволяют добавлять или удалять код из существующих действий. Принимая во внимание, что пользовательские фильтры позволяют заменять определенные данные (например, переменную), найденные в существующем действии.

Но если вы ищете полный список доступных фильтров в WordPress, то обязательно обратитесь (и добавьте в закладки) эту страницу в Кодексе. Он имеет примерно 20 секунд фильтров, многие из которых связаны с их собственной страницей документации.

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

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

Взять, к примеру, следующую строку кода:

1
2
<?php
add_filter( ‘author_edit_pre’, ‘filter_function_name’, 10, 2 );

Это говорит нам о четырех вещах:

  1. название фильтра, к которому мы подключаемся
  2. имя функции, которая должна быть вызвана
  3. приоритет того, когда функция должна быть вызвана
  4. сколько параметров должна принять функция

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

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

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

Чтобы начать работать с фильтрами, давайте продолжим и создадим наш собственный файл в корне каталога twentysixteen . Мы назовем файл tutsplus-filters.php . Затем в файл functions.php twentysixteen добавим следующую строку кода:

1
2
<?php
include_once( get_template_directory() . ‘/tutsplus-filters.php’ );

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

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

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

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

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

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

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

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

Давайте tutsplus_the_content нашу пользовательскую функцию tutsplus_the_content и затем зарегистрируем ее в WordPress.

1
2
3
4
5
6
<?php
 
add_filter( ‘the_content’, ‘tutsplus_the_content’ );
function tutsplus_the_content( $content ) {
    return $content;
}

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

Давайте сделаем так, чтобы эта функция немного изменила данные. В частности, давайте сделаем это:

  1. убедитесь, что сообщение просматривается в режиме просмотра одного сообщения
  2. добавить сообщение вверху сообщения, объясняющее, что содержание сообщения изменяется

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

Вот как должен выглядеть код. Обратите внимание и на комментарии к коду:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<?php
 
add_filter( ‘the_content’, ‘tutsplus_the_content’ );
function tutsplus_the_content( $content ) {
 
    // Don’t proceed with this function if we’re not viewing a single post.
    if ( ! is_single() ) {
        return $content;
    }
 
    // First, define the message to be displayed.
    $html .= ‘<p>’;
        $html .= ‘This is a custom message created by a hooked function.’;
    $html .= ‘</p>’;
 
    // Now prepend it to the content.
    $content = $html .= $content;
 
    return $content;
}

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

Это пользовательское сообщение, созданное подключенной функцией.

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

Для этого мы использовали бы следующий код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
 
add_filter( ‘the_content’, ‘tutsplus_the_content’ );
function tutsplus_the_content( $content ) {
 
    // Don’t proceed with this function if we’re not viewing a single post.
    if ( ! is_single() ) {
        return $content;
    }
 
    // First, remove all of the vowels from the content using a regular expression.
    $content = preg_replace( ‘$[aeiou]$i’, », $content );
 
    // Then, define the message to be displayed.
    $html .= ‘<p>’;
        $html .= ‘This is a custom message created by a hooked function.’;
    $html .= ‘</p>’;
 
    // And now prepend it to the content.
    $content = $html .= $content;
 
    return $content;
}

Реализуйте этот код, сохраните его, а затем посетите любой пост в вашей установке WordPress.

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

Вот как может выглядеть окончательный результат:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
 
add_filter( ‘the_content’, ‘tutsplus_the_content’ );
function tutsplus_the_content( $content ) {
 
    // Don’t proceed with this function if we’re not viewing a single post.
    if ( ! is_single() ) {
        return $content;
    }
 
    $content = _tutsplus_strip_vowels( $content );
    $content = _tutsplus_add_message( $content );
 
    return $content;
}
 
function _tutsplus_strip_vowels( $content ) {
    return preg_replace( ‘$[aeiou]$i’, », $content );
}
 
function _tutsplus_add_message( $content ) {
 
    $html .= ‘<p>’;
        $html .= ‘This is a custom message created by a hooked function.’;
    $html .= ‘</p>’;
 
    return ( $html . $content );
}

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

Однако легко воспользоваться преимуществами уже существующих фильтров. Как упоминалось ранее, на самом деле просто вызвать add_filter , указать имя фильтра, а затем передать имя функции, которую мы хотим вызвать для фильтрации данных.

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

Здесь мы начинаем интересоваться apply_filters . Эта конкретная функция принимает два аргумента:

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

Если вы посмотрите на пример, скажем, get_the_content в ядре WordPress , то вы заметите, что он передает указанное значение через the_content_more_link через apply_filters .

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

Добавить наши собственные фильтры легко. Нам нужно указать те же четыре вещи, которые мы обрисовали в общих чертах выше:

  1. название фильтра
  2. функция, которую должен вызывать фильтр
  3. приоритет функции
  4. количество аргументов, которые он должен принять

Давайте начнем с простого примера.

чтобы убедиться, что содержание всего поста в нижнем регистре.

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

1
2
<?php
add_filter( ‘tutsplus_lowercase_all’, ‘tutsplus_lowercase_all_callback’, 10, 1 );

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

1
2
3
4
<?php
function tutsplus_lowercase_all_callback( $content ) {
    return strtolower( $content );
}

Окончательная версия кода будет выглядеть так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<?php
add_filter( ‘tutsplus_lowercase_all’, ‘tutsplus_lowercase_all_callback’, 10, 1 );
function tutsplus_lowercase_all_callback( $content ) {
    return strtolower( $content );
}
 
add_filter( ‘the_content’, ‘tutsplus_the_content’ );
function tutsplus_the_content( $content ) {
 
    // Don’t proceed with this function if we’re not viewing a single post.
    if ( ! is_single() ) {
        return $content;
    }
 
    return apply_filters( ‘tutsplus_lowercase_all’, $content );
}

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

Чтобы удалить гласные, мы можем использовать ту же функцию, которую мы уже определили; однако нам нужно изменить способ регистрации фильтра в WordPress, а затем мы должны убедиться, что функция, зарегистрированная в WordPress, правильно вызывает apply_filters .

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

Вот фильтр, и он вызывается сам по себе:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<?php
 
add_filter( ‘tutsplus_remove_vowels’, ‘tutsplus_remove_vowels_callback’, 10, 1 );
function tutsplus_remove_vowels_callback( $content ) {
    return preg_replace( ‘$[aeiou]$i’, », $content );
}
 
add_filter( ‘the_content’, ‘tutsplus_the_content’ );
function tutsplus_the_content( $content ) {
 
    // Don’t proceed with this function if we’re not viewing a single post.
    if ( ! is_single() ) {
        return $content;
    }
 
    return apply_filters( ‘tutsplus_remove_vowels’, $content );
}

И тогда это то, как вы можете вызвать это изнутри начального хука.

Наконец, можно вызывать apply_filters несколько раз:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
 
add_filter( ‘tutsplus_remove_vowels’, ‘tutsplus_remove_vowels_callback’, 10, 1 );
function tutsplus_remove_vowels_callback( $content ) {
    return preg_replace( ‘$[aeiou]$i’, », $content );
}
 
add_filter( ‘tutsplus_lowercase_all’, ‘tutsplus_lowercase_all_callback’, 10, 1 );
function tutsplus_lowercase_all_callback( $content ) {
    return strtolower( $content );
}
 
add_filter( ‘the_content’, ‘tutsplus_the_content’ );
function tutsplus_the_content( $content ) {
 
    // Don’t proceed with this function if we’re not viewing a single post.
    if ( ! is_single() ) {
        return $content;
    }
 
    return apply_filters( ‘tutsplus_lowercase_all’,
                    apply_filters( ‘tutsplus_remove_vowels’, $content )
                 );
}

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

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

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

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

И наконец, если вы ищете другие утилиты, которые помогут вам создать свой растущий набор инструментов для WordPress или кода для изучения и стать более опытным в WordPress, не забудьте посмотреть, что у нас есть в Envato Market .

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

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