Mehrere add_action mit Parametern innerhalb einer class verwenden

Ich erstelle ein Theme-Framework und verwende eine class, um alle grundlegenden functionen des Themas zu initiieren (Hinzufügen von Theme-Unterstützung, Menüs usw.). Ich bin jedoch hängen geblieben, als ich versucht habe, die Skripts und Stile in die Warteschlange zu stellen:

Ich verwende add_action( 'init', array(&$this, 'EnqueueScrits'), 10, 1); und do_action( 'init', $enqueued ); Methode mit dem Parameter $ enqueued aufrufen. Das funktioniert gut, aber wenn ich versuche, die gleiche Technik zu verwenden, um wp_enqueue_style hinzuzufügen, wp_enqueue_style der $ param durcheinander gebracht (der $ param für Skripte wird auch für Stile verwendet).

Meine Lösung war dann, eine Kettenreaktion auf die erste add_action zu erstellen:

aber dann passiert nichts und die Aktion wird überhaupt nicht aufgerufen (so scheint es jedenfalls). Kennt jemand eine bessere Lösung dafür oder was fehlt mir?

EDIT: Hier ist der vollständige Code. Meine class:

 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 ); } } } } 

Und hier, wie ich das Objekt (in einer separaten Datei) instanziiere:

  '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); 

Danke für die Hilfe im Voraus

Solutions Collecting From Web of "Mehrere add_action mit Parametern innerhalb einer class verwenden"

Die init Aktion …

ist einer von vielen WordPress Core Action Hooks . Daher ist ein manueller Aufruf von do_action nicht erforderlich, dh sollte nicht von diesem begleitet sein.

Sie müssen do_action nur manuell für benutzerdefinierte, zuvor nicht vorhandene Aktions-Hooks do_action .

Außerdem ist init nicht die Aktion, an die das Skript angehängt werden soll. Es gibt eine Aktion speziell für diesen Zweck .

Deine 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; 

$enqueued das $enqueued Array an die Objektinstanz über den Konstruktor Ihrer class.
Weisen Sie diesen Wert einer classneigenschaft zu und enqueue_all_scripts Methode wp_enqueue_scripts an wp_enqueue_scripts .
Machen Sie diese Methode abhängig von der zuvor aufgefüllten classneigenschaft.

Erstellen Sie eine neue Instanz wie folgt:

 $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 ); 

Randnotiz

Nebenbei, &$this ist das PHP4, und wie ich kürzlich erfahren habe , ist es nutzlos, zu versuchen, PHP4 zu unterstützen, da der core sowieso nicht darauf läuft.

Bearbeiten – Ihr vollständiger Code wurde neu geschrieben

Das obige ist die Art, wie ich es tun würde. Das ist sicher nicht die einzige Option und höchstwahrscheinlich nicht das Schlüpfrigste, aber es funktioniert . Angesichts Ihrer Bearbeitung habe ich Ihren Code angepasst und dabei versucht, einige Ihrer eigenen Namenskonventionen und den eigenen Codierungsstil beizubehalten:

 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 ); } } } }