通常我使用这种方法来测试插件是否处于活动状态(通常是我自己的)。
这将出现在我正在检查的插件中:
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将不再工作。
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开发人员需要解决的问题,所以希望这对其他人有所帮助。