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


16

これにはかなり困惑しています。プラグインクラス内でadd_actionを使用して特定のことを行います。スクリプトやスタイルをhead、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そうです。@ジョセフそれかもしれない。構築物は公開できますか?乾杯
ハーレー

@Harley-bainternetは、インスタンスをどこで作成するかを尋ねいました。
スティーブンハリス

@Harley可視性修飾子を含めない場合、自動的にパブリックに設定されます。フックされているアクションを実行する実際の関数を参照していました。
ジョセフリーディ

回答:


10

特定の時間に特定のフックを起動する必要がある場合があります。例、いくつかのフックは初期化時に起動する必要があります

これを追加します __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();
    }
}

もう1つのオプションは、コンストラクターで別のフックを使用することです。

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

またはインスタンス化の以前のフック:

add_action("plugins_loaded", "plugin_init");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.