如何在WooCommerce未激活时停用自定义插件并提示用户错误
解决方案
你的代码存在几个关键问题:wp_admin_notice不是WordPress的合法函数,激活钩子内直接调用停用函数的时机不对,且未处理WooCommerce后续被停用的场景。以下是修正后的完整代码:
1. 主插件文件 custom-plugin.php
<?php /** * Plugin Name: Free Bulk Price Editor * Description: 依赖WooCommerce的批量价格编辑器 * Version: 1.0.0 */ // 定义插件常量 define('FBPE_PLUGIN_BASENAME', plugin_basename(__FILE__)); define('FBPE_PLUGIN_PATH', plugin_dir_path(__FILE__)); include_once FBPE_PLUGIN_PATH . 'inc/class-free-bulk-price-editor.php'; // 注册激活/停用钩子 register_activation_hook(__FILE__, array('Free_Bulk_Price_Editor', 'activate')); register_deactivation_hook(__FILE__, array('Free_Bulk_Price_Editor', 'deactivate')); // 监控WooCommerce状态,若被停用则自动停用当前插件 add_action('admin_init', array('Free_Bulk_Price_Editor', 'check_woocommerce_status')); // 添加后台通知 add_action('admin_notices', array('Free_Bulk_Price_Editor', 'display_admin_notice'));
2. 类文件 class-free-bulk-price-editor.php
<?php class Free_Bulk_Price_Editor { // 存储错误提示信息 private static $error_notice = ''; /** * 检查WooCommerce是否激活 */ public static function is_woocommerce_active() { // 更可靠的检测方式:检查插件是否在激活列表中 return in_array( 'woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')) ); } /** * 插件激活时的检查 */ public static function activate() { if (!self::is_woocommerce_active()) { self::$error_notice = '需要激活WooCommerce才能使用此插件'; // 停用当前插件 deactivate_plugins(FBPE_PLUGIN_BASENAME); // 退出请求,确保停用生效 wp_die(self::$error_notice); } // 这里可以添加其他激活逻辑(如创建数据库表等) } /** * 后台初始化时检查WooCommerce状态 */ public static function check_woocommerce_status() { // 若当前插件已激活,但WooCommerce未激活 if (is_plugin_active(FBPE_PLUGIN_BASENAME) && !self::is_woocommerce_active()) { self::$error_notice = 'WooCommerce已被停用,Free Bulk Price Editor插件已自动停用'; deactivate_plugins(FBPE_PLUGIN_BASENAME); } } /** * 显示后台通知 */ public static function display_admin_notice() { if (!empty(self::$error_notice)) { echo '<div class="notice notice-error is-dismissible"> <p>' . esc_html(self::$error_notice) . '</p> </div>'; // 清空提示,避免重复显示 self::$error_notice = ''; } } /** * 插件停用逻辑 */ public static function deactivate() { // 这里添加停用插件时的清理逻辑(如删除临时数据等) } }
关键修正点说明
- 替换错误函数:移除不存在的
wp_admin_notice,改用admin_notices钩子输出合法的后台提示 - 可靠的激活检测:使用
in_array(...)检查WooCommerce是否在激活插件列表中,比class_exists更准确(避免类被第三方代码加载但插件未激活的情况) - 处理后续状态变化:通过
admin_init钩子实时监控WooCommerce状态,一旦WooCommerce被停用,自动停用当前插件 - 正确的插件路径:使用
plugin_basename(__FILE__)获取插件的标准路径,避免硬编码路径出错 - 激活时强制退出:激活失败时调用
wp_die确保插件停用生效,并直接显示错误提示
内容的提问来源于stack exchange,提问作者Kunal Verma
相关产品推荐
相关产品推荐

