Что правильнее использовать – add_action или функцию, например, для вывода (вызова) некой информации..? Следует начать с того, что экшн ( add_action
) тоже функция. И вообще, наверное несколько неправильная постановка вопроса “что правильнее использовать…”? Наши действия в полной зависимости от наших требований.
Записи этой заметки послужило письмо одного из моих подписчиков, тот, в восторженной форме, сообщал мне об одном своём открытии… именно он и спросил, что лучше использовать для вывода рекламных блоков на своем сайте: add_action
или функцию – function
? Потому как он обнаружил некоторые особенности, если использовать фильтры.
Но давайте по порядочку…
Работа и использование add_action
Начну с того, что поясню об открытии подписчика:
У него на сайте, как оказалось, присутствовал баг. Не работал плагин Сontact-form-7, а именно не отправлялись письма, сообщалось что отправка невозможна (он подозревал, что ошибка в его шаблоне)!
…начал копать: отключать по очередности функции в файле functions.php
, чтобы таким образом выявить причину. Однако, оказалось, что это не так-то и просто. При отключении (комментрировании кода функции) сайт просто-напросто падал белым экраном…
Совершенно верно! если в файлах шаблона инициализируется вызов функции, то при отключении, скажем так, самой функции в functions.php – сайт упадет!!
Нужно закомментровать вызов функции в самом файле шаблона – к примеру, в category.php
и пр, чтобы проверить и чтобы сайт не упал.
Это и вызвало трудности… при отыскивании ошибки.
…им было совершенно верно замечено, что, если закомментировать фильтр add_action
и при этом в файлах шаблона установлены крючки (хуки), то сайт будет продолжать работать как ни в чём не бывал.
add_action запускает функцию в месте указанного хука
add_action
работает в связке с функцией do_action()
– (или наоборот, кому как угодно, по сути сегодня это не важно)
Возвратит true
если хук успешно зарегистрирован, и – false
, если нет.
Поэтому, например, при продумывании тех мест, в которых предположительно будет хук (вызов) функции блоков рекламы, для начала устанавливаются эти самые хуки. А уж после к ним можно привязывать какую-то требуемую информацию.
Как понимаете, ПУСТОЙ хук не приведет к поломке сайта. Вот это обстоятельство и выяснил для себя мой подписчик. Это замечательное отличие экшн от простой функции его порадовало!..
Итак, самый простейший хук в файлах шаблона указывается так (возможно использовать в сайдбаре – виджетах, однако, для текстовых виджетов должно быть разрешение отработки шорткодов и php
, по ссылке всё чётко, как это сделать, описано):
do_action( 'my_sydy' );
my_saydy
– имя хука должно быть непременно уникальным!! также нельзя использовать уже используемые хуки Вордпресс. Такие, например, как wp_head
или wp_footer
– словом, придумывайте заковыристые и понятные для себя: например, добавляйте часть имени домена как составляющую.
как использовать – add_action для вывода (вызова) на экран информации
Создадим простую функцию и свяжем с add_action
:
add_action( 'my_sydy', 'add_my_syte_sydy' );
function add_my_syte_sydy() {
// здесь информация... код и пр.
}
Напоминаю, my_sydy
– хук должен быть уникальным!!
…вызываем:
<?php
do_action( 'my_sydy' );
?>
Таким образом, при последующем использовании, возможно к указанному хуку привязать и ещё какую-то дополнительную информацию…
Создадим ещё новую функцию:
add_action( 'my2_sydy', 'add_mih_ss_syte' );
function add_mih_ss_syte() {
echo 'например, код рекламы';
if (is_super_admin( $user_ID )) {
echo 'пояснения для админа';
} }
выполняем в шаблоне:
do_action( 'my2_sydy' );
Что имеем:
Выведет на экран информацию для читателей и пояснения для админа сайта.
Как видите используем условие (условные теги WordPress и условные теги WooCommerce): только для администратора.
Это всего-лишь пример.
Что интересно (ниже подробный пример шаблона использования add_action
), при выводе дополнительной информации – к примеру, блок рекламы Google и Яндекс – возможно играть приоритетами, то есть указать, какой блок выводится первым, а какой вторым:
add_action( 'my2_sydy', 'add_my_ss_syte', 10 );
function add_my_ss_syte() {
инфа;
}
add_action( 'my2_sydy', 'add_my2_ss_syte', 20 );
function add_my2_ss_syte() {
инфа 2;
}
То есть, если к одному и тому же хуку будет и ещё какая-то экшн привязка, приоритеты отрабатывают так:
10 – выполнится раньше, а 20 – позже…
Также, например, если создать произвольную страницу настроек в своей теме, то выполнение/НЕ выполнение отработки вызова хука легко и просто связать с чекбоксами. …или как-то что-то ещё организовать… – всё от наших требований и желаний.
небольшое отступление:
принципиально add_action похоже с организацией шорткодов – add_shortcode
Функция шорткода создаётся (определяется) таким примерно образом:
add_shortcode('name_name', 'mihalica_name');
function mihalica_name() {
// здесь информация... код и пр.
}
вызов отработки информации шорткода в файлах шаблона (в виджете):
<?php echo do_shortcode( '[name_name]' ); ?>
шаблон использования add_action
add_action( $tag, $function_to_add, $priority, $accepted_args );
$tag – (строка) – обязательный.
Имя (или название) действия, к которому прицепляется функция (или – событие).
$function_to_add – (строка/замыкание) – обязательный.
Имя функции, которая должна быть вызвана во время срабатывания действия, т.е. функция цепляемая к хуку. Обычно формат передачи функции – “строка”.
$priority – (число)
Приоритет очередности выполнения функций. Если на текущий хук прицеплены и еще какие-то функции, тогда их приоритетность выполнения решается числовым значением. Как и говорил выше: чем меньше число, тем более раннее выполнение.
По умолчанию: 10
$accepted_args – (число)
Число аргументов, которые принимает функция. …действие должно передавать число аргументов.
По умолчанию: 1
Код экшн функции находится по такому пути в ядре WP:
wp-includes/plugin.php
Как эпилог:
Таким образом выясняется, что вопрос “что правильнее использовать.?.” – несколько неверен!
Использования того или иного варианта, при вызове информации на лицевой стороне сайта, в прямой зависимости от наших желаний и требований.
mihalica.ru !