Кастомные хуки в WordPress через плагины - PullRequest
8 голосов
/ 24 июня 2010

Я пытаюсь создать хук в одном плагине Wordpress, который мог бы использоваться другими плагинами. Во-первых, это вообще возможно? Я также посылаю несколько дополнительных аргументов, так что это может быть 2 вопроса в одном, так как у меня были проблемы с поиском точной информации о том, как это сделать.

Вот что я пробовал до сих пор:

В плагине, который создает хук (назовите его Plugin 1), я добавил:

do_action('plugin1_hook', $customArg1, $customArg2, $customArg3);

в тот момент, когда я хочу, чтобы крюк сработал. Затем в другом плагине (плагин 2) я добавил:

add_action('plugin1_hook', 'my_function');

и

function my_function($customArg1, $customArg2, $customArg3) { //my code }

Однако, похоже, это не срабатывает. Я защищал это от WordPress-хука comment_post, который определяется в Wordpress как:

do_action('comment_post', $comment_ID, $commentdata['comment_approved']);

и я использую как:

add_action('comment_post', 'my_comment'); 
function my_comment($comment_id) { //my code }

Приведенный выше фрагмент работает нормально.

Ответы [ 3 ]

5 голосов
/ 25 июня 2010

Я думал, что выложу это как ответ, так как немного понятнее объяснить:)

Когда вы перехватываете функцию, но не указываете количество аргументов, WordPress всегда возвращает один аргумент.

Вы не получите ошибок за что-то подобное;

function do_my_hook($arg1, $arg2 = '', $arg3 = '') {}
add_action('my_hook', 'do_my_hook');

Но вы будете за что-то вроде этого;

function do_my_hook($arg1, $arg2, $arg3) {}
add_action('my_hook', 'do_my_hook');

WordPress пытается вызвать do_my_hook(), но передает только один аргумент. В первом примере используются аргументы функции PHP по умолчанию , так что вы можете вызывать функцию без передачи всех доступных аргументов, но без ошибок.

Второй пример вызовет ошибку PHP «отсутствующий аргумент (ы)», так как требуются все три аргумента.

Исправление?

add_action('my_hook', 'do_my_hook', 10, 3);

Идея определения количества аргументов, принимаемых вашей функцией, заключается в том, чтобы избежать подобных ошибок (хотя технически их так же легко избежать, используя аргументы по умолчанию!).

1 голос
/ 24 июня 2010

Я предполагаю, что второй плагин загружается после первого, так что хук уже сработал, когда вы добавили к нему действие. Вы можете попробовать это для первого плагина:

function my_custom_hook_insertion($arg1, $arg2, $arg3){
  do_action('plugin1_hook', $arg1, $arg2, $arg3);
}
add_action('plugins_loaded', 'my_custom_hook_insertion');

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

0 голосов
/ 24 июня 2010

Изменение моего add_action для решения этой проблемы:

add_action('plugin1_hook', 'my_function', 10, 3);

10 представляет приоритет, а 3 представляет количество аргументов, которые примет функция. Я не совсем уверен, как работает сопоставление, поскольку по умолчанию установлено значение 1, и я использую множество хуков, не указывая 0 аргументов, и я использовал хуки, которые передают более 1 аргумента, но использовали только 1 аргумент в сигнатуре своей функции. Источник: Кодекс WordPress: Справочник по функциям / Добавить действие

Хотя это работает, поэтому возможны перекрестные зацепки плагинов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...