web-dev-qa-db-fra.com

Utilisation de plusieurs add_action avec des paramètres dans une classe

Je crée un cadre de thème et j'utilise une classe pour lancer toutes les fonctions de base du thème (ajout d'un support de thème, menus, etc.). Je suis bloqué quand j'ai essayé de mettre en file d'attente les scripts et les styles:

J'utilise add_action( 'init', array(&$this, 'EnqueueScrits'), 10, 1); et do_action( 'init', $enqueued ); pour appeler la méthode avec le paramètre $ en file d'attente. Cela fonctionne très bien, cependant, lorsque j'essaie d'utiliser la même technique pour ajouter wp_enqueue_style, les $ param deviennent confus (les $ param pour les scripts sont également utilisés pour les styles).

Ma solution était alors de créer une réaction en chaîne à la première add_action comme ceci:

mais alors rien ne se passe et l'action n'est pas appelée du tout (il semble que ça en tout cas). Est-ce que quelqu'un connaît une meilleure solution pour cela ou qu'est-ce qui me manque?

EDIT: Voici le code complet. Ma classe:

class Nomade
{

    public function __construct($menus, $features, $enqueued, $styled)
    {

        // Define base constants
        define('THEME_FRAMEWORK', 'nomade');
        define('NOMADE_VERSION', '1.0');

        // Define directories
        define('NOMADE_DIR', get_template_directory());
        define('NOMADE_LIB_DIR', get_template_directory() . '/library');

        $this->AddThemeSupport($features);
        $this->MenuBuilder($menus);

        // Add support for WordPress features
        add_action('after_setup_theme', array(__CLASS__, 'MenuBuilder'));
        add_action( 'after_setup_theme', array(__CLASS__, 'AddThemeSupport'));
        add_action( 'init', array(&$this, 'EnqueueScrits'), 10, 1);

        do_action( 'init', $enqueued );

    }

    public function AddThemeSupport($features)
    {

        if(is_array($features))
        {

            foreach ($features as $feature) {

                add_theme_support($feature);

            }

        }

    }

    public function MenuBuilder($menus)
    {

        if (is_array($menus)) {

            foreach ($menus as $location => $name) {

                register_nav_menus(array(

                    $location => $name

                ));

            }

        }

    }

    public function EnqueueScrits($enqueued)
    {

        if (is_array($enqueued)) {

            foreach ($enqueued as $value) {

                wp_enqueue_script( $value["name"], $value["location"], array("jquery"), $value["version"], true );

            }

        }

    }

}

Et voici comment j'instancie l'objet (dans un fichier séparé):

<?php

// Depedencies: menu registrer and builder
include('application.class.php');

// Set menus
$menus = array( 'main_menu' => 'Main Menu', 'footer_menu' => 'Footer Menu', 'side_menu' => 'Sidebar Menu' );

// Set theme features
$features = array( 'menus', 'custom-background', 'custom-header', 'post-thumbnail' );

// Register scripts array
$register = array( 'scripts' => 'NOMADE_DIR' . '/js/scripts.js' );

// Enqueue scripts array
$enqueued = array(  
    array("name" => "general", "location" => get_template_directory_uri() . '/js/general.js', "version" => 1)
);

$styled = array(
    array("name" => "main", "location" => "lac1", "version" => 2, "media" => "all")
);

// Instantiate Nomade (main application)
$Nomade = new Nomade($menus, $features, $enqueued, $styled);

Merci pour l'aide à l'avance

1
WagnerMatosUK

L'action init ...

est l'un des nombreux actions principales de WordPress . Par conséquent, il n’exige pas, c’est-à-dire ne doit pas être accompagné d’un appel manuel do_action .

Il vous suffit d’exécuter manuellement do_action des crochets d’action personnalisés, jusqu’à présent inexistants.

De plus, init n’est pas l’action à laquelle vous voulez raccrocher le script en mise en file d'attente. Il y a une action spécifiquement à cette fin .

Ta situation

if ( ! class_exists( 'WPSE_Your_Class' ) ) :
class WPSE_Your_Class
{

    private $enqueued = array();

    public function enqueue_all_scripts()
    {
        if ( is_array( $this->enqueued ) && ! empty( $this->enqueued ) ) {
            foreach ( $this->enqueued as $script ) {
                wp_register_script(
                    $script['handle'],
                    $script['src'],
                    array( 'jquery' ),
                    $script['version'],
                    true
                );
                wp_enqueue_script( $script['handle'] );
            }
        }
    }

    public function __construct( $enqueued = array() )
    {
        $this->enqueued = $enqueued;
        add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_all_scripts' ) );
    }

}
endif;

Passez le tableau $enqueued à l'instance d'objet via le constructeur de votre classe.
Attribuez cette valeur à une propriété de classe , puis raccordez la méthode enqueue_all_scripts à wp_enqueue_scripts .
Faites dépendre ladite méthode de la propriété de classe précédemment renseignée.

Créez une nouvelle instance comme ceci:

$enqueued = array(
      array(
           'handle' => 'some-handle',
           'src' => 'http://some-url.com/path/to/script/scripts.js',
           'version' => '1.0'
      ),
      array(
           'handle' => 'another-handle',
           'src' => 'http://some-url.com/path/to/script/another_scripts.js',
           'version' => '1.1'
      )
      // possibly more
);
$your_class_instance = new WPSE_Your_Class( $enqueued );

Sidenote

De plus, &$this est PHP4 et, comme je l’ai récemment appris , il est inutile de tenter de prendre en charge PHP4, car le noyau ne fonctionne pas sur de toute façon.

Edit - votre code complet réécrit

Ce qui précède est la façon dont je le ferais. Ce n'est certainement pas la seule option et probablement pas la plus simple possible, mais cela fonctionne . Compte tenu de votre modification, j'ai ajusté votre code tout en essayant de préserver vos propres conventions de dénomination et style de codage:

class Nomade
{

    /* class properties */
    private $enqueued = array();
    private $features = array();
    private $menus = array();
    private $styled = array();

    /* constructor */
    public function __construct( $menus, $features, $enqueued, $styled )
    {
        // Assign values to class properties
        $this->enqueued = $enqueued;
        $this->features = $features;
        $this->menus = $menus;
        $this->styled = $styled;

        // Define base constants
        define('THEME_FRAMEWORK', 'nomade');
        define('NOMADE_VERSION', '1.0');

        // Define directories
        define('NOMADE_DIR', get_template_directory());
        define('NOMADE_LIB_DIR', get_template_directory() . '/library');

        $this->AddThemeSupport();
        $this->MenuBuilder();

        // Add support for WordPress features
        add_action( 'after_setup_theme', array( $this, 'MenuBuilder' ) );
        add_action( 'after_setup_theme', array( $this, 'AddThemeSupport' ) );
        add_action( 'wp_enqueue_scripts', array( $this, 'EnqueueScripts' ) );
    }

    public function AddThemeSupport()
    {
        if( is_array( $this->features ) && ! empty( $this->features ) )
        {
            foreach ( $this->features as $feature ) {
                add_theme_support( $feature );
            }
        }
    }

    public function MenuBuilder()
    {
        if( is_array( $this->menus ) && ! empty( $this->menus ) )
        {
            register_nav_menus( $this->menus );
        }
    }

    public function EnqueueScripts()
    {
        if( is_array( $this->enqueued ) && ! empty( $this->enqueued ) )
        {
            foreach ( $this->enqueued as $value ) {
                wp_enqueue_script(
                    $value["name"],
                    $value["location"],
                    array("jquery"),
                    $value["version"],
                    true
                );
            }
        }
    }

}
1
Johannes Pille