Utiliser wp init hook pour appeler d'autres hooks?

11

Je veux savoir si c'est une bonne pratique selon le thème WordPress ou le développement de plugins.

add_action('init','all_my_hooks');

function all_my_hooks(){

// some initialization stuff here and then

add_action('admin_init',-----);
add_action('admin_menu',----);

// more like so

}

Merci

atinder
la source

Réponses:

16

En général: Oui, attendez qu'un hook dédié démarre votre propre code. Ne jetez jamais une instance d'objet dans l'espace de noms global. Mais initest rarement nécessaire.

Vous vous connectez le plus tard possible. Si votre premier code s'exécute, wp_headn'utilisez pas de hook antérieur. Vous pouvez même mettre en cascade des crochets :

add_action( 'wp_head', 'first_callback' );

function first_callback()
{
    // do something
    // then
    add_action( 'wp_footer', 'second_callback' );
}

Concernant le initcrochet: utilisez wp_loadedplutôt. Cela s'exécute après initet a ms_site_check()été appelé. De cette façon, vous évitez d'exécuter votre plug-in sur un sous-site non valide dans une installation multisite. Tout le reste est identique.

fuxia
la source
3
+1 pour wp_loadedet MS info.
kaiser
merci beaucoup pour votre réponse, encore un doute, qui vaut mieux charger tous les autres crochets à l'intérieur de wp_loaded ou les charger séparément? Je me demande si j'ajoute des hooks dans wp_loaded, ils seront accrochés plus tôt au lieu d'être accrochés après admin_init ou admin_menu?
au
crochets en cascade n'est pas un problème?
au
Non, pourquoi devrait-il en être ainsi? Appelez le deuxième crochet uniquement si le premier vous a été utile.
fuxia
3

Je ne vois pas les grands avantages de cette pratique, pour ces raisons:

Vos fonctions de rappel ne sont pas appelées lors de l'enregistrement

Les fonctions add_actionet add_filterajoutent uniquement une entrée à la variable globale $wp_filterqui contient tous les filtres et actions. Voir source . Il n'appelle pas votre fonction. Votre code ne s'exécutera que lorsque les do_actionet apply_filtersseront appelés (avec le nom de hook approprié), ce qui se produit très tard à l'endroit où ces hooks devraient être.

Vous pourriez dire que cela rendra la variable globale $wp_filterplus grande => plus de mémoire requise. Mais je pense que la création d'une nouvelle fonction a le même problème.

Code d'organisation

Tout mettre dans une seule fonction vous oblige à vous souvenir de tous les crochets dans tous les fichiers de votre thème / plugin. Vous ne feriez pas quelque chose comme ça:

  • dans header.php: ajouter des crochets et des fonctions de rappel pour que les choses se passent dans l'en-tête (comme le menu, le script d'enregistrement)
  • dans content.php: ajouter des hooks et des fonctions de rappel pour filtrer le contenu
  • admin-menu.php: ajouter des hooks et des fonctions de rappel pour ajouter le menu admin

(supposez que ces fichiers sont placés dans votre thème / plugin)

Au lieu de cela, vous devez:

  • mettre les fonctions que rappel dans header.php, content.php,admin-menu.php
  • et mettre tous les crochets dans une fonction séparée dans un autre fichier

=> Cela vous rendra difficile de savoir ce qui se passe lorsque vous regardez le contenu du header.phpfichier. Vous devez rechercher pour savoir quand ces rappels sont déclenchés.

Et pensez à la situation lorsque vous avez plusieurs classes dans votre thème / plugin. Mettez-vous tous les crochets de toutes les classes au même endroit? Ou chaque classe a-t-elle une fonction wrapper qui contient tous les crochets? C'est trop redondant!

Au-dessus de ces raisons, je pense que c'est un style personnel :). Je vois que certains frameworks comme Hybrid font ce que vous avez dit. Parfois, cela me rend difficile de creuser dans ces cadres!

Anh Tran
la source