2010-06-24 5 views
7

J'essaye de créer un crochet dans un plugin Wordpress qui pourrait être utilisé par d'autres plugins. Tout d'abord, est-ce même possible? J'envoie également des args supplémentaires, donc cela peut être 2 questions en une depuis que j'ai eu du mal à trouver des informations définitives sur la façon de le faire.Crochets personnalisés dans WordPress à travers les plugins

Voici ce que j'ai essayé jusqu'à présent:

Dans le plug-in qui crée le crochet (l'appeler Plugin 1) J'ajouté:

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

au point que je veux que le crochet faire feu. Puis, dans un autre plugin (plugin 2), j'ai ajouté: cependant

add_action('plugin1_hook', 'my_function'); 

et

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

Cela ne semble pas être la fonction de tir,. Mon refence pour cela a été le crochet Wordpress comment_post, qui est défini par Wordpress comme:

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

et je me sers comme:

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

L'extrait ci-dessus fonctionne correctement.

Répondre

5

Je pensais que je poste cela comme une réponse car il est un peu plus clair pour expliquer :)

Lorsque vous accrochez une fonction, mais ne spécifiez pas le nombre d'arguments, WordPress toujours passer de nouveau un argument.

Vous n'obtiendrez pas d'erreurs pour quelque chose comme ceci;

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

Mais vous le ferez pour quelque chose comme ceci;

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

WordPress tente d'appeler do_my_hook(), mais il ne repassant un argument. Le premier exemple utilise PHP default function arguments, de sorte que vous pouvez appeler une fonction sans passer tous les arguments disponibles, mais sans erreur.

Le deuxième exemple déclenchera une erreur PHP 'argument (s) manquant', car les trois arguments sont requis.

Le correctif?

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

L'idée de définir le nombre d'arguments de votre fonction prend est d'éviter des erreurs comme celles-ci (bien que techniquement ils sont aussi facilement évités en utilisant des arguments par défaut!).

0

Je suppose que le second plugin se charge après le premier, donc le hook a déjà été déclenché au moment où vous y ajoutez une action. Vous pouvez essayer cela pour le premier plug-in:

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

Cela attendra jusqu'à ce que tous les plugins sont chargés avant de tirer le crochet.

+0

Ce que je fais utilise un plugin de vote de commentaire et le crochet ne se déclenche pas jusqu'à ce que quelqu'un vote sur un commentaire. Je me demande toujours si l'ordre pourrait affecter les choses bien que - je suppose que l'add_action peut être appelé à tout moment et fonctionnera aussi longtemps que les feux de do_action après. –

+1

C'est à peu près ça Ryan :) La solution de John devrait fonctionner, car elle attend que tous les plugins soient chargés avant de lancer le 'do_action'. – TheDeadMedic

0

Changer mon add_action à cette résolu le problème:

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

Le 10 représente la priorité et le 3 représente le nombre de args que la fonction prendra. Je ne sais pas exactement comment fonctionne la correspondance, puisque la valeur par défaut est 1, et j'utilise beaucoup de hooks sans spécifier 0 args et j'ai utilisé des hooks qui dépassent 1 arg mais n'utilisent que 1 arg dans ma signature de fonction. Source: WordPress Codex: Function Reference/add action

Cela fonctionne cependant, donc crochets croisés sont possibles.

Questions connexes