web-dev-qa-db-fra.com

Obtention de la variable d'instance dans la portée de 'wp_enqueue_scripts'

J'ai besoin d'un peu d'aide pour passer ma tête et passer l'instance variable à un crochet.

Je lis dynamiquement les fichiers CSS dont j'ai besoin dans mon modèle et les stocke dans un objet $settings que je conserve dans la portée de mon espace de noms de plug-in.

Donc, je veux faire quelque chose comme ça:

add_action( 'wp_enqueue_scripts',function() {
    \mynamespace\ScriptQueuer::QueueCss($settings->GetCss());
} );

mais il est évident que je dois transmettre la valeur de retour $settings->GetCss() dans le champ d'application.

Est-ce que je rends mon objet $settings global en quelque sorte? Je ne sais pas comment faire cela et je ne suis pas sûr que ce soit la meilleure approche. Y at-il un moyen d’y parvenir ou faut-il que tous les fichiers CSS soient codés en dur dans une fonction statique?

5
Guerrilla

Le meilleur moyen de résoudre ce problème est de simplifier votre code. À l’heure actuelle, ScriptQueuer::QueueCss() n’est qu’une méthode statique et les données lui parviennent trop tard.

Vous pouvez utiliser un objet immuable à la place, puis enregistrer simplement l'une de ses méthodes en tant que rappel.

Exemple:

class Enqueuer {

    private $stylesheets;

    public function __construct( ArrayObject $stylesheets ) {

        $this->stylesheets = $stylesheets;
    }

    public function enqueue() {

        foreach ( $this->stylesheets as $stylesheet )
            wp_enqueue_script(
                $stylesheet->handle(),
                $stylesheet->url(),
                $stylesheet->dependencies(),
                $stylesheet->version(),
                $stylesheet->in_footer()
            );
    }
}

add_action( 'wp_enqueue_scripts', [
    new Enqueuer( $settings->GetCss() ),
    'enqueue'
] );

Pas besoin de passer des données à la méthode de mise en file d'attente, pas besoin de fermeture, et le code est facile à lire.

5
fuxia