Por que alguns ganchos não funcionam dentro do contexto da classe?

13

Estou bastante perplexo com este. Eu estou usando add_action dentro da minha classe de plugin para fazer certas coisas, adicionar scripts & estilos para a cabeça, wp_ajax, etc. Aqui estão as ações, no __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'));
}

Alguém já se deparou com algo assim? Eu realmente gostaria de saber como usar os referidos ganchos dentro de uma classe - é tão confuso ter ações fora da sala de aula!

    
por Harley 01.05.2012 / 09:21

2 respostas

8

Às vezes, certos ganchos precisam ser disparados em determinados momentos. Por exemplo, alguns ganchos precisam ser disparados no init .

Adicione isso ao seu __construct()

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

Em seguida, adicione essa função, que conterá todos os ganchos que precisam ser acionados no 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'));
}

Você vai querer ler sobre os ganchos e quando eles são demitidos. Então você sabe quando e onde desencadear suas ações. Referência da API / ação do plug-in

    
por Michael Ecklund 17.05.2012 / 20:56
2

Essa é uma pergunta bem antiga, mas caso alguém esteja procurando uma resposta, tive um problema semelhante. Eu tive uma aula

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

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

Plugin :: init () nunca foi chamado. Então percebi meu erro. Para instanciar a aula eu estava fazendo isso:

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

Para corrigir isso, alterei o código de instanciação para:

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

A outra opção seria usar um gancho diferente no construtor:

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

Ou um gancho anterior na instanciação:

add_action("plugins_loaded", "plugin_init");
    
por Jake 14.11.2012 / 05:15