¿Por qué algunos enganches no funcionan dentro del contexto de la clase?

13

Estoy bastante perplejo en este caso. Estoy usando add_action dentro de mi clase de complemento para hacer ciertas cosas: agregar scripts & estilos a la cabeza, wp_ajax, etc. Aquí están las acciones, en __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'));
}

¿Alguien se ha topado con algo como esto? Realmente me gustaría saber cómo usar dichos ganchos dentro de una clase, ¡es tan complicado tener acciones fuera de la clase!

    
pregunta Harley 01.05.2012 - 09:21

2 respuestas

8

A veces ciertos ganchos necesitan ser disparados en ciertos momentos. Por ejemplo, algunos ganchos deben activarse en init .

Agregue esto a su __construct()

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

Luego agregue esta función, que contendrá todos los enganches que deben activarse en 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'));
}

Usted querrá leer acerca de los ganchos y cuando son disparados. Así que sabes cuándo y dónde desencadenar tus acciones. API de complemento / referencia de acción

    
respondido por el Michael Ecklund 17.05.2012 - 20:56
2

Esta es una pregunta bastante antigua, pero en caso de que alguien esté buscando una respuesta, tuve un problema similar. Tuve una clase

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

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

Plugin :: init () nunca fue llamado. Entonces me di cuenta de mi error. Para crear una instancia de la clase que estaba haciendo esto:

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

Para solucionarlo, simplemente cambié el código de creación de instancias a:

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

La otra opción sería usar un gancho diferente en el constructor:

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

O un gancho anterior en la instanciación:

add_action("plugins_loaded", "plugin_init");
    
respondido por el Jake 14.11.2012 - 05:15

Lea otras preguntas en las etiquetas