WordPress插件类内Hook问题:激活时管理员通知不显示
WordPress插件激活通知不显示的问题修复
你的代码问题在于:register_activation_hook的执行时机早于admin_notices钩子的触发阶段,而且插件激活后WordPress会自动跳转页面,导致你在激活函数里添加的admin_notices钩子根本不会被执行。
正确的做法是通过数据库存储激活标记,在后台加载时检查这个标记并显示通知,之后清除标记。以下是修正后的代码:
主插件文件
/** * Plugin Name: TFT * Version: 1.0.0 */ defined('ABSPATH') or die("You can't access this file directly."); define('TFT_PATH', plugin_dir_path(__FILE__)); define('TFT_FILE', __FILE__); require __DIR__ . '/tft_init.php'; $tft = new TFT();
tft_init.php 文件
class TFT { public function __construct() { register_activation_hook(TFT_FILE, array($this, 'activate')); // 注册后台通知钩子 add_action('admin_notices', array($this, 'activate_notice')); } public function activate() { // 存储激活标记到数据库 add_option('tft_activation_notice', '1'); // 激活时可选刷新重写规则(如果插件用到自定义路由等功能) flush_rewrite_rules(); } public function activate_notice() { // 检查是否存在激活标记 if (!get_option('tft_activation_notice')) { return; } // 显示激活通知 echo '<div class="notice notice-success is-dismissible"> <p>Thanks for installing TFT.</p> </div>'; // 删除标记,避免每次后台加载都显示通知 delete_option('tft_activation_notice'); } }
关键改动说明
- 将
admin_notices钩子的注册移到类的构造函数中,确保每次后台页面加载时都能触发该钩子 - 在激活函数中用
add_option添加临时标记,记录插件刚完成激活的状态 - 在通知函数中先检查标记是否存在,存在则显示通知,之后立即删除标记,保证通知仅在激活后的第一次后台加载时显示
内容的提问来源于stack exchange,提问作者Perfection
相关产品推荐
相关产品推荐

