将HAS_FILTER与基于类的插件一起使用以检查插件是否处于活动状态

时间:2013-06-30 作者:Andrew

通常我使用这种方法来测试插件是否处于活动状态(通常是我自己的)。

这将出现在我正在检查的插件中:

function my_plugin_setup() {
    // setup code here
}
add_action( \'plugins_loaded\', \'my_plugin_setup\' );
从我将使用的其他文件或插件has_filter 在激发的函数上plugins_loaded:

if ( has_filter( \'plugins_loaded\', \'my_plugin_setup\' ) ) {
    // plugin is active, do something
}
除了基于类的插件之外,我如何使用上述相同的方法?Ie插件代码类似于:

class My_Plugin {

    public function __construct() {
        add_action( \'plugins_loaded\', array( $this, \'setup\' ) );    
    }

    // other stuff below
}
显然这不起作用:

if ( has_filter( \'plugins_loaded\', array( $this, \'My_Plugin\' ) ) ) {
    // do something
}
注意:我想使用此方法,而不是使用is_plugin_active 因为插件的文件夹名称可能会更改,因此is\\u plugin\\u active将不再工作。

2 个回复
SO网友:Weston Ruter

要真正做到您想要的,最简单的方法是将插件类的实例存储在插件末尾的全局变量中:

class My_Plugin {
    static $instance;
    function __construct(){} /* or private, with singleton get_instance() method */
    function setup(){ ... }
}
$my_plugin_instance = new My_Plugin();
add_action( \'plugins_loaded\', array( $my_plugin_instance, \'setup\' ) );
然后您可以执行以下操作:

$has_plugin = (
    isset( $my_plugin_instance ) 
    &&
    has_filter( \'plugins_loaded\', array( $my_plugin_instance, \'setup\' )
);
if ( $has_plugin ) ...
然而,这种查看插件是否已加载的方法似乎过于复杂。为什么不检查一下class_exists( \'My_Plugin\' )? 如果该类确实存在,那么您就知道插件已加载。无需检查是否添加了筛选器。

SO网友:Brian C

在实际不创建唯一操作的插件中,使用has\\u filter()测试另一个插件是否存在的简单方法是创建一个小过滤器。例如,在您的情况下,您可以创建一个名为;my\\u插件;(前提是字符串是唯一的)通过以下方式:

add_action( \'my_plugin\', \'__return_true\' );
然后,当你想测试你的插件是否已安装并处于活动状态时,你可以使用WordPress的has_filter() 像这样:

$has_plugin = has_filter( \'my_plugin\' );
...
显然,通过使用适当的唯一名称,确保过滤器/挂钩在其他地方不存在是至关重要的。此外,许多插件都有一个特定于该插件的操作或挂钩,在这种情况下,可以简单地用于此测试,而不是创建另一个过滤器。

使用has_filter() 具有使测试简单和健壮的双重优势,即使插件被重命名,或者使用了替代插件;我想这就是为什么它被推荐给您作为良好实践的原因,这也是我一直在插件中所做的。

我知道这是一篇老文章,但这仍然是WordPress开发人员需要解决的问题,所以希望这对其他人有所帮助。

结束

相关推荐

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文件的完整函数: