Можно ли добавить действие к текущему выполняемому действию?


Мой вопрос очень прост, но я еще не нашел этого ответа. Вот пример:

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() в действии инициализации, а затем добавить register_scripts() в действие инициализации, но я уже в этом действии. Возможно ли это?

Author: Aust, 2013-06-25

3 answers

Вы должны использовать более поздний (более высокий) приоритет. Поэтому используйте 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
Author: fuxia, 2013-06-25 23:33:34

Да, вероятно, в этом и заключается проблема. Почему вы используете этот подход?

Почему бы просто не сделать следующее?

public function init(){
     wp_register_script('my-script', plugins_url('/script.js', __FILE__));
  }
 1
Author: vancoder, 2013-06-25 23:34:17

Я знаю, что это старый вопрос, но в версии 4.7 WordPress изменил способ обработки крючков, поэтому приведенный выше ответ больше не будет работать.

Соответствующее различие заключается в файле my-functions.php, который содержит функцию, которая возвращает текущий приоритет крючка для версий до и после 4.7.

(Примечание: Мне не нравится добавлять крючки в конструктор, поэтому я взял на себя смелость структурировать плагин немного по-другому, но он будет работать так же.)

В 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
Author: Nathan Johnson, 2017-02-01 19:20:32