自定义字段面板里填了作者和 ISBN,点更新后两个字段都变成空值,数据库里对应 meta_value 是空字符串,自动保存一次也会触发。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (!isset($_POST['book_isbn'])) return;
update_post_meta($post_id, 'book_isbn', sanitize_text_field($_POST['book_isbn']));
表单 input 的 name 写成 book_isbn,save_post 回调里读的却是 isbn,键名对不上。回调也没有跳过 DOING_AUTOSAVE,自动保存时 $_POST 为空照样执行更新。这一点先确认清楚,后面就不用反复试。
「save_post 取不到字段」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
具体做法是,先打印 $_POST 的键名 和回调里读的键逐一对齐;在回调开头判断 DOING_AUTOSAVE 与 post_type;用 isset 判断字段存在再 update_post_meta。
改完照着核一遍,手动保存和自动保存各一次,三个字段的值都保留,空提交不会覆盖原值。
