Пользовательские перехватчики в WordPress через плагины

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

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

В плагине, который создает крючок (назовите его «Плагин 1»), я добавил:

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

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

 add_action('plugin1_hook', 'my_function'); 

а также

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

Однако, похоже, это не срабатывает. Моим подтверждением для этого является Word_post для WordPress, который определяется WordPress как:

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

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

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

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

Я думал, что я опубликую это как ответ, потому что немного пояснее объяснить 🙂

Когда вы подключаете функцию, но не указываете количество аргументов, 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); 

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

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

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

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

Изменение моего add_action для этого устранило проблему:

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

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

Он работает, хотя возможны кросс-плагины.