Почему некоторые хуки не работают в контексте класса?

16

Я довольно озадачен этим. Я использую add_action внутри своего класса плагинов, чтобы делать определенные вещи - добавлять скрипты и стили к голове, 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'));
}

Кто-нибудь когда-нибудь сталкивался с чем-то вроде этого? Мне бы очень хотелось узнать, как использовать указанные хуки из класса - это так беспорядочно иметь действия вне класса!

Harley
источник
3
где вы создали экземпляр этого класса? пример: $my_plugin = new MYClass();так как я использовал те же самые хуки из класса без проблем.
Bainternet
1
Кроме того, убедитесь, что функции, выполняющие функции хуков, имеют publicвидимость.
Джозеф Лиди
Bainternet да я есть. @ Джозеф, это может быть. может быть публичным? Приветствия
Харли
@ Харли - bainternet спрашивал, где вы создаете экземпляр.
Стивен Харрис
@ Харли, если вы не включите модификатор видимости, он автоматически становится общедоступным. Я имел в виду фактическую функцию, которая выполняет любое действие, которое подключается.
Джозеф Лиди

Ответы:

10

Иногда определенные крючки должны быть запущены в определенное время. Например, некоторые ловушки должны быть запущены при инициализации .

Добавьте это к вашему __construct()

add_action('init', array(&$this, '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...
  }
}

Plugin :: 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");
Джейк
источник