web-dev-qa-db-fra.com

Impossible d'invoquer un autre hook à partir du hook init

Lié à cette question ( Utilisez le crochet d’installation wp pour appeler d’autres crochets? ), mais pas la même chose.

Parfois, j’ai constaté que le hook ne fonctionnait pas lorsque je le plaçais dans le hook d’initialisation, par exemple.

Pas de travail:

add_action('init','my_init');
function my_init() {
    add_filter('locale', ...
}

Travail:

add_action('init','my_init');
add_filter('locale', ...

Bien sûr, certains hooks/filtres fonctionneront correctement dans le hook d’initialisation, mais ne seront certainement pas tous.

Il me semble donc que est une mauvaise pratique pour enchaîner des actions/filtres ensemble?

1
Yoga

Le hook locale se produit bien avant init. Pour savoir quand un hook, une variable, une constante, une fonction, une classe ou un fichier est disponible, installez mon plugin T5 WP Load Order .

Vous obtenez un fichier looong avec un journal très détaillé. Recherchez Hook: locale, puis Hook: init. Vous verrez que vous avez besoin de plugins_loaded en tant qu'action parent si vous souhaitez chaîner des points d'ancrage.

Est-ce une bonne pratique? Ça dépend. Si vous avez besoin du second rappel uniquement lorsque le premier a réussi, alors yes . Si les deux callbacks doivent s'exécuter indépendamment l'un de l'autre, alors no .
L’enchaînement doit refléter la logique de votre programme.

4
fuxia

L'accrochage à un crochet à l'intérieur d'un rappel d'un autre crochet n'est pas une mauvaise pratique, bien au contraire, il est parfois obligatoire. Le problème est que vous devez être conscient de la séquence d'actions et de filtres, car vous pouvez essayer d'invoquer une action pendant que vous exécutez autre chose après la première action (votre second hook est donc déjà exécuté et il est trop tard pour les nouvelles actions associées). événements).

2
Mario Peshev