Perché alcuni hook non funzionano all'interno del contesto di classe?


16

Sono piuttosto perplesso su questo. Sto usando add_action nella mia classe di plugin per fare certe cose: aggiungere script e stili alla testa, wp_ajax, ecc. Ecco le azioni, nel __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'));
}

Qualcuno ha mai incontrato qualcosa del genere? Mi piacerebbe davvero sapere come usare detti hook all'interno di una classe: è così disordinato avere azioni al di fuori della classe!


3
dove hai creato un'istanza di questa classe? es: $my_plugin = new MYClass();dato che ho usato questi stessi hook all'interno di una classe senza problemi.
Bainternet,

1
Inoltre, assicurati che le funzioni che fungono da ganci abbiano publicvisibilità.
Joseph Leedy,

Bainternet sì, lo sono. @Joseph che potrebbe essere. può costruire essere pubblico? Saluti
Harley

@Harley - bainternet stava chiedendo dove si crea un'istanza.
Stephen Harris,

@Harley se non includi un modificatore di visibilità, viene automaticamente impostato su pubblico. Mi riferivo alla funzione effettiva che esegue qualunque azione venga agganciata.
Joseph Leedy,

Risposte:


10

A volte determinati ganci devono essere lanciati in determinati momenti. Esempio, alcuni hook devono essere lanciati su init .

Aggiungi questo al tuo __construct()

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

Quindi aggiungere questa funzione, che conterrà tutti gli hook che devono essere attivati ​​su init .

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

Un altro esempio:

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

Ti consigliamo di leggere sui ganci e quando vengono sparati. Quindi sai quando e dove attivare le tue azioni. API plug-in / Riferimento azione


3

Questa è una domanda piuttosto vecchia, ma nel caso qualcuno stia cercando una risposta, ho avuto un problema simile. Ho avuto una lezione

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

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

Plugin :: init () non veniva mai chiamato. Ho quindi realizzato il mio errore. Per istanziare la classe che stavo facendo questo:

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

Per risolvere il problema, ho appena cambiato il codice di istanza in:

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

L'altra opzione sarebbe quella di utilizzare un hook diverso nel costruttore:

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

O un precedente hook nell'istanza:

add_action("plugins_loaded", "plugin_init");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.