2010-06-24 2 views
7

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

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

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

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

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

add_action('plugin1_hook', 'my_function'); 

и

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

Это не кажется, не стреляя функцию, однако. Мой refence для этого был крючок comment_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 } 

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

ответ

5

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

Если подключить функцию, но не указать количество аргументов, 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 default function arguments, так что вы можете вызывать функцию без передачи всех доступных аргументов, но без ошибок.

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

Исправить?

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

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

0

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

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

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

+0

Что я делаю, это использовать плагин для голосования комментариев, и крючок не срабатывает, пока кто-то не проголосует за комментарий. Мне все еще интересно, может ли порядок повлиять на вещи, хотя я предполагаю, что add_action может быть вызван в любое время, хотя и будет работать до тех пор, пока do_action срабатывает. –

+1

Это в значительной степени это Райан :) Решение Джона должно работать, потому что он ожидает, что все плагины будут загружены до запуска 'do_action'. – TheDeadMedic

0

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

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

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

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

Смежные вопросы