webentwicklung-frage-antwort-db.com.de

Warum funktionieren einige Hooks nicht im Klassenkontext?

Ich bin ziemlich ratlos. 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!

15
Harley

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

Fügen Sie dies zu Ihrer __construct() hinzu

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

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/Aktionsreferenz

9
Michael Ecklund

Dies ist eine ziemlich alte Frage, aber für den Fall, dass 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");
3
Jake