Neden bazı kancalar sınıf bağlamında çalışmıyor?


16

Ben buna çok şaşırdım. Bazı şeyler yapmak için eklenti sınıfım içinde add_action kullanıyorum - baş, wp_ajax, vb komut dosyaları ve stilleri ekleyin. İşte __construct eylemleri:

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

Hiç böyle bir şeyle karşılaşan oldu mu? Söylemek istediğim kancaları bir sınıf içinde nasıl kullanacağımı gerçekten bilmek istiyorum.


3
bu sınıfın bir örneğini oluşturuyor muydunuz? ör: $my_plugin = new MYClass();aynı kancaları bir sınıfın içinden sorunsuz bir şekilde kullandığım için.
Bainternet

1
Ayrıca, kanca görevi gören işlevlerin publicgörünürlüğe sahip olduğundan emin olun .
Joseph Leedy

Bainternet evet öyleyim. @Joseph bu olabilir. Yapı halka açık olabilir mi? Şerefe
Harley

@Harley - bainternet nerede bir örnek oluşturduğunuzu soruyordu .
Stephen Harris

@Harley bir görünürlük değiştirici eklemezseniz, otomatik olarak herkese açık olarak ayarlanır. Asıl işleve atıfta bulunuluyor ne olursa olsun gerçekleştirir.
Joseph Leedy

Yanıtlar:


10

Bazen belirli kancaların belirli zamanlarda ateşlenmesi gerekir. Örneğin, bazı kancaların init üzerine ateşlenmesi gerekir .

Bunu __construct()

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

Ardından, init üzerine ateşlenmesi gereken tüm kancaları içeren bu işlevi ekleyin .

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

Başka bir örnek:

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

Kancalar ve ne zaman kovulduklarını okumak isteyeceksiniz. Yani eylemlerinizi ne zaman ve nerede tetikleyeceğinizi biliyorsunuz. Eklenti API'sı / İşlem Başvurusu


3

Bu oldukça eski bir soru, ancak herhangi birinin bir cevap araması durumunda benzer bir sorunum vardı. Dersim vardı

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

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

Plugin :: init () hiç çağrılmadı. Sonra hatamı fark ettim. Sınıfı başlatmak için bunu yapıyordum:

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

Düzeltmek için, sadece örnekleme kodunu değiştirdim:

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

Diğer seçenek yapıcıda farklı bir kanca kullanmak olacaktır:

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

Ya da örneklemede daha önceki bir kanca:

add_action("plugins_loaded", "plugin_init");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.