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!


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


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");
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.