在进行WordPress插件开发时,尤其是附加组件或高级插件,您必须处理一些用例。例如,一个这样的用例是,在激活高级插件时,您必须停用免费增值插件。或者,如果您的插件依赖于其他插件,您可以在激活插件之前检查这些插件是否处于活动状态。自定义条件逻辑可以添加到您的插件中,在激活和停用挂钩上。
检查依赖插件是否处于活动状态
假设您的插件的激活取决于另一个插件。然后,在激活插件之前,您需要检查其他插件是否处于活动状态。必须使用WordPress 提供的 register_activation_hook
添加此用于激活插件的条件逻辑。
register_activation_hook(__FILE__, 'mypluginname_activation_logic');
其中 ‘mypluginname_activation_logic’ 应该写在你的主插件文件中。在此功能中,您必须检查相关插件是否处于活动状态。
function mypluginname_activation_logic() {
//如果依赖插件未激活,禁用本插件
if (!is_plugin_active('abc/abc.php') )
{
deactivate_plugins(plugin_basename(__FILE__));
}
}
WordPress 为您提供了一个函数is_plugin_active
来检查插件是否处于活动状态。这个函数基本上返回一个真或假的结果。但这里的缺点是您必须知道确切的插件文件夹名称和文件名。
更优选的选项是使用class_exists或function_exists函数检查插件创建的类或函数是否存在。例如,WooCommerce 插件创建了类“WooCommerce”。要检查 WooCommerce 插件是否处于活动状态,您可以使用:
if (class_exists('Woocommerce')) {
// your code here
}
但很明显,这里的缺点是,如果在插件更新期间类或函数名称发生变化,则此检查将不起作用。
从您的插件停用另一个插件
要停用另一个插件,您可以使用 WordPress 提供的功能:deactivate_plugins
函数。必须在适当的钩子上调用deactivate 函数,这取决于插件应该何时被停用。例如,要停用插件ABC,当插件XYZ被激活时,我们必须钩入插件XYZ激活函数,并停用ABC。
register_activation_hook(__FILE__, 'XYZ_activation');
function XYZ_activation() {
deactivate_plugins('ABC/ABC.php');
}
要停用的插件的路径必须在deactivate_plugins函数中指定。
如果依赖插件被停用,则停用您的插件
在基本插件上构建自定义附加组件或扩展时会出现这样的用例。在这种情况下,您可能希望在停用基本插件时停用您的附加组件。为此,您必须挂钩到deactivated_plugin
操作,并检查停用的插件是否是基础插件。
function detect_plugin_deactivation( $plugin, $network_activation ) {
if ($plugin=="abc/abc.php")
{
deactivate_plugins(plugin_basename(__FILE__));
}
}
add_action( 'deactivated_plugin', 'detect_plugin_deactivation', 10, 2 );
上面指定的所有用例主要是为了停用插件。这样做的原因是,最好不要代表用户激活插件。可能有一些必须使用的插件您希望自动激活,可以创建此类插件并将其放置在 must use 目录中。有关更多信息,您可以参考《什么是 WordPress 必要插件 mu-plugins,如何使用?》