$key = '_cs_inbox';
update_user_meta($uid, $key, $msg);
wp_cache_delete($uid, 'user_meta');
$count = (int) get_user_meta($uid, '_cs_unread', true);

后台给用户发了一条站内信,wp_usermeta 里能查到记录,前台右上角的红色角标还是 0,点进消息中心列表也是空的。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,写入时用的 meta_key 带了插件前缀,读取时按另一个 key 查,两边不是同一个字段。未读数又走了对象缓存,写入后没有清 usermeta 那一组,缓存里一直是旧值。

「站内信未读数」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

处理上按这个顺序:先把写入和读取的 meta_key 打在同一行日志里比对,确认是不是同一个字符串;统一收口成一个读写函数,key 只在这个函数里出现一次;写入后清掉该用户的缓存组,再刷新看角标。

改完只确认一件事:发一条后角标立刻变成 1,点开消息中心能看到正文。

作者 9823189