web-dev-qa-db-ja.com

いくつかのフックがクラスコンテキスト内で機能しないのはなぜですか?

私はこれにかなり困惑しています。私はプラグインクラスの中で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'));
}

誰かがこのような何かに遭遇したことがありますか?クラスの中からフックの使い方を知りたいのですが、クラスの外でアクションを実行するのは面倒です。

15
Harley

特定のフックを特定の時間に起動する必要がある場合があります。例えば、いくつかのフックは 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'));
}

あなたはフックについてそしてそれらがいつ解雇されるかについて読みたくなるでしょう。だからあなたはいつ、どこであなたの行動を引き起こすべきかを知っています。 プラグインAPI /アクションリファレンス

9
Michael Ecklund

これはかなり古い質問ですが、誰かが答えを探しているのであれば、私は同様の問題を抱えていました。私はクラスがありました

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");
3
Jake