Хуки: фильтры и действия. Подробное руководство
Хук (hook) — в переводе означает крючок.
Где-то в самом коде ядра WordPress или в плагине WooCommerce (да и в любом плагине) или даже в теме есть крючки, на которые мы можем повесить свой код, никак не затрагивая при этом основные файлы WordPress или же файлы плагина. Тем самым вы сможете спокойно обновлять плагины и движок, а ваш код, подвешенный на эти крючки будет находиться где-то в отдельном месте.
Наши хуки будут делиться на два вида: фильтры и действия.
- Фильтры позволят вам изменить значения каких-либо переменных перед их возвратом функциями.
- Действия позволят вам выполнить какой угодно код там, где висит «крючок».
Чтобы скачать плагин, который получился в процессе этого урока, нужно купить курс.
Пошаговый разбор работы фильтра
Задача фильтра — дополнительно изменить значение какой-либо переменной при помощи произвольной функции, не затрагивая при этом основные файлы движка или плагинов.
Делается это в принципе при помощи двух функций — apply_filters() и add_filter().
- Всё начинается с того, что где-то в коде движка WordPress или плагина находится переменная, на которую в последствии нужно будет воздействовать фильтром. На эту переменную вешается функция apply_filters(), и результат действия функции обычно присваивается самой же переменной. Кроме того, тут же задаётся и название фильтра. Например это может выглядит так:
$x = apply_filters( 'misha_filter', $x );
- После этого мы уже можем воздействовать на эту переменную извне при помощи add_filter(). Для этого например в файле functions.php или в нашем собственном плагине, который мы разрабатываем на протяжении этого курса, мы создаём функцию с произвольным названием, аргумент функции — переменная $x , внутри функции выполняем с ней все необходимые действия и в конце концов возвращаем результативную переменную. Затем, рядом с функцией вызываем add_filter(), в которой в качестве параметров указываем название фильтра и название нашей произвольной функции. Меньше слов, больше дела — вот как это может выглядеть:
add_filter( 'misha_filter', 'misha_function' ); function misha_function( $x ) { $x = '' . $x . ''; // если переменная текстовая, мы просто сделали текст жирным шрифтом return $x; // возвращаем }
Или вот так начиная с версии PHP 5.3
add_filter( 'misha_filter', function( $x ) { $x = '' . $x . ''; // если переменная текстовая, мы просто сделали текст жирным шрифтом return $x; // возвращаем } );
Но у анонимной функции есть минус – такой хук невозможно будет отключить.
- Стоп! Прежде, чем читать пост дальше, рекомендую опробовать всё это у себя. Вам не обязательно писать для этого плагин — просто в теме, например в header.php выведите переменную $x и перед выводом примените к ней фильтр, а в файле functions.php этот фильтр и наложите.
Пример с фильтром the_content
Скажите, то содержимое поста, которое находится у вас в редакторе в админке и то, которое выводится на сайте одно и то же или отличается?
Вероятно, это одна из тех вещей, которая фильтруется больше всего – при помощи фильтра the_content на содержимое поста накладываются функции wpautop(), wptexturize(), применяются шорткоды. Кроме того, пользователь тоже мог нагуглить какие-нибудь хуки и с их помощью, скажем, выводить кнопки социальных сетей под постом.
Чтобы посмотреть наглядно, попробуйте вставить этот код в удобное место в теме, в footer.php или в произвольный шаблон страницы:
$my_post = get_post( 5 ); // вместо 5 укажите ID интересующей вас записи echo $my_post->post_content; // выводим содержимое поста как оно есть в базе данных $filtered = apply_filters( 'the_content', $my_post->post_content ); // применяем фильтры echo $filtered; // выводим, смотрим, что получилось
Пошаговый разбор работы хука действия
Задача хука действия — в определенном месте в коде дать возможность выполнить вспомогательную функцию извне, не изменяя при этом самого кода.
Делается всё это так же, как и в случае с фильтрами, двумя функциями — do_action() и add_action()
- Всё начинается с того, что где-то в коде есть место, в котором потенциально нужно будет выполнить дополнительный код. Это место мы обозначим функцией do_action(), в качестве параметра которой укажем название «крючка». Это будет выглядеть очень просто:
do_action( 'misha_hook' );
- Теперь на этот «крючок» мы уже можем повесить функцию, которая будет находиться например в functions.php вашем темы или в отдельном плагине. То есть открываем functions.php , создаём там произвольную функцию, затем рядом с ней (не в ней!) выполняем функцию add_action(), в которой указываем название хука и название произвольной функции.
add_action( 'misha_hook', 'misha_function2' ); function misha_function2(){ echo 'Привет, мир!'; }
Ну разве не простой механизм?
Пример с использованием хука wp_head в WordPress
Просто wp_head это первое, что пришло мне сейчас в голову. Итак, прежде всего откройте страницу вашего сайта, откройте её и в виде HTML-кода в браузере. А теперь зайдите в файл header.php и быстрым нажатием клавиши удалите оттуда функцию wp_head() (она и запускает хук). После этого посмотрите, как сильно изменится ваша страница — исчезнут стили, скрипты, возможно какой-то произвольный код, который вы вручную добавляли через этот хук.
Параметры и приоритеты
Приоритеты
Про приоритеты рассказать гораздо проще, поэтому начну с них. Как вы уже поняли, на один и тот же хук («крючок») имеется возможность повесить довольно много функций. Но ведь иногда эти функции изменяют значение одной и той же переменной, а это значит, что если поменять их местами, то и значение переменной будет другим.
Покажу простейший пример с использованием анонимных функций (вам нужна версия PHP 5.3.0 или выше) и хуков действий. Если вы вставите этот код куда-нибудь на сайте, то привязанные к хуку функции будут выполняться в порядке подключения в коде
add_action( 'misha_priority', function(){ echo 'A'; } ); add_action( 'misha_priority', function(){ echo 'Б'; } ); add_action( 'misha_priority', function(){ echo 'В'; } ); // сам хук do_action( 'misha_priority' ); // будет выведено АБВ
А теперь внимание — функции add_action() и add_filter() третьим параметров поддерживают указание приоритета, с учетом этого видоизменим наш код.
add_action( 'misha_priority', function(){ echo 'A'; }, 9999 ); add_action( 'misha_priority', function(){ echo 'Б'; }, 5 ); add_action( 'misha_priority', function(){ echo 'В'; }, 10 ); // 10 - значение по умолчанию, поэтому его можно и не указывать // сам хук do_action( 'misha_priority' ); // будет выведено БВА
Как видите, чем выше значение приоритета, тем позднее функция будет подключена к хуку и выполнена.
Передача дополнительных аргументов в функцию
Чего ещё не хватает для полного счастья — передачи в подвешенные на хук функции дополнительных параметров. И эта возможность тоже предусмотрена.
Всё начинается с того, что в функциях do_action() или apply_filters() указываются один или несколько параметров.
do_action( 'misha_action', $param1, $param2, $param3 );
После этого, четвёртым параметром функции add_action() или add_filter() соответственно вы можете решить, сколько из них можно передать непосредственно в функцию.
add_action( 'misha_action', 'misha_function_1', 10, 3 ); // 3 - количество параметров, можно указать и 2, тогда функция misha_function() примет только два параметра, единицу можно не указывать, так как это значение по умолчанию function misha_function_1( $param1, $param2, $param3 ) { . }
Отключение хуков и действий
Всего для этих целей в WordPress существует 4 функции:
- remove_filter() — для отключения конкретной функции с фильтра.
- remove_action() — для удаления конкретной функции с хука действия.
- remove_all_filters() — для полной очистки хука фильтра.
- remove_all_actions() — для полной очистки хука действия.
Пример для WooCommerce, удаляющий опции сортировки со страницы «Магазин» и категорий товаров:
remove_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 30 );
Купить курс
- 11 видеоуроков
- Можно скачать готовый код после каждого урока
- Можно начать проходить курс сразу же после оплаты
- Единоразовый платёж
- Доступ навсегда
- Уроки актуальны в 2023-м году
WordPress. Как работают хуки
В процессе загрузки WordPress происходит множество событий. К каждому из этих событий можно привязать функцию, которая выполнит какое-то действие ( action ) или изменит данные ( filter ). Разделение нужно, потому что по смыслу это разные вещи. Действие просто отрабытывает в нужный момент и ничего не возвращает, а фильтр — обрабатывает переданные данные и обязательно должен их вернуть.
Как работают хуки
Это упрощенный вариант реализации хуков, который наглядно показывает, как это работает:
$actions = array(); function add_action($hook, $function) global $actions; if (!isset($actions[$hook])) $actions[$hook] = array(); > $actions[$hook][] = $function; > function do_action($hook) global $actions; if (isset($actions[$hook])) foreach($actions[$hook] as $function) call_user_func($function); > > >
Функция add_action() назначает обработчик $function для события $hook . Функция do_action() инициирует событие $hook , после чего вызываются на выполнение все функции-обработчики этого события.
Примеры хуков-действий
// создадим функцию для хука function echo_one() echo 'one'; > // привяжем функцию к хуку add_action('some_hook', 'echo_one'); // выполним хук do_action('some_hook'); // выведет «one»
// создадим функции для событий function echo_one($data) echo $data[0]; > function echo_two($data) echo $data[1]; > // привяжем эти функции к хуку add_action('some_hook', 'echo_one'); add_action('some_hook', 'echo_two'); // выполним хук do_action('some_hook', array('Привет', ' мир!') ); // выведет «Привет мир!»
Функция add_action()
add_action($hook, $function, $priority, $count);
Прикрепляет указанную функцию на указанный хук. Функция $function сработает в момент события $hook , которое в свою очередь запускается с помощью do_action() .
Функция do_action()
do_action($hook, $arg1, $arg2, …);
Инициирует событие $hook , к которому могут быть прикреплены произвольные функции. Чтобы функция сработала в момент события, её нужно подключить к этому событию с помощью функции add_action() .
Примеры хуков-фильтров
// создадим функцию для хука function some_filter($str) return 'Привет ' . $str . '!'; > // привяжем функцию к хуку add_filter('some_hook', 'some_filter'); // выполним хук $data = apply_filters('some_hook', 'мир'); // посмотрим, что получилось echo $data; // выведет «Привет мир!»
// создадим функцию для хука function crop_string($string) return iconv_substr($string, 0, 6) . '…'; > // привяжем функции к хуку add_filter('prepare_string', 'strip_tags'); add_filter('prepare_string', 'crop_string'); // выполним хук $data = apply_filters('prepare_string', 'Привет, мир!
'); // посмотрим, что получилось echo $data; // выведет «Привет…»
Функция add_filter()
add_filter($hook, $function, $priority, $count);
Прикрепляет указанную функцию на указанный хук. Функция $function сработает в момент события $hook , которое в свою очередь запускается с помощью apply_filters() .
Функция apply_filters()
apply_filters($hook, $value, $arg1, $arg2, …);
Инициирует событие $hook , к которому могут быть прикреплены произвольные функции. Чтобы функция сработала в момент наступления события, её нужно подключить к этому событию с помощью функции add_filter() .
- WordPress. Порядок загрузки страницы
- WordPress. Создание одностраничного сайта
- WordPress. Обработка POST-запросов. Часть 1
- WordPress. Форма комментирования
- WordPress. Теги шаблона
- WordPress. Установка и использование WP-CLI
- WordPress. Обработка POST-запросов. Часть 2
Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Категории блога
Облако тегов
- 1С:Предприятие (31)
- API (29)
- Bash (43)
- CLI (122)
- CMS (139)
- CSS (50)
- Frontend (75)
- HTML (66)
- JavaScript (150)
- Laravel (72)
- Linux (169)
- MySQL (76)
- PHP (125)
- React.js (66)
- SSH (27)
- Ubuntu (69)
- Web-разработка (509)
- WordPress (73)
- Yii2 (69)
- БазаДанных (95)
- Битрикс (66)
- Блог (29)
- Верстка (43)
- ИнтернетМагаз… (84)
- КаталогТоваров (87)
- Класс (30)
- Клиент (28)
- Ключ (28)
- Команда (87)
- Компонент (60)
- Конфигурация (64)
- Корзина (32)
- ЛокальнаяСеть (32)
- Модуль (34)
- Навигация (31)
- Настройка (141)
- ПанельУправле… (29)
- Плагин (33)
- Пользователь (26)
- Практика (101)
- Сервер (75)
- Событие (27)
- Теория (106)
- Установка (66)
- Файл (51)
- Форма (58)
- Фреймворк (192)
- Функция (36)
- ШаблонСайта (68)
WordPress: Хуки
Если хук событий (функция do_action()) существует в коде, работающем на WordPress, то вы можете вставить свой код, вызвав функцию add_action() и передав имя хука события и пользовательскую функцию вместе с кодом, который вы хотите выполнить:
Аргументы функции do_action($tag, $arg)
- $stag — имя выполняемого хука события
- $arg — один или несколько дополнительных аргументов, которые передаются в функцию, вызываемую из функции add_action(), ссылающейся на эту функцию do action()
Вы можете создать свой собственный хук в теме или плагине, добавив свои собственные функции doaction(). Однако проще использовать готовые хуки, уже установленные в WordPress или других плагинах. Например, предположим, что мы хотим проверить, вошёл ли пользователь в систему при первой загрузке WordPress, но перед отображением какого-либо вывода в браузере. Вы можете использовать хук init:
В ядре WordPress есть хук событий do_action(init), и мы вызываем функцию my_user_check() из функции add action(). В любой момент времени, когда код выполняется, если он попадает в хук события init, тот запускает нашу собственную функцию my_user_check(), чтобы выполнить наш код, прежде чем дальше продолжить.
Фильтры
Фильтры являются своего рода хуками событий в том смысле, что вы можете использовать их везде, где они есть в WordPress. Вместо того, чтобы вставлять свой собственный код, где есть хук или функция do_action(), вы фильтруете возвращаемое значение существующих функций, которые вызывают функцию apply_filters в ядре WordPress, плагинах и/или темах. Другими словами, с помощью фильтров вы можете захватить контент до того, как он будет вставлен в базу данных или до того, как он будет отображён в браузере в виде HTML.
В любом месте кода WordPress, где вы видите функцию apply_filters, вы можете фильтровать значение, возвращаемое этой функцией.
Для примера мы собираемся отфильтровать заголовки всех сообщений, прежде чем они будут отображены в браузере. Мы можем подключиться к любым существующим фильтрам через функцию add_filter().
Начнём с добавления фильтра для изменения заголовка любого сообщения, возвращаемого в браузер. Мы знаем о хуке фильтра для the_title, который выглядит так:
// $title — заголовок поста, $id — идентификатор поста apply_filters('the_title’, $title, $id); ?>
Представленный код программы заключает любые заголовки сообщений в квадратные скобки. Обратите внимание, что мы не использовали аргумент $id в нашей пользовательской функции. Если бы мы хотели, то могли бы добавить скобки только для конкретных определённых идентификаторов постов.
Что такое хуки и как их использовать?
В наших шаблонах и плагинах есть хуки, специальные метки, с помощью которых вы можете изменять какие-то значения или добавлять вывод своих блоков. Эти хуки есть и в самом WordPress в больших количествах.
Хуки делятся на 2 типа: события (action) и фильтры (filter).
Фильтры — всегда принимают какое-то значение, могут с ним произвести какие-то манипуляции и должны обязательно его вернуть.
События — просто срабатывают в определенном месте и ничего не должны возвращать, в них обычно выводят какой-то код.
Лучше всего для работы с хуками использовать пустой плагин ProFunctions, либо дочернюю тему.
Пример хука-действия wp_head
В WordPress есть встроенный хук-действие wp_head . Он срабатывает в секции вашего сайта. В него можно вывести любой код, например, код подтверждения Яндекс или фавикон. Вот как это выглядит:
add_action( 'wp_head', function() < echo ''; echo ''; > );
В первой строчке мы используем функцию add_action , которая прикрепляет PHP функцию к хуку wp_head . Внутри функции происходит вывод с помощью PHP-функции echo . Функция только выводит контент и ничего не возвращает. При этом может встречаться и использоваться альтернативный синтаксис:
add_action( 'wp_head', 'add_yandex_and_favicon' ); function add_yandex_and_favicon() < ?> ;
Пример хука-фильтра the_content
Другой пример касается фильтров, они получают какое-то значение, могут с ним что-то сделать и обязательно должны что-то вернуть. Рассмотрим пример хука the_content , который срабатывает перед выводом контента страницы.
add_filter( 'the_content', function( $content ) < // здесь мы можем модифицировать контент // например, мы добавим в конец текста название нашего сайта return $content . 'Рекомендуем WPShop.ru
'; > );
В первой строчке мы используем функцию add_filter , которая прикрепляет PHP функцию к хуку the_content . Эта функция принимает 1 аргумент $content , в котором будет контент записи. Внутри функции мы возвращаем с помощью конструкции return новое значение. Мы можем изменить старое, либо что-то к нему добавить.
В фильтрах не должно быть echo и другого вывода, только return .