是否可以将操作添加到当前正在运行的操作?

时间:2013-06-25 作者:Aust

我的问题很简单,但我还没有找到这个答案。下面是一个示例:

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 个回复
最合适的回答,由SO网友:fuxia 整理而成

您必须使用更高的优先级。So使用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!\';
}

SO网友:vancoder

是的,这可能就是问题所在。为什么使用这种方法?

为什么不做以下事情呢?

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

SO网友:Nathan Johnson

我知道这是一个老问题,但在4.7版中,WordPress改变了处理挂钩的方式,因此上面的答案将不再适用。

相关差异在于my-functions.php 文件,其中包含一个函数,该函数将返回4.7之前和之后版本的挂钩的当前优先级。

(注意:我不喜欢在构造函数中添加挂钩,所以我冒昧地对插件进行了稍微不同的结构设计,但它的工作原理是一样的。)

在我的插件中。php:

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

add_action( \'plugins_loaded\', [ new MyClass(), \'register\' ] );
在我的功能中。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>\' );
  }
}

结束

相关推荐

Wp-plugins(必须使用Plugins)URL是否可以在unctions.php中使用?

wp插件(必须使用插件)URL是否可以作为在函数中使用的目标。php?我有一个mu函数。mu plugins文件夹中的php文件。一个函数调用javascript文件(alerts.js) 位于example.com/wp-content/mu-plugins/js/. 如何在我的函数中定位mu插件文件夹?目前,我正在使用get_site_url() . \'/wp-content/mu-plugins/js/alerts.js\',虽然与问题不完全相关,但这是用于调用javascript文件的完整函数: