刷新后台,左侧边栏出现两条一模一样的「订单同步」,点哪条都进同一个页面,菜单高亮永远停在第一条。插件只装了一个,把这个插件停掉两条一起消失。乍看像缓存或者权限的锅,追下去往往不是。

add_action("admin_menu", function () {
    static $done = false;
    if ($done) { return; } $done = true;
    add_menu_page("订单同步", "订单同步", "manage_options", "abc-sync", "abc_sync_page");
});

追下去是这么回事:菜单注册函数被挂在了会重复触发的钩子上,主文件和某个包含文件各调了一次,slug 相同也不会去重。后台菜单是往数组里追加,同名条目就这样叠了出来。

「后台菜单重复注册」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

具体做法是,全局搜一遍菜单注册函数 确认只在后台菜单钩子里出现一次;给注册代码加静态标记 执行过就直接返回;改完把该钩子上的回调按优先级列出来 看谁在重复挂。

验收就看一点,后台侧边栏只剩一条「订单同步」,点进去 URL 里的 page 参数保持不变。

作者 9823189