根据另一个插件的激活状态停用 WordPress 插件

  • 酉灿
  • WordPress
  • Jul 23, 2021

在进行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_existsfunction_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 目录中。

打赏