为何其他WordPress插件的通知会显示在我的插件标签内?
问题原因及解决思路
嘿,这种情况我在开发WordPress插件时也碰到过,其实原因挺明确的——其他插件的管理通知没有限定显示的页面范围。
WordPress的后台通知默认是全局显示的,只要插件开发者在输出通知时没做页面判断,它就会出现在所有后台页面里,包括你的插件标签页。你用的admin_menu钩子本身是没问题的,它只是用来注册后台菜单,问题出在另一款插件的通知逻辑上。
具体排查和解决步骤
先定位问题插件:你可以先暂时禁用其他所有插件,然后一个个重新开启,找到那个弹出通知的插件。之后去看它的代码里输出通知的部分,正常的通知应该会用
get_current_screen()来判断当前页面,只在自己的插件页面显示,比如:add_action('admin_notices', 'their_plugin_notice'); function their_plugin_notice() { $screen = get_current_screen(); // 只在自己插件的页面显示通知 if ($screen->id !== 'their-plugin-screen-id') { return; } echo '<div class="notice notice-info is-dismissible"><p>他们的插件通知</p></div>'; }如果对方没加这个判断,那通知肯定会乱跑。
在你的插件里过滤无关通知:要是不想修改别人的插件代码,你可以在自己的插件页面里主动移除那些无关的通知钩子。比如:
add_action('admin_notices', 'filter_unwanted_notices', 1); function filter_unwanted_notices() { $screen = get_current_screen(); // 替换成你自己插件的页面ID,比如主菜单的slug或者注册时返回的screen ID if (strpos($screen->id, 'your-plugin-slug') !== false) { // 移除对方插件的通知钩子,需要知道对方的函数名 remove_action('admin_notices', 'their_plugin_notice'); } }这里需要你先找到对方插件输出通知的函数名,可以通过查看它的代码,或者用调试工具看
admin_notices钩子下的所有函数。给你的插件页面标记独特的标识:在注册菜单的时候,
add_menu_page或者add_submenu_page的返回值就是页面的screen ID,你可以把它存下来,方便后续精准判断当前页面。比如:class Your_Custom_Plugin { private $plugin_screen_ids = []; public function admin_menu() { // 注册主菜单,保存screen ID $this->plugin_screen_ids['main'] = add_menu_page( '我的插件', '我的插件', 'manage_options', 'your-plugin-main-slug', array($this, 'render_main_page') ); // 注册子标签页,同样保存screen ID $this->plugin_screen_ids['tab1'] = add_submenu_page( 'your-plugin-main-slug', '标签页1', '标签页1', 'manage_options', 'your-plugin-tab1-slug', array($this, 'render_tab1') ); } }之后判断页面时,直接用
$screen->id和这些保存的ID对比就行,更准确。
总的来说,核心问题就是对方插件的通知没做页面范围限制,要么让对方修复,要么自己主动过滤掉就行。
内容的提问来源于stack exchange,提问作者Shibbir




