Warum funktionieren einige Hooks nicht im Klassenkontext?

16

Ich bin ziemlich verblüfft. Ich benutze add_action in meiner Plugin-Klasse, um bestimmte Dinge zu erledigen - füge Skripte und Stile zum head, wp_ajax usw. hinzu. Hier sind die Aktionen im __construct:

function __construct(){
    add_action('admin_menu', array($this, 'sph_admin_menu'));
    add_action('sph_header', array($this, 'sph_callback'));
    add_action('sph_header_items', array($this, 'sph_default_menu'), 1);
    add_action('sph_header_items', array($this, 'sph_searchform'), 2);
    add_action('sph_header_items', array($this, 'sph_social'), 3);

    //Below here they don't work. I have to call these outside of the class (but I need class variables within the functions)
    add_action('wp_print_styles', array(&$this, 'sph_stylesheets'));
    add_action('wp_print_scripts', array(&$this, 'sph_scripts'));
    add_action( 'wp_ajax_nopriv_add_to_list', array(&$this, 'le_add_to_list'));
    add_action( 'wp_ajax_add_to_list', array(&$this, 'le_add_to_list'));
    add_action('init', array(&$this, 'register_menu'));
}

Ist jemand auf so etwas gestoßen? Ich würde wirklich gerne wissen, wie man besagte Hooks innerhalb einer Klasse benutzt - es ist so chaotisch, Aktionen außerhalb der Klasse zu haben!

Harley
quelle
3
Wo haben Sie eine Instanz dieser Klasse erstellt? Beispiel: $my_plugin = new MYClass();Da ich dieselben Hooks ohne Probleme aus einer Klasse heraus verwendet habe.
Bainternet
1
Stellen Sie außerdem sicher, dass die als Haken dienenden Funktionen publicsichtbar sind.
Joseph Leedy
Bainternet ja bin ich. @ Joseph das könnte es sein. kann konstruieren öffentlich sein? Prost
Harley
@ Harley - Bainternet hat gefragt, wo Sie eine Instanz erstellen.
Stephen Harris
@ Harley Wenn Sie keinen Sichtbarkeitsmodifikator einfügen, wird dieser automatisch auf öffentlich gesetzt. Ich bezog mich auf die eigentliche Funktion, die ausgeführt wird, unabhängig davon, welche Aktion angehängt wird.
Joseph Leedy

Antworten:

10

Manchmal müssen bestimmte Haken zu bestimmten Zeiten abgefeuert werden. Zum Beispiel müssen einige Hooks bei init abgefeuert werden .

Fügen Sie dieses Ihrem hinzu __construct()

add_action('init', array(&$this, 'init'));

Fügen Sie dann diese Funktion hinzu, die alle Hooks enthält, die bei init ausgelöst werden müssen .

public function init(){
    add_action('hook_name', array(&$this, 'your_method_name'));
    add_action('hook_name', array(&$this, 'your_method_name'));
    add_action('hook_name', array(&$this, 'your_method_name'));
    add_action('hook_name', array(&$this, 'your_method_name'));
}

Ein anderes Beispiel:

add_action( 'init', function () {

    add_action( 'hook_name', 'function_name', 10, 3 );
    add_action( 'hook_name', __NAMESPACE__ . '\namespaced_function_name', 10 );
    add_action( 'hook_name', '\specific\namespace\function_name', 5 );

}, 1 );

Sie möchten über die Haken und wann sie abgefeuert werden, lesen. So wissen Sie, wann und wo Sie Ihre Aktionen auslösen müssen. Plugin API / Action Referenz

Michael Ecklund
quelle
3

Dies ist eine ziemlich alte Frage, aber falls jemand nach einer Antwort sucht, hatte ich ein ähnliches Problem. Ich hatte eine Klasse

class Plugin{
  function __construct(){
    add_action('init', array(&$this, 'init'));
  }

  function init(){
    // code...
  }
}

Plugin :: init () wurde nie aufgerufen. Ich erkannte dann meinen Fehler. Um die Klasse zu instanziieren, habe ich Folgendes getan:

if(class_exists('Plugin')){
    add_action("init", "plugin_init");
    function socialsports_init() {
      global $plugin;
      $plugin = new Plugin;
    }
}

Um das Problem zu beheben, habe ich den Instantiierungscode folgendermaßen geändert:

if(class_exists('Plugin')){
    add_action("init", "plugin_init");
    function socialsports_init() {
      global $plugin;
      $plugin = new Plugin;
      $plugin->init();
    }
}

Die andere Möglichkeit wäre, einen anderen Hook im Konstruktor zu verwenden:

function __construct(){
  add_action('wp_loaded', array(&$this, 'init'));
}

Oder ein früherer Haken in der Instanziierung:

add_action("plugins_loaded", "plugin_init");
Jake
quelle