Разница между do_action и add_action
Возможно, этот вопрос неправильный, я не уверен в этом, поскольку для меня это не совсем понятно.
Я знаю, что add_action
используется для привязки нашей функции к указанной функции. Например, add_action('wp_head','myfunc');
- теперь весь код в myfunc
будет выполняться в wp_head()
. Это понятно, но у меня есть сомнения по поводу do_action
- что она делает?
Я думаю, что она используется для создания наших собственных хуков, как уже доступные хуки (wp_head, wp_footer и т.д.). Если я прав, может кто-нибудь показать мне простой понятный ответ с простым примером?
Я искал различия в интернете, но везде указывают на разницу между add_action и add_filter. Я не хочу углубляться в это, потому что сначала хочу прояснить этот вопрос, а затем перейду к следующему.
Кто-нибудь может помочь?
РЕДАКТИРОВАНИЕ после публикации вопроса
function custom_register()
{
echo '<script>jQuery(document).ready(function(){alert("Изучаем хуки");});</script>';
}
do_action('custom');
add_action('custom','custom_register');
Я попробовал это в плагине, но не получил сообщение с оповещением.
Но когда я привязал ту же функцию к wp_head
, тогда всё работает нормально
/******************работает****************/
add_action('wp_head','custom_register');
Используйте do_action( 'unique_name' )
для создания собственных действий.
Вы можете использовать это для предоставления API вашего плагина, чтобы другие плагины могли регистрировать callback-функции для вашего пользовательского действия. Пример: Нужно ли вызывать do_action в моем плагине?
Но вы также можете использовать пользовательские действия (или фильтры) в теме. Пример: Лучший способ реализации пользовательских разделов в теме WordPress
И вы можете комбинировать оба подхода, чтобы заставить плагин и тему работать вместе. Пример: Как сделать метод из плагина доступным в теме?
Итог: add_action( 'foo' )
регистрирует callback-функцию, do_action( 'foo' )
выполняет эту зарегистрированную callback-функцию.

Спасибо за помощь, я получил это в основном для целей API. Я попробовал пример, но он не сработал. Можете ли вы найти там проблему? Проверьте мой EDIT @toscho

Можем ли мы рассматривать это как ещё один случай, подобный наследованию? Вместо расширения и переопределения класса мы идём этим путём. Это правильно?

@sun Хм, да, но вы можете комбинировать оба подхода, они не исключают друг друга.

Это моё предположение, так что если вы знаете лучше, пожалуйста, оставьте комментарий, чтобы я мог обновить своё предположение.
Код вашего плагина выполняется до wp_head()
(что, как мы можем предположить, вызовет действия, добавленные к нему). Когда вы используете add_action('wp_head','custom_register')
, вы указываете PHP, что когда (в будущем) будет вызван do_action('wp_head')
, следует также вызвать custom_register()
. То же самое относится и к вашему вызову add_action('custom','custom_register')
, но, как видно из вашего кода, вызов do_action('custom')
уже был выполнен, и на момент его вызова не было (ещё) никакого действия, добавленного к нему.
Вот почему Toscho спросил, что произойдёт, если вызовете do_action('custom')
после регистрации колбэка. Ваш ответ о бэкенде и фронтенде неоднозначен. Если поменять местами последние две строки в следующем коде, я думаю, это сработает:
function custom_register()
{
echo '<script>jQuery(document).ready(function(){alert("Learning Hooks");});</script>';
}
do_action('custom'); // Этот вызов выполняется до того, как он сможет иметь эффект.
add_action('custom','custom_register'); // Слишком поздно — do_action уже был вызван.

do_action
: Регистрирует хук действия, тогда как
add_action
: добавляет callback-функцию к зарегистрированному хуку.
Пример
Допустим, вы хотите вывести что-то перед сайдбаром в вашем шаблоне.
- Вы добавите хук действия в файл шаблона
index.php
с помощью<?php add_action('bp_sidebar_left'); ?>
. - Теперь в файле
functions.php
вы можете добавить callback-функцию к этому хуку, чтобы вывести нужный текст.
add_action('bp_sidebar_left', 'bp_sidebar_left_cb');
function bp_sidebar_left_cb() {
echo 'Hello World !';
}

Вам нужно использовать следующим образом:
function custom_register()
{
echo '<script>jQuery(document).ready(function(){alert("Изучаем хуки");});</script>';
}
.
add_action('custom','custom_register'); // Слишком поздно - do_action уже был вызван
do_action('custom'); // Это вызывается до того, как будет иметь эффект
