Возможно я не совсем правильно написал названия этих вещей в заголовке, но я сейчас объясню вам почему.
Хук (hook) — означает крючок.
Где-то в самом коде движка WordPress или в плагине или даже в теме есть крючки, на которые мы можем повесить свой код, никак не затрагивая при этом основные файлы WordPress или же файлы плагина. Тем самым вы сможете спокойно обновлять плагины и движок, а ваш код, подвешенный на эти крючки будет находиться где-то в отдельном месте.
Наши хуки будут делиться на два вида: фильтры и действия.
Также я встречал много кода, где на хук вешается анонимная функция, хотя я и не рекомендую её использовать по нескольким причинам (требуется PHP 5.3.0, некорректно работают с PHP ускорителями, невозможность отмены такого хука функцией remove_filter() или remove_action()), но просто знать, что она существует и как выглядит — стоит.
Также я бы порекомендовал вам текстовый редактор с поиском по файлам в папке, например TextWrangler для Mac OS или Notepad++ для Windows.
Делается это в принципе при помощи двух функций — apply_filters() и add_filter().
$x = apply_filters( 'misha_filter', $x );
functions.php
мы создаём функцию с произвольным названием, аргумент функции — переменная $x
, внутри функции выполняем с ней все необходимые действия и в конце концов возвращаем результативную переменную. Затем, рядом с функцией вызываем add_filter(), в которой в качестве параметров указываем название фильтра и название нашей произвольной функции. Меньше слов, больше дела — вот как это может выглядеть:
function misha_function( $x ) { $x = '<strong>' . $x . '</strong>'; // если переменная текстовая, мы просто сделали текст жирным шрифтом return $x; // возвращаем } add_filter( 'misha_filter', 'misha_function' );
header.php
выведите переменную $x
и перед выводом примените к ней фильтр, а в файле functions.php
этот фильтр и наложите.Возможно вы уже где встречали этот пример — он есть в официальной документации WordPress, да и я о нём уже упоминал.
Скажите, то содержимое поста, которое находится у вас в редакторе в админке и то, которое выводится на сайте одно и то же или отличается?
Вероятно, это одна из тех вещей, которая фильтруется больше всего, при помощи фильтра 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( 'misha_hook' );
functions.php
вашем темы. То есть открываем functions.php
, создаём там произвольную функцию, затем рядом с ней (не в ней!) выполняем функцию add_action(), в которой указываем название хука и название произвольной функции.
function misha_function2(){ echo 'Hello World!'; } add_action( 'misha_hook', 'misha_function2');
Ну разве не простой механизм?
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_action() и remove_filter() это абсолютно одно и то же. То же самое касается функций полной очистки хука.
Теперь, зная основы, вы можете поискать примеры прямо у меня на блоге.
Под постом есть ссылки на другие руководства по ключевым темам WordPress.
И конечно, если вам что-то непонятно — отвечу на ваш вопрос или помогу с кодом в комментариях к посту.
Благодарю Миха, решил окончательно закрепить понятие хуков, фильтров и знаешь как я задавал поиск ?!) хуки Миша Рудрастых )))
Огонь! 🔥🙃
Добрый день! А что делать в случае отсутствия фильтра в "нужном" месте? Например, в Woocommerce в виджете "Активные фильтры" (\wp-content\plugins\woocommerce\includes\widgets\class-wc-widget-layered-nav-filters.php) apply_filters отсутствуют. Но очень хочется модифицировать верстку.
Как правильно поступить в данной ситуации?
Заранее спасибо!
Добрый день!
Если фильтры отсутствуют, то творческий подход
Подскажите, если у хука предусмотрен один аргумент, а мне в эту функцию надо передать свой дополнительно, то как это решается?
Никак
Здравствуйте, подскажите пожалуйста как выполнить мою функцию с параметрами (которые я сам передаю) при срабатывания Хука?
Здравствуйте, если я правильно вас понял: