web-dev-qa-db-ja.com

現在実行中のアクションにアクションを追加することは可能ですか?

私の質問は非常に単純ですが、私はまだこの答えを見つけていません。これが例です:

class MyClass {
  public function __construct(){
    add_action('init', array($this, 'init'));
    add_action('wp_footer', array($this, 'footer'));
  }

  public function init(){
    add_action('init', array($this, 'register_scripts'));
  }

  public function register_scripts(){
    wp_register_script('my-script', plugins_url('/script.js', __FILE__));
  }

  public function footer(){
    echo('<div class="style-me">Rawr this is my plugin.</div>');
  }
}

これは私のコードがどのように見えるかであり、失敗しています。 divは表示されますが、JavaScriptは適用されません。だから私の問題はinitアクションでinit()関数を実行してからinitアクションにregister_scripts()を追加することではないかと思いましたが、私はすでにそのアクションに入っています。これは可能ですか?

2
Aust

あなたはもっと遅い(より高い)優先順位を使わなければなりません。それでcurrent_filter()を使って現在のフックと優先順位を取得し、その優先順位に1を加えて次のアクションを登録します。

add_action( 'init', 'func_1' );

function func_1()
{
    global $wp_filter;

    $hook = current_filter();
    add_action( $hook, 'func_2', key( $wp_filter[ $hook ] ) + 1 );
}

function func_2()
{
    echo 'hi!';
}
3
fuxia

はい、これはおそらく問題です。なぜあなたはこのアプローチを使っていますか?

どうして次のようにしないのですか?

public function init(){
     wp_register_script('my-script', plugins_url('/script.js', __FILE__));
  }
1
vancoder

私はこれが古い質問であることを知っています、しかしバージョン4.7では、WordPressはそれらがフックを扱う方法を変えたので、上の答えはもはや働かないでしょう。

関連する違いは4.7の前後のバージョンのためのフックの現在の優先順位を返す関数を含むmy-functions.phpファイルにあります。

(注:コンストラクターにフックを追加するのは好きではありません。そのため、プラグインの構造を少し変えるために自由を取っていますが、同じように機能します。)

My-plugin.phpでは、

require_once( PATH_TO . '/my-functions.php' );
require_once( PATH_TO . '/my-class.php' );

add_action( 'plugins_loaded', [ new MyClass(), 'register' ] );

My-functions.phpで:

if( ! functions_exists( 'current_priority' ) ):
function current_priority() {
  global $wp_filter;
  global $wp_version;
  return version_compare( $wp_version, '4.7', '<' ) ?
    key( $wp_filter[ current_filter() ] ) :
    $wp_filter[ current_filter() ]->current_priority();
}
endif;

Myclass.phpで:

class MyClass {

  public function register() {
    add_action( 'init', [ $this, 'init' ] );
    add_action( 'wp_footer', [ $this, 'footer' ] );
  }

  public function init(){
    //* Add action to current filter at the next priority
    add_action( current_filter(), [ $this, 'register_scripts' ], current_priority() + 1 );
  }

  public function register_scripts(){
    wp_register_script( 'my-script', plugins_url( '/script.js', __FILE__) );
  }

  public function footer(){
    echo( '<div class="style-me">Rawr this is my plugin.</div>' );
  }
}
1
Nathan Johnson