如何在WordPress区块编辑器中展示transition_post_status钩子操作通知
解决WordPress编辑器状态转换后的提示问题
解决这个问题的核心思路很简单:在transition_post_status钩子完成邮件操作后,把提示消息临时存起来,等页面跳回编辑器时,用WordPress自带的后台通知功能把消息显示出来,显示完就删掉,避免重复提示。下面给两种可行的实现方案:
方案一:用临时会话存消息(推荐)
这个方案依赖PHP会话存储临时消息,消息只会显示一次,刷新页面就消失,符合需求。
1. 先开启后台会话
WordPress后台默认没启用会话,所以先加这段代码确保会话可用:
add_action('init', function() { if (is_admin() && !session_id()) { session_start(); } });
2. 状态转换时存消息
修改你原来的钩子函数,完成邮件逻辑后把提示消息存入会话:
add_action('transition_post_status', function($new_status, $old_status, $post) { // 只处理「已发布转草稿」的场景 if ($old_status === 'publish' && $new_status === 'draft') { // 这里写你的邮件发送逻辑 // 比如 wp_mail('admin@xxx.com', '文章状态变更', '用户把《'.$post->post_title.'》改成草稿了'); // 把提示消息存到会话里 $_SESSION['post_notice'] = '已通知管理员'; } }, 10, 3);
3. 显示并清除消息
用WordPress的admin_notices钩子读取会话里的消息,渲染成系统风格的通知,显示完就删掉会话内容:
add_action('admin_notices', function() { if (isset($_SESSION['post_notice'])) { $msg = $_SESSION['post_notice']; // 删掉消息,防止刷新页面重复显示 unset($_SESSION['post_notice']); // 输出成功通知(WordPress原生样式,带关闭按钮) echo '<div class="notice notice-success is-dismissible"> <p>'.$msg.'</p> </div>'; } });
方案二:用URL查询参数传递消息
如果不想用会话,也可以在保存后跳转的URL里加个参数,然后检测参数显示消息:
1. 状态转换时加URL参数
add_action('transition_post_status', function($new_status, $old_status, $post) { if ($old_status === 'publish' && $new_status === 'draft') { // 执行邮件发送逻辑 // 给跳转URL加个自定义参数 add_filter('redirect_post_location', function($location) { return add_query_arg('notify_done', '1', $location); }); } }, 10, 3);
2. 检测参数显示通知
add_action('admin_notices', function() { if (isset($_GET['notify_done']) && $_GET['notify_done'] === '1') { echo '<div class="notice notice-success is-dismissible"> <p>已通知管理员</p> </div>'; // 可选:把URL里的参数去掉,避免刷新页面重复显示 if (wp_get_referer()) { wp_redirect(remove_query_arg('notify_done')); exit; } } });
为什么这俩方案比你之前的思路靠谱
- 不用折腾文章元字段:完全避开了前端编辑器读取元字段、渲染组件的复杂操作,直接用WordPress原生的后台通知机制搞定显示。
- 不用修改文章响应:不需要拦截或修改保存文章的API响应,完全贴合WordPress后台的工作流程,兼容性更好。
内容的提问来源于stack exchange,提问作者Ärigg
相关产品推荐
相关产品推荐

