Что такое фильтры в wordpress
Перейти к содержимому

Что такое фильтры в wordpress

  • автор:

Исследуем фильтры в WordPress: Вступительная часть

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

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

  • определим понятия WordPress -фильтра;
  • рассмотрим методы их внедрения в систему;
  • приведем примеры использования ( в статье, которую вы читаете сейчас );
  • изучим 50 WordPress – фильтров ( по десять в каждой статье ) с примерами;
  • и напишем итоговую статью, в которой резюмируем проведенную работу.

Есть буквально сотни WordPress -фильтров в ядре и эти 50 примеров только малая часть из них ( около 10% ), так что вы сами можете добавить что-то из того списка и предложить примеры использования новых фильтров.

В любом случае, время для введения в WordPress -фильтры настало. Давайте начнем!

Что такое WordPress — фильтр

В Кодексе WordPress фильтрам дано следующее определение:

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

Итак, фильтр это функция на php , которая записывается в стек вызовов встроенной системы фильтров WordPress . Но в себе она может содержать сторонние функции и другие конструкции. Фильтр является одним из двух видов хуков ( hooks ) в WordPress . Второй — действие ( action ), но это предмет для другой серии статей.

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

Используем фильтры в WordPress

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

В этой статье мы собираемся проделать четыре вещи:

  • Создадим функцию фильтра;
  • Сделать из нее хук;
  • Убрать функцию из фильтра;
  • Создать свой собственный фильтр.

Создаем функцию и прикрепляем ее к фильтру

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

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

Сложно? На самом деле, нет. В приведенном ниже примере, мы напишем код функции, которая удаляет гласные во всем тексте:

Функция берет строку заголовка $title , удаляет гласные и возвращает строку. Довольно просто, верно? Теперь прыгнем на уровень выше, сделаем хук, и прицепим его к фильтру:

 add_filter( 'the_title', 'remove_the_vowels' ); ?>

Заметили новую функцию? Взглянем на add_filter():

  • $tag ( обязательный параметр ) – имя фильтра;
  • $function_to_add ( обязательный параметр ) – имя функции для хука;
  • $priority ( опция ) – Целое число для определения момента исполнения функции. По умолчанию равно 10: Функция сработает раньше, если вы снизите значение, и позже, если вы повысите его;
  • $accepted_args ( опция ) — Значение, нужное чтобы определить количество аргументов, которые пропускает фильтр. Значение по умолчанию равно1.

Удаляем фильтр

Конечно же, мы также можем убрать функцию, прикрепленную к фильтру. Для этого используем функцию remove_filter() . И смотрим, как она работает:

Параметры такие же, как и в случае с add_filter() :

  • $tag ( обязательный параметр ) – имя фильтра;
  • $function_to_remove ( обязательный параметр ) – имя функции для удаления;
  • $priority ( опция ) — приоритет функции ( определено при первом подключении функции ).

Еще одна функция, remove_all_filters() , у которой всего лишь два параметра ( $tag и $priority ), в которых указываются имя функции и приоритет. Имя функции говорит само за себя. Она отключает все функции, прицепленные к фильтру.

Создаем свой собственный фильтр

Хотите знать, как создаются фильтры? Для этого существует специальная функция apply_filters() , находящаяся в ядре. Конечно же, ее можно использовать и вне ядра, и это означает то, что мы можем создавать фильтры внутри наших плагинов.
Посмотрим, как это работает на практике:

  • $tag ( обязательный параметр ) – имя привязываемой функции;
  • $value ( обязательный параметр ) — значение, которое будет меняться функцией, подключенной к фильтру через add_filter();
  • $var1, $var2 и так далее ( опционально ) – параметры фильтра (столько, сколько потребуется). Функция фильтра может использовать эти параметры, но они не смогут быть возвращены функциями.

Подумаем над таким примером: Представьте, что вы пишите функцию, которая возвращает только известную цитату Питера Гриффина:

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

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

 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.

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

