登录用户点开公告后红点消失,刷新页面红点又回来,连续点五次数据库里多出五条 usermeta,键名分别是 notice_read_12 和 notice_read-12。乍看像缓存或者权限的锅,追下去往往不是。

function notice_key( $id ) { return 'notice_read_' . (int) $id; }
update_user_meta( get_current_user_id(), notice_key( $id ), 1 );

追下去是这么回事:写入用的键名带下划线,读取用的带连字符,两边对不上就永远读不到。代码在每次页面加载时都执行 add_user_meta,没先判断是否已存在。

「公告已读状态持久化」这类改动最怕改一半,回滚脚本先准备好,再动生产。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。

同一份配置存在多处的,先确认改的是被加载的那一份。

具体做法是,把键名统一成一个函数生成,读写都走它,避免手写拼接;写入前先用 get_user_meta 判断,存在就 update 不再 add;点开一条公告后刷新三次,查 usermeta 表确认只有一行。

验收就看一点,刷新后红点不再出现,usermeta 里每条公告只留一行记录。

作者 9823189