为什么有些钩子在类上下文中不起作用?


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

有人遇到过这样的事情吗?我真的很想知道如何在课堂上使用所说的钩子-在课堂外进行操作是如此混乱!


3
您是否创建了此类的实例?例如:$my_plugin = new MYClass();由于我从类中使用了这些相同的钩子,所以没有问题。
Bainternet

1
此外,请确保用作挂钩的功能具有public可见性。
约瑟夫·利迪

Bainternet是的,我是。@Joseph可能就是这样。可以公开吗?干杯
哈雷

@Harley-bainternet询问您在哪里创建实例。
史蒂芬·哈里斯

@Harley如果不包括可见性修改器,它将自动设置为public。我指的是执行任何被钩住的实际功能。
约瑟夫·利迪

Answers:


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...
  }
}

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");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.