И если вам понравилось то, что вы читаете в этой статье, не забудьте поделиться ею!

Увидимся на следующем уроке!

Вадим Дворников автор-переводчик статьи « 50 Filters of WordPress: An Introduction to Filters »

Фильтры и события (хуки) в WordPress

В WordPress фильтры (filter) и события (action) называются «хуками» (по английски «hook» — «крючок»). Фильтры позволяют обрабатывать передаваемое значение, возвращая результат преобразования. События аналогичны фильтрам, но они ничего не возвращают.

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

Во время вызова функции, которая прикреплена к хуку, ей можно передать некоторые параметры (данные). Приведём простейший пример хука:

 add_action('myHook', 'MouseDC'); // привяжем функцию к хуку do_action('myHook'); // выполним хук. Получим надпись "Я люблю сыр!"

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

 function Cat($var) < // произвольная функция для будущего события (не возвращает ничего) echo 'А кошки не любят ' . $var . '!'; >add_action('myHook', 'Mouse'); // привяжем первую функцию к хуку add_action('myHook', 'Cat'); // привяжем вторую функцию к хуку $food = 'сыр'; do_action('myHook', $food); // выполним хук. Получим надпись "Я люблю сыр. А кошки не любят сыр!"

Обратите внимание, что один и тот же параметр был передан во все функции одновременно.

Далее в этой статье рассмотрим раздельно фильтры и события. Первые вызываются с помощью функции add_filter(), вторые с помощью и add_action(). По сути это две абсолютно одинаковые функции, они делают одно и тоже и принимают одинаковый набор параметров. Вы можете даже поменять местами эти функции в коде, это не вызовет ошибки.

Фильтры в WordPress

Для создания фильтров используется функция:

add_filter( $hook_name, $function, $priority, $args_num )
$hook_name строка Название фильтра, для которого будет срабатывать функция.
$function строка Название функции (в виде строки), которая будет срабатывать. Если функция находится внутри класса, то нужно указать массив: array(‘название_класса’, ‘название_функции’).
$priority число Приоритет выполнения функций для фильтра. Функция с приоритетом 20 будет выполняться после функции с приоритетом 10. По умолчанию приоритет равен 10.
$args_num число Количество принимаемых аргументов. Если фильтр может принимать два аргумента, то надо поставить цифру 2 и т.д (по умолчанию — 1).

После того как фильтр создан, его необходимо вызвать. Для этого используется:

apply_filters( $hook_name, $value, $args )
$hook_name строка Название фильтра, для которого будет срабатывать функция.
$value любой тип Значение, которое будет передано функции.
$args любой тип Дополнительные значение, которое будет передано функции.

Хуки должны иметь уникальные значения. И эти значения не должны совпадать с уже существующими хуками WordPress. И их более 2 000 (список хуков WordPress)

События в WordPress

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

Для добавления функции к событию используется «add_action»:

add_action( $hook_name, $function, $priority, $args_num )

А чтобы запустить добавленные к событию функции необходимо выполнить:

do_action( $hook_name, $args )

Удаление хука в WordPress

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

remove_action( $hook_name, $function, $priority )
remove_filter( $hook_name, $function, $priority )

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

Попробуем модифицировать примеры из начала этой статьи, чтобы продемонстрировать удаление:

 add_action('myHook', 'MouseDC'); // привяжем функцию к хуку remove_action('myHook', 'MouseDC'); // удалим функцию с хука do_action('myHook'); // выполним хук. Ничего не будет выведено

Теперь модифицируем второй пример, с двумя функциями на хуке. Но удалим только первую:

 function Cat($var) < // произвольная функция для будущего события (не возвращает ничего) echo 'А кошки не любят ' . $var . '!'; >add_action('myHook', 'Mouse'); // привяжем первую функцию к хуку add_action('myHook', 'Cat'); // привяжем вторую функцию к хуку remove_action('myHook', 'Mouse'); // удалим функцию с хука $food = 'сыр'; do_action('myHook', $food); // выполним хук. Получим надпись "А кошки не любят сыр!"

