$old = wp_get_object_terms($post_id, "post_tag", ["fields" => "ids"]);
wp_set_object_terms($post_id, array_unique(array_merge($old, [$target])), "post_tag");

手动把标签 A 的 312 篇文章改成标签 B,删掉 A 之后文章里只剩 B,原来同时挂 A 和 C 的文章,C 也不见了。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,合并时用设置分类的函数整体覆盖,传进去的只有 B,原有的 C 被替换掉。这个函数是覆盖语义,不是追加。

围绕「标签合并丢关联」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

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

报错里带路径的,先去看那个路径在不在、权限对不对。

处理上按这个顺序:合并前先取每篇文章现有的全部分类编号;把目标标签追加进数组 再整体写回;最后才删除空掉的旧标签并重算计数。

改完只确认一件事:合并后文章同时保留 B 和 C,只有 A 消失。

作者 9823189