删了三个不用的页面,前台导航里那三项还在,点开全是 404。后台菜单编辑页里这几项显示正常,没有红色提示。日志里能对上时间点,这种反而好排。
菜单项是独立的 post,删除页面只改了 post_status,菜单项里存的 object_id 变成悬空引用。输出时仍按原 URL 渲染,不检查目标是否存在。这一点先确认清楚,后面就不用反复试。
wp db query "SELECT p.ID FROM wp_posts p LEFT JOIN wp_posts t ON t.ID=p.menu_item_object_id WHERE p.post_type='nav_menu_item' AND p.menu_item_object_id>0 AND t.ID IS NULL;" wp post delete <item_id> --force
「菜单孤儿项」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
报错里带路径的,先去看那个路径在不在、权限对不对。同一份配置存在多处的,先确认改的是被加载的那一份。
处理上按这个顺序:用 SQL 找出 object_id 已不存在的菜单项;批量删除这些菜单项 或者改成指向新页面;给页面删除挂钩子 同时清理关联菜单项。
结果对不对很好判断,导航里不再出现指向已删页面的项,点击现有菜单项都能正常打开。