Другие функции хуков в WordPress

Рекомендуем ознакомиться с другими функциями (названия функций ведут на страницы сайта WordPress).

Функция Описание
did_action Возвращает число вызовов указанного события (хука).
has_action() Проверяет была ли зарегистрировано событие для хука.
doing_action() Возращает название событие, которое сейчас обрабатывается.
has_filter() Проверяет была ли зарегистрирована функция для хука.
current_filter() Возвращает название текущего фильтра.
doing_filter() Возращает название фильтра, которое сейчас обрабатывается.
remove_all_filters() Удаляет все хуки у указанного фильтра.

Добавление на сайт AJAX фильтра постов по категориям, произвольным полям, либо по дате. Сортировка по убыванию / возрастанию.

Сейчас я покажу вам, как легко и просто создавать асинхронные фильтры записей/товаров (и те и вторые — это произвольные типы постов) на сайте при помощи всего лишь jQuery и WP_Query.

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

А теперь давайте приступим к нашему уроку. По шагам.

Шаг 1. HTML фильтра для сайта

Форма будет состоять из:

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

1.1 Добавляем список из рубрик/таксономий

Неважно, элементы какой таксономии вы хотите вывести, в любых случаях функция get_terms() мне кажется ну самым удобным вариантом.

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

if( $terms = get_terms( array( 'taxonomy' => 'category', 'orderby' => 'name' ) ) : // как я уже говорил, для простоты возьму рубрики category, но get_terms() позволяет работать с любой таксономией echo ''; endif;

1.2 Произвольные поля

Для примера возьмём минимальную и максимальную цену.

Ну тут всё легко, можно просто использовать два HTML-инпута. Конечно, будет гораздо интереснее элемент range с возможностью передвигания ползунков минимального и максимального значения. Но это уже на ваше усмотрение, плагинов jQuery много, что-нибудь да выберете.

echo ''; echo '';

1.3 Дата

Как я уже писал выше — это будут две radio-кнопки.

echo ''; echo '';

1.4 Чекбокс «Только с фото»

Ну тут вообще всё просто.

echo '';

1.5 HTML-форма фильтра целиком

echo '// категории if( $terms = get_terms( array( 'taxonomy' => 'category', 'orderby' => 'name' ) ) ) { // как я уже говорил, для простоты возьму рубрики category, но get_terms() позволяет работать с любой таксономией echo ''; } // минимальная/максимальная цена echo ''; echo ''; // дата по возрастанию/убыванию echo ''; echo ''; // чекбокс только с фото echo ''; echo ' ';

Что делать с этим кодом?

Тут всё зависит от задачи, которая перед вами стоит. Например я могу создать какой-то шаблон страницы, в котором будут выводиться посты без фильтрации и присутствовать код фильтра, либо например сделать то же самое на странице блога, шаблон home.php или index.php (подробнее про шаблоны – тут). Ну или же можете посмотреть видео в конце урока.

Шаг 2. JavaScript (jQuery) скрипт для отправки запроса и получения данных

2.1 Подключение скриптов

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

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

Во-вторых, давайте подключим наш файл скрипта и сам jQuery функцией wp_enqueue_script() и wp_register_script(). Это можно сделать так:

add_action( 'wp_enqueue_scripts', 'truemisha_jquery_scripts' ); function truemisha_jquery_scripts() { wp_enqueue_script( 'jquery' ); wp_register_script( 'filter', get_stylesheet_directory_uri() . '/filter.js', array( 'jquery' ), time(), true ); wp_enqueue_script( 'filter' ); }

Можете закинуть в файл filter.js строчку jQuery( function( $ ) < alert( 'test' ); >, чтобы убедиться, что всё работает.

В-третьих, нам нужно получить URL обработчика AJAX в WordPress, это правильнеее всего делать через wp_localize_script(), в итоге в коде выше мы добавляем одну строчку:

wp_localize_script( 'filter', 'true_obj', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );

2.2 Сам код отправки запроса

Смело отправляем его в файл filter.js .

jQuery( function( $ ){ $( '#filter' ).submit(function(){ var filter = $(this); $.ajax({ url : true_obj.ajaxurl, // обработчик data : filter.serialize(), // данные type : 'POST', // тип запроса beforeSend : function( xhr ){ filter.find( 'button' ).text( 'Загружаю. ' ); // изменяем текст кнопки }, success : function( data ){ filter.find( 'button' ).text( 'Применить фильтр' ); // возвращаеи текст кнопки $( '#response' ).html(data); } }); return false; }); });

Шаг 3. Обработчик PHP

Этот код можете вставить в файл functions.php например или читайте этот гайд.

Основная задача, с которой у многих людей возникают трудности — это определение аргументов для WP_Query с учётом всех параметров из фильтра выше.

add_action( 'wp_ajax_myfilter', 'true_filter_function' ); add_action( 'wp_ajax_nopriv_myfilter', 'true_filter_function' ); function true_filter_function(){ $args = array( 'orderby' => 'date', // сортировка по дате у нас будет в любом случае (но вы можете изменить/доработать это) 'order' => $_POST[ 'date' ] // ASC или DESC ); // для таксономий if( isset( $_POST[ 'categoryfilter' ] ) ) { $args[ 'tax_query' ] = array( array( 'taxonomy' => 'category', 'field' => 'id', 'terms' => $_POST[ 'categoryfilter' ] ) ); } // создаём массив $args[ 'meta_query' ] если указана хотя бы одна цена или отмечен чекбокс if( isset( $_POST[ 'cena_min' ] ) || isset( $_POST[ 'cena_max' ] ) || isset( $_POST[ 'featured_image' ] ) && 'on' == $_POST[ 'featured_image' ] ) { $args[ 'meta_query' ] = array( 'relation' => 'AND' ); } // условие 1: цена больше $_POST[ 'cena_min' ] if( isset( $_POST[ 'cena_min' ] ) ) { $args[ 'meta_query' ][] = array( 'key' => 'cena', 'value' => $_POST[ 'cena_min' ], 'type' => 'numeric', 'compare' => '>' ); } // условие 2: цена меньше $_POST[ 'cena_max' ] if( isset( $_POST[ 'cena_max' ] ) ) { $args[ 'meta_query' ][] = array( 'key' => 'cena', 'value' => $_POST[ 'cena_max' ], 'type' => 'numeric', 'compare' => ' ); } // условие 3: миниатюра имеется if( isset( $_POST[ 'featured_image' ] ) && 'on' == $_POST[ 'featured_image' ] ) { $args[ 'meta_query' ][] = array( 'key' => '_thumbnail_id', 'compare' => 'EXISTS' ); } query_posts( $args ); if ( have_posts() ) { while ( have_posts() ) : the_post(); // тут вывод шаблона поста, например через get_template_part() echo ' . get_permalink() . '">' . get_the_title() . ''; endwhile; } else { echo 'Ничего не найдено'; } die(); }

Пара комментариев по коду:

  • Подробно про параметр tax_query (строки 13-19) можете почитать здесь.
  • Про meta_query у меня вообще есть отдельный урок.

Купить курс

  • 7 видеоуроков
  • Доступ к теме курса с готовым кодом после каждого урока
  • Единоразовый платёж
  • Доступ навсегда
  • Уроки актуальны в 2023-м году

Как работают фильтры в WordPress

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

Почему вы хотите использовать add_filter и apply_filters

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

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

Быстрый пример

Кусок кода стоит тысячи строк текста, так что вот небольшой пример:

$my_name = ‘Luis’;
add_filter(‘my_name’, ‘uppercase_it’);
function uppercase_it($name)
return strtoupper($name);
>
$new_name = apply_filters(‘my_name’, $my_name);
dump($new_name);

Как вы можете догадаться, $ new_name — это «LUIS», и это то, что мы видим на экране (я использую здесь библиотеку var_dumper).

Как работают фильтры в WordPress

Как видно из приведенного выше примера, add_filter принимает два параметра. Первый — это тег, а второй — функция. Добавление функции к тегу фильтра бесполезно, если вы не вызываете apply_filters с таким же тегом где-либо.

Когда apply_filters запускается для определенного тега, он вызывает все функции, добавленные в этот тег.

Несколько add_filter

Вы можете добавить в тег столько функций, сколько захотите. Давайте добавим еще одну функцию к my_name

$my_name = ‘Luis’;
add_filter(‘my_name’, ‘uppercase_it’);
add_filter(‘my_name’, ‘add_family_name’);
function uppercase_it($name)
return strtoupper($name);
>
function add_family_name($name)
return $name . ‘ Hernandez’;

$new_name = apply_filters(‘my_name’, $my_name);
dump($new_name);

Как видите, мы добавили еще одну функцию в тег my_name. Эта функция добавляет «Эрнандес» после имени. $ new_name сейчас будет:

Как работают фильтры в WordPress

Как видите, порядок add_filter имеет значение.

Несколько apply_filters

Подобно add_filter , вы можете вызывать apply_filters столько раз, сколько захотите. Давайте посмотрим на код ниже:

$my_name = ‘Luis’;
add_filter(‘my_name’, ‘add_family_name’);
add_filter(‘my_name’, ‘uppercase_it’);
function uppercase_it($name)
return strtoupper($name);
>
function add_family_name($name)
return $name . ‘ Hernandez’;
> $new_name = apply_filters(‘my_name’, $my_name);
$new_name2 = apply_filters(‘my_name’, $my_name);
dump($new_name);
dump($new_name2);

Вы можете догадаться, что мы получили два одинаковых результата:

Как работают фильтры в WordPress

Теперь место, куда вы положили apply_filters , имеет значение. Если добавить один apply_filters после первого add_filter (но перед вторым add_filter ), а другие apply_filters ниже всех, два результата будут разными:

$my_name = ‘Luis’;
add_filter(‘my_name’, ‘add_family_name’);
$name_1 = apply_filters(‘my_name’, $my_name);
add_filter(‘my_name’, ‘uppercase_it’);
$name_2 = apply_filters(‘my_name’, $my_name);
dump($name_1);
dump($name_2);

Как работают фильтры в WordPress

Однако порядок зависит от того, что называется приоритетом.

А если покопаться в apply_filters

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

Давайте посмотрим на первую строку:

global $wp_filter, $wp_current_filter;

$ wp_filter — это массив, в котором хранятся все данные о тегах и их функциях. Давайте посмотрим на тег ‘my_name’, добавив следующий код ниже:

if ($tag == ‘my_name’) dump($wp_filter[$tag]);
>

Как работают фильтры в WordPress

Как видите, $ wp_filter [‘my_name’] является экземпляром WP_Hook. Давайте проигнорируем все остальные детали и сосредоточимся на свойстве обратного вызова.

Вы увидите, что это связанный массив с ключом (10) является приоритетом . Поскольку мы не указали приоритет при вызове add_filter , значение по умолчанию равно 10. WordPress использует приоритет для определения порядка вызова функций.

Если указать приоритет как ниже:

add_filter(‘my_name’, ‘add_family_name’, 12);
add_filter(‘my_name’, ‘uppercase_it’, 13);

Тогда массив обратных вызовов будет иметь два ключа, 12 и 13:

Как работают фильтры в WordPress

Надеемся, что примеры в этом посте помогли вам немного лучше понять фильтры в WordPress.

Зарегистрируйтесь на Портале

и получите красивый адрес своей странички вида: senior.ua/sergey.ivanov

icon

senior.ua/ |

Потом все адреса будут Заняты 🙁

Добавить комментарий

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