web-dev-qa-db-fra.com

Combien de fois puis-je accrocher dans la même action?

J'ai un thème qui inclut une configuration, en utilisant after_setup_theme mais j'aimerais écrire mes propres fonctions qui doivent également exécuter after_setup_theme. Je préférerais garder mes affaires dans un fichier séparé. Puis-je appeler after_setup_theme plusieurs fois?

8
Amanda

Les points d'ancrage WordPress fonctionnent comme Hollywood: vous ne les appelez pas, ils vous appellent. Mais contrairement à Hollywood, ils continuent à appeler tout le monde sur la liste.

Il est normal pour une action ou un filtre d'avoir plusieurs fonctions liées, issues de différents plugins ou même simplement différentes fonctions du noyau WordPress qui font toutes quelque chose de spécifique . C'est non seulement possible, mais même une bonne pratique, car cela signifie que votre code devient plus clair (chaque fonction ne fait qu'une chose) et qu'il est plus facile de désactiver une fonctionnalité spécifique en la décrochant.

Rappelez-vous que vous pouvez également jouer avec les priorités de hooks: si vous voulez exécuter à la fois functionA() et functionB() dans le after_setup_theme, mais que functionA() doit s'exécuter avant functionB(), vous pouvez accrocher functionA() avec la priorité par défaut 10 et functionB() avec la priorité 20 (ou tout autre nombre supérieur à 10). Ce qui ne fonctionnera pas, c'est de lier une autre fonction à une action pendant que cette action est en cours d'exécution . Vous ne pouvez donc pas associer functionB() à after_setup_theme à partir de functionA(), appelé le after_setup_theme. Vous pouvez l'appeler directement, mais vous perdriez l'avantage de l'utilisation d'hameçons séparés.

25
Jan Fabry

Ma suggestion serait d'avoir une fonction "maître", si vous voulez, qui appelle toutes vos autres fonctions. De cette façon, vous ne devez vous accrocher qu'une seule fois à cette action.

add_action( 'after_setup_theme', 'master_function' );
function master_function()
{
    func_a();
    func_b();
    func_c();
    func_d();
    func_e();
}
function func_a(){ /* Do something */}
function func_b(){ /* Do something */}
function func_c(){ /* Do something */}
function func_d(){ /* Do something */}
function func_e(){ /* Do something */}

Cela présente l'avantage supplémentaire de pouvoir renvoyer des valeurs que vous pouvez utiliser lors d'appels de fonction ultérieurs.

6
Aaron Wagner

Oui, vous pouvez ajouter autant d’actions que vous le souhaitez. Juste l'essayer.

4
fuxia