Dlaczego niektóre haki nie działają w kontekście klasowym?

16

Jestem bardzo zaskoczony tym. Korzystam z add Działalności w mojej klasie wtyczek, aby robić pewne rzeczy - dodawać skrypty i style do nagłówka, wp_ajax itp. Oto akcje w __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'));
}

Czy ktoś kiedykolwiek spotkał coś takiego? Naprawdę chciałbym wiedzieć, jak używać wspomnianych haczyków z klasy - tak niechlujne są działania poza klasą!

Harley
źródło
3
czy stworzyłeś instancję tej klasy? np. $my_plugin = new MYClass();ponieważ bez problemu użyłem tych samych haczyków w klasie.
Bainternet
1
Dodatkowo upewnij się, że funkcje służące jako zaczepy mają publicwidoczność.
Joseph Leedy
Bainternet tak, jestem. @Joseph, to może być to. czy konstrukcja może być publiczna? Na zdrowie
Harley
@Harley - bainternet pytał, gdzie tworzysz instancję.
Stephen Harris
@Harley, jeśli nie uwzględnisz modyfikatora widoczności, zostanie on automatycznie ustawiony na publiczny. Miałem na myśli faktyczną funkcję, jaką wykonuje dowolna akcja, która jest zaczepiona.
Joseph Leedy

Odpowiedzi:

10

Czasami niektóre haki muszą zostać wystrzelone w określonych momentach. Przykład: niektóre haczyki muszą zostać wystrzelone podczas inicjalizacji .

Dodaj to do swojego __construct()

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

Następnie dodaj tę funkcję, która będzie zawierać wszystkie haki, które muszą zostać wystrzelone podczas inicjalizacji .

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

Inny przykład:

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

Będziesz chciał przeczytać o hakach i kiedy zostaną wystrzelone. Dzięki temu wiesz, kiedy i gdzie uruchomić swoje działania. Wtyczka API / Action Reference

Michael Ecklund
źródło
3

To dość stare pytanie, ale na wypadek, gdyby ktoś szukał odpowiedzi, miałem podobny problem. Miałem klasę

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

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

Plugin :: init () nigdy nie był wywoływany. Potem zrozumiałem swój błąd. Aby utworzyć instancję klasy, robiłem to:

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

Aby to naprawić, właśnie zmieniłem kod instancji na:

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

Inną opcją byłoby użycie innego haka w konstruktorze:

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

Lub wcześniejszy haczyk w instancji:

add_action("plugins_loaded", "plugin_init");
Jake
źródło