Можно ли добавить действие к текущему выполняемому действию?
Мой вопрос очень прост, но я еще не нашел этого ответа. Вот пример:
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()
в действие инициализации, но я уже в этом действии. Возможно ли это?
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!';
}
Да, вероятно, в этом и заключается проблема. Почему вы используете этот подход?
Почему бы просто не сделать следующее?
public function init(){
wp_register_script('my-script', plugins_url('/script.js', __FILE__));
}
Я знаю, что это старый вопрос, но в версии 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>' );
}
}