Tại sao một số hook không hoạt động trong bối cảnh lớp học?


16

Tôi khá bối rối về điều này. Tôi đang sử dụng add_action bên trong lớp plugin của mình để thực hiện một số điều nhất định - thêm tập lệnh & kiểu vào đầu, wp_ajax, v.v ... Đây là các hành động, trong __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'));
}

Bất cứ ai cũng từng gặp một cái gì đó như thế này? Tôi thực sự muốn biết làm thế nào để sử dụng các móc nói từ trong một lớp - thật là lộn xộn khi có những hành động bên ngoài lớp học!


3
bạn đã tạo một thể hiện của lớp này chưa? ví dụ: $my_plugin = new MYClass();vì tôi đã sử dụng các móc tương tự từ trong một lớp mà không gặp vấn đề gì.
Bainternet

1
Ngoài ra, đảm bảo rằng các chức năng phục vụ như các móc có publickhả năng hiển thị.
Joseph Leedy

Tôi có. @Joseph có thể là nó. có thể xây dựng được công khai? Chúc mừng
Harley

@Harley - bainternet được hỏi nơi để bạn tạo một thể hiện.
Stephen Harris

@Harley nếu bạn không bao gồm một công cụ sửa đổi khả năng hiển thị, nó sẽ tự động được đặt thành công khai. Tôi đã đề cập đến chức năng thực tế thực hiện bất kỳ hành động nào đang được nối.
Joseph Leedy

Câu trả lời:


10

Đôi khi một số móc nhất định cần phải được bắn vào những thời điểm nhất định. Ví dụ, một số hook cần phải được kích hoạt khi init .

Thêm cái này vào __construct()

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

Sau đó thêm chức năng này, sẽ chứa tất cả các hook cần được kích hoạt khi 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'));
}

Một vi dụ khac:

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ạn sẽ muốn đọc về các móc và khi chúng bị bắn. Vì vậy, bạn biết khi nào và nơi để kích hoạt hành động của bạn. Plugin API / Tham chiếu hành động


3

Đây là một câu hỏi khá cũ, nhưng trong trường hợp bất cứ ai đang tìm kiếm một câu trả lời, tôi đã có một vấn đề tương tự. Tôi đã có một lớp học

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

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

Plugin :: init () không bao giờ được gọi. Sau đó tôi nhận ra sai lầm của mình. Để bắt đầu lớp tôi đã làm điều này:

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

Để sửa nó, tôi chỉ thay đổi mã khởi tạo thành:

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

Tùy chọn khác sẽ là sử dụng một hook khác trong constructor:

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

Hoặc một cái móc trước đó trong khởi tạo:

add_action("plugins_loaded", "plugin_init");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.