Я пытаюсь создать крючок в одном плагине 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: ссылка на функцию / добавление действия
Он работает, хотя возможны кросс-плагины.