Mengapa beberapa kait tidak berfungsi di dalam konteks kelas?

16

Saya cukup bingung tentang yang satu ini. Saya menggunakan add_action di dalam kelas plugin saya untuk melakukan hal-hal tertentu - tambahkan skrip & gaya ke kepala, wp_ajax, dll. Berikut adalah tindakannya, di __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'));
}

Adakah yang pernah menemukan sesuatu seperti ini? Saya benar-benar ingin tahu cara menggunakan kata kait dari dalam kelas - itu sangat berantakan memiliki tindakan di luar kelas!

Harley
sumber
3
Apakah Anda membuat turunan dari kelas ini? ex: $my_plugin = new MYClass();karena saya sudah menggunakan kait yang sama ini dari dalam kelas tanpa masalah.
Bainternet
1
Selain itu, pastikan bahwa fungsi yang berfungsi sebagai pengait memiliki publicvisibilitas.
Joseph Leedy
Bainternet ya saya. @ Joseph itu bisa jadi itu. dapatkah konstruksi bersifat publik? Cheers
Harley
@ Harley - bainternet bertanya di mana Anda membuat contoh.
Stephen Harris
@ Harley jika Anda tidak menyertakan pengubah visibilitas, itu secara otomatis diatur ke publik. Saya mengacu pada fungsi aktual melakukan tindakan apa pun yang sedang dikaitkan.
Joseph Leedy

Jawaban:

10

Terkadang kait tertentu perlu ditembakkan pada waktu-waktu tertentu. Contoh, beberapa kait perlu ditembakkan pada init .

Tambahkan ini ke __construct()

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

Kemudian tambahkan fungsi ini, yang akan berisi semua kait yang perlu diaktifkan pada 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'));
}

Contoh lain:

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

Anda akan ingin membaca tentang kait dan ketika mereka dipecat. Jadi, Anda tahu kapan dan di mana akan memicu tindakan Anda. API Plugin / Referensi Tindakan

Michael Ecklund
sumber
3

Ini adalah pertanyaan yang cukup lama, tetapi kalau-kalau ada yang mencari jawaban, saya punya masalah serupa. Saya punya kelas

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

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

Plugin :: init () tidak pernah dipanggil. Saya kemudian menyadari kesalahan saya. Untuk membuat instance kelas saya melakukan ini:

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

Untuk memperbaikinya, saya baru saja mengubah kode instantiation ke:

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

Opsi lain adalah menggunakan kait yang berbeda di konstruktor:

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

Atau kait sebelumnya di instantiation:

add_action("plugins_loaded", "plugin_init");
Jake
sumber