WordPress表单提交重定向后admin_notices通知不显示如何解决
核心错误点
- 执行顺序错误:
setting_response函数中exit写在了add_action调用之前,注册通知钩子的代码永远不会被执行,程序在重定向后直接终止了运行。 - 跨请求上下文丢失:即便把
add_action移到exit前也无法生效,wp_safe_redirect会发起全新的HTTP请求,当前请求注册的钩子、临时变量都会随PHP进程结束被销毁,新请求加载WordPress时不会保留之前的钩子注册记录。
可直接运行的修复代码
最简便的实现是重定向时携带自定义状态参数,在后台全局钩子中判断参数匹配后输出通知:
// 绑定表单提交处理回调 add_action( 'admin_post_hidden_value_of_form', 'setting_response' ); // 绑定后台通知输出回调 add_action( 'admin_notices', 'setting_updated' ); /** * 输出保存成功通知 */ function setting_updated(){ // 仅在插件设置页、且检测到成功参数时输出通知 if ( isset($_GET['page']) && $_GET['page'] === 'plugin-setting-url' && isset($_GET['saved']) && $_GET['saved'] == 1 ) { ?> <div class="notice notice-success is-dismissible"> <p>Saved successfully!</p> </div> <?php } } /** * 表单提交处理逻辑 */ function setting_response() { // 此处放你的表单数据校验、保存逻辑 // 重定向到设置页时携带成功标识参数 wp_safe_redirect( admin_url( 'admin.php?page=plugin-setting-url&saved=1' ) ); exit; }
如果需要避免用户手动拼接参数误触发通知,可以用瞬态(Transient)做状态传递,逻辑更严谨:
add_action( 'admin_post_hidden_value_of_form', 'setting_response' ); add_action( 'admin_notices', 'setting_updated' ); function setting_updated(){ // 检测到成功状态瞬态时输出通知,读取后立刻删除避免重复显示 if ( get_transient( 'plugin_setting_saved' ) ) { delete_transient( 'plugin_setting_saved' ); ?> <div class="notice notice-success is-dismissible"> <p>Saved successfully!</p> </div> <?php } } function setting_response() { // 此处放你的表单数据校验、保存逻辑 // 写入10秒有效期的临时状态 set_transient( 'plugin_setting_saved', true, 10 ); wp_safe_redirect( admin_url( 'admin.php?page=plugin-setting-url' ) ); exit; }
注意:
admin-post.php处理逻辑完成后必须在重定向后调用exit终止程序,这部分你原来的写法是正确的,不要删除。
内容的提问来源于stack exchange,提问作者ctlpquudz
相关产品推荐
相关产品推荐

