自定义链接带 utm_source=a&utm_medium=menu,前台源码里变成 &,跳到落地页后只剩 utm_source 一个参数。乍看像缓存或者权限的锅,追下去往往不是。
// href 只转义一次 标题单独处理
printf('<a href="%s">%s</a>', esc_url($item->url), esc_html($item->title));
追下去是这么回事:菜单 URL 先被 esc_url 转成 &,主题输出时又用 esc_html 处理整段属性,& 再转一次。浏览器解析还原一次,服务端拿到的参数就被截断。
碰到「菜单链接转义」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
具体做法是,URL 只在输出属性时转义一次 用 esc_url;不要把 esc_url 的结果再喂给 esc_html;用浏览器复制链接地址 确认参数完整。
验收就看一点,复制菜单链接得到的地址里 & 正常,落地页能读到两个 utm 参数。
