Чому деякі гачки не працюють в контексті класу?


16

Я досить наткнувся на цей. Я використовую додавання всередині свого класу плагінів, щоб робити певні речі - додавати сценарії та стилі до голови, wp_ajax тощо. Ось дії в __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'));
}

Хтось коли-небудь натрапляв на щось подібне? Мені б дуже хотілося знати, як використовувати згадані гачки в межах класу - це так безладно, щоб діяти поза класом!


3
ви створили екземпляр цього класу? наприклад: $my_plugin = new MYClass();оскільки я ці ж гачки використовував у класі без проблем.
Bainternet

1
Крім того, переконайтесь, що функції, які виконують функції гачків, мають publicвидимість.
Джозеф Леді

Бейнтерне, так, я. @Joseph, що це може бути. чи можна побудувати публічно? Ура
Харлі

@Harley - bainternet запитав, де ти створиш екземпляр.
Стівен Гарріс

@Harley, якщо ви не включите модифікатор видимості, він автоматично встановлюється для загального доступу. Я мав на увазі фактичну функцію, яка виконує будь-яку дію, яка зачеплена.
Джозеф Леді

Відповіді:


10

Іноді певні гачки потрібно стріляти в певний час. Наприклад, деякі гачки потрібно накласти на init .

Додайте це до свого __construct()

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

Потім додайте цю функцію, яка буде містити всі гачки, які потрібно запустити на 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'));
}

Ще один приклад:

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

Вам захочеться прочитати про гачки та коли вони вистрілюються. Таким чином, ви знаєте, коли і де спровокувати свої дії. API плагіна / Довідка про дії


3

Це досить старе питання, але у випадку, якщо хтось шукає відповіді, у мене виникло подібне питання. У мене був клас

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

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

Плагін :: init () ніколи не дзвонили. Потім я зрозумів свою помилку. Для отримання екземпляра класу я робив це:

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

Щоб виправити це, я просто змінив код інстанції на:

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

Іншим варіантом буде використання іншого гака в конструкторі:

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

Або попередній гак в інстанції:

add_action("plugins_loaded", "plugin_init");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.