$status = in_array( $_POST['status'], [ 'draft', 'publish' ], true ) ? $_POST['status'] : 'draft';
wp_update_post( [ 'ID' => $id, 'post_status' => $status ] );

编辑保存了一条草稿公告准备第二天发,前台立刻出现,状态字段在数据库里是 publish,后台列表却显示草稿,两个地方对不上。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,保存时用 wp_update_post 只传了 ID 和内容,post_status 取的是表单默认值 publish。后台列表读的是另一份元数据,所以显示成草稿。

「公告草稿状态」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

处理上按这个顺序:保存前显式读取表单里的状态,白名单校验后再传;草稿状态用 draft,不要依赖默认值;保存后到前台和数据库各查一次状态是否一致。

改完只确认一件事:草稿保存后前台看不到,发布后才出现在公告列表。

作者 9823189