web-dev-qa-db-fra.com

Quel est un bon moyen de passer une variable de add_action à un thème?

À l'intérieur de functions.php:

add_action('init','my_action');

function my_action() {
    if($dontknow) {
        $passme = "yes";
    } else {
        $passme = "no";
    }
}

Dans index.php du thème actuel:

echo $passme;

Y at-il un global à utiliser à cette fin? Dois-je utiliser add_option (ce n'est pas une bonne idée pour chaque demande, je suppose)? Dois-je utiliser une variable globale personnalisée?

Y a-t-il un moyen meilleur/habituel/standard de le faire?

3
Blackbam

Utilisez un objet pour conserver la valeur de la variable et une action personnalisée pour l’imprimer.

Dans le functions.php de votre thème, créez une classe, ou mieux: déplacez la classe dans un fichier séparé.

class PassCheck
{
    private $passed = 'no';

    public function check()
    {
        if ( is_user_logged_in() )
            $this->passed = 'yes';
    }

    public function print_pass()
    {
        echo $this->passed;
    }
}

Puis enregistrez les rappels:

$passcheck = new PassCheck;
add_action( 'init',       [ $passcheck, 'check' ] );
add_action( 'print_pass', [ $passcheck, 'print_pass' ] );

Et dans votre modèle, appelez l'action appropriée:

do_action( 'print_pass' );

De cette façon, le modèle n'a pas de dépendance statique sur la classe: si vous décidez de supprimer la classe ou d'enregistrer un rappel complètement différent pour cette action, le thème ne sera pas interrompu.

Vous pouvez également déplacer le rappel check() vers une autre action (comme wp_loaded) ou le séparer ultérieurement dans une autre classe.

En règle générale, les modèles (vues) doivent être autant que possible dissociés de la logique métier. Ils ne devraient pas connaître les noms de classe ou de fonction. Ce n’est pas tout à fait possible dans l’architecture de WordPress, mais reste une bonne idée de régulation.

10
fuxia

Cela dépend vraiment du cas d'utilisation. Tout ce qui écrit dans la base de données est probablement excessif. Les globales sont en désordre. Vous pouvez définir une constante. Vous pouvez transformer la fonction en méthode de classe et créer une méthode supplémentaire pour renvoyer la variable. Vous pouvez seulement cocher $passme quand c'est nécessaire, au lieu d'init.

2
vancoder

Sans plus de détails, il est difficile de juger, mais vous avez l’impression que vous avez mal écrit my_action et que vous essayez de faire trop de choses.

Le hook init devrait être utilisé uniquement pour initialiser tout ce dont vous avez besoin, vous ne devriez pas précalculer les valeurs qu'il contient. Cela devrait être fait uniquement lorsque le besoin s'en fait sentir.

Vous devriez simplement avoir une fonction appelée print_pass et l'appeler partout où vous en avez besoin.

Faire trop avec le hook init viole le principe du retardement de l'exécution du code autant que possible. Dans ce cas, le hook init exécutera votre logique passme même lors de la gestion d'un administrateur dans lequel cette valeur n'est pas nécessaire.

En ce qui concerne la réponse de @ toshco, oui, si vous avez une logique qui pourrait être mieux décrite avec des objets, alors print_pass devrait probablement être une méthode de la classe, mais le système de hook wordpress est de nature fonctionnelle, et il n’est pas nécessaire d’utiliser OOP quand l'approche fonctionnelle sera suffisante. Fonctionnel est simplement plus lisible dans le fonctionnement du système de hook wordpress.

1
Mark Kaplun