You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 07:48:23