Разница между do_action и add_action

28 окт. 2013 г., 12:35:05
Просмотры: 58.8K
Голосов: 27

Возможно, этот вопрос неправильный, я не уверен в этом, поскольку для меня это не совсем понятно.

Я знаю, что 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');
4
Комментарии

Что происходит, когда вы вызываете do_action('custom'); после регистрации колбэка? И убедитесь, что jQuery загружен.

fuxia fuxia
28 окт. 2013 г. 13:07:32

Я не получил alert-сообщение ни в админке, ни на фронтенде

sun sun
28 окт. 2013 г. 13:12:08

jQuery загружен. Когда я подключаю ту же функцию к wp_head, всё работает нормально, но с custom не работает

sun sun
28 окт. 2013 г. 13:28:03

Сан, я считаю, что твой первоначальный вопрос был ответлен toscho, и ты должен отметить его как решённый. Правки #3 и #4, которые ты сделал, должны быть в новом вопросе.

brasofilo brasofilo
30 окт. 2013 г. 15:32:09
Все ответы на вопрос 4
3
21

Используйте do_action( 'unique_name' ) для создания собственных действий.

Вы можете использовать это для предоставления API вашего плагина, чтобы другие плагины могли регистрировать callback-функции для вашего пользовательского действия. Пример: Нужно ли вызывать do_action в моем плагине?

Но вы также можете использовать пользовательские действия (или фильтры) в теме. Пример: Лучший способ реализации пользовательских разделов в теме WordPress

И вы можете комбинировать оба подхода, чтобы заставить плагин и тему работать вместе. Пример: Как сделать метод из плагина доступным в теме?

Итог: add_action( 'foo' ) регистрирует callback-функцию, do_action( 'foo' ) выполняет эту зарегистрированную callback-функцию.

28 окт. 2013 г. 12:42:43
Комментарии

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

sun sun
28 окт. 2013 г. 13:07:58

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

sun sun
28 окт. 2013 г. 14:11:38

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

fuxia fuxia
28 окт. 2013 г. 14:19:46
0

Это моё предположение, так что если вы знаете лучше, пожалуйста, оставьте комментарий, чтобы я мог обновить своё предположение.

Код вашего плагина выполняется до 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 уже был вызван.
14 февр. 2016 г. 21:23:47
1

do_action: Регистрирует хук действия, тогда как add_action: добавляет callback-функцию к зарегистрированному хуку.

Пример

Допустим, вы хотите вывести что-то перед сайдбаром в вашем шаблоне.

  1. Вы добавите хук действия в файл шаблона index.php с помощью <?php add_action('bp_sidebar_left'); ?>.
  2. Теперь в файле functions.php вы можете добавить callback-функцию к этому хуку, чтобы вывести нужный текст.

add_action('bp_sidebar_left', 'bp_sidebar_left_cb'); function bp_sidebar_left_cb() { echo 'Hello World !'; }

19 апр. 2018 г. 09:10:05
Комментарии

Что означает "зарегистрировать хук"? Где он регистрируется?

Cornelius Cornelius
25 янв. 2021 г. 07:08:17
1
-1

Вам нужно использовать следующим образом:

function custom_register()
{
    echo '<script>jQuery(document).ready(function(){alert("Изучаем хуки");});</script>';

}
.

add_action('custom','custom_register'); // Слишком поздно - do_action уже был вызван
do_action('custom');                    // Это вызывается до того, как будет иметь эффект
1 февр. 2017 г. 18:15:51
Комментарии

Это работает у меня

user112289 user112289
1 февр. 2017 г. 18:16:37