web-dev-qa-db-fra.com

Manière d'utiliser les fonctions dans le crochet d'action?

Je me demande si la logique ci-dessous est correcte et si certaines circonstances devraient être présentes pour que cela fonctionne, car dans certains cas, cela ne semble pas fonctionner.

L'exemple ci-dessous est assez simple. Supposons que je souhaite utiliser une fonction, définie ailleurs dans un fichier lié à un thème, disons parent_theme_hooks.php, via un crochet d'action dans mon functions.php enfant-thème.

parent_theme_hooks.php

function is_enabled(){
    return true;
}

function check_if_enabled(){    
    do_action( 'my_hook', $some, $args );
}

Puis dans le thème enfant functions.php

function my_function($some, $args) {
    if ( is_enabled() ) {
        $message = 'yes';
    } else {
        $message = 'no';
    } 
    echo $message;
}
add_action( 'my_hook', 'my_function', 11, 2 );

Question Ma question est donc de savoir si je peux utiliser la fonction is_enabled() dans le thème enfant functions.php quand elle est définie ailleurs dans le thème parent?

Merci

1
RobbTe

Oui, vous pouvez. Mais il faut être prudent, car des cas particuliers peuvent se produire. Certains d'entre eux sont:

1. La fonction peut être une méthode de classe et non une fonction globale:

class SomeClass {
   ...
   function some_function() { ... }
   ...
}

Dans ce cas, vous ne pouvez l'utiliser que si: - c'est une fonction statique - c'est une méthode publique et vous avez accès à un objet de cette classe.

2. Le fichier avec cette fonction peut ne pas être inclus toujours:

function do_something() {
    if ( condition_met() ) {
        include_once( 'parent_theme_hooks.php' );
    }
}

Dans ce cas, les fonctions de ce fichier ne seront pas toujours accessibles.

3. La fonction peut être déclarée à l'intérieur si l'instruction:

if ( class_exists( 'SomeClass' ) ) {
    function some_function() { ... }
}

Encore une fois - si la classe donnée n'existe pas, la fonction ne sera pas accessible.

4. Le fichier n'est pas encore chargé

Si la fonction est livrée avec un plugin ou un thème, elle peut être déclarée en utilisant un hook d’action.

Dans ce cas, la fonction ne sera pas accessible avant que ce hook ne soit activé.

Un autre exemple de ce cas utilise les fonctions du thème parent dans le thème enfant. Le fichier functions.php du thème parent vient après le même fichier du thème enfant. Vous ne pouvez donc pas utiliser directement les fonctions parent dans le fichier functions.php de thèmes enfants.

Mais...

Vous pouvez améliorer la fiabilité de votre code lorsque vous utilisez ces fonctions:

  1. Essayez toujours de comprendre quand et comment cette fonction est déclarée.
  2. Vérifiez si la fonction existe avec if ( function_exists( 'function_name' ) ) et appelez-la uniquement si c'est le cas. Vous pouvez également proposer une solution alternative (solution de secours), si elle n'existe pas.
2
Krzysiek Dróżdż

Vous pouvez utiliser les fonctions définies dans le thème parent, mais uniquement après le chargement du thème parent. Le thème parent est chargé after votre thème enfant.

Cela signifie que si vous souhaitez utiliser une fonction du thème parent, vous ne pouvez le faire que dans une fonction accrochée à un point d'ancrage sur after_setup_theme ou plus tard .

Votre exemple ne fonctionnera donc que si check_if_enabled() est exécuté après le chargement du thème parent. Si vous essayez d'utiliser cette fonction dans votre thème enfant avant le chargement du thème parent, cela ne fonctionnera pas.

2
Jacob Peattie