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

16

Estou muito perplexo com este. Estou usando add_action dentro da minha classe de plug-in para fazer certas coisas - adicionar scripts e estilos à cabeça, wp_ajax, etc. Aqui estão as ações, na __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 ganchos de dentro de uma classe - é tão confuso ter ações fora da classe!

Harley
fonte
3
onde você criou uma instância dessa classe? ex: $my_plugin = new MYClass();desde que usei esses mesmos ganchos de uma classe sem problemas.
Bainternet
1
Além disso, verifique se as funções que servem como ganchos têm publicvisibilidade.
Joseph Leedy
Bainternet sim, eu sou. @ Joseph que poderia ser isso. pode construir ser público? Cheers
Harley
@ Harley - bainternet estava perguntando onde você cria uma instância.
Stephen Harris
@ Harley, se você não incluir um modificador de visibilidade, ele será automaticamente definido como público. Eu estava me referindo à função real que executa qualquer ação que está sendo fisgada.
Joseph Leedy

Respostas:

10

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

Adicione isto ao seu __construct()

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

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

Outro exemplo:

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

Você vai querer ler sobre os ganchos e quando eles são disparados. Então você sabe quando e onde acionar suas ações. API de plug-in / referência de ação

Michael Ecklund
fonte
3

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

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

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

O plugin :: init () nunca foi chamado. Eu então percebi meu erro. Para instanciar a classe, eu estava fazendo isso:

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

Para corrigi-lo, mudei 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");
Jake
fonte