You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WordPress中单独调用add_submenu_page无效问题求助

解决WordPress子菜单无法正常显示的问题

嘿,我来帮你搞定这个菜单的问题!你遇到的子菜单不显示的情况,大概率是钩子使用不对或者**add_submenu_page的父菜单参数不匹配**导致的,咱们一步步来修正:

核心问题排查与解决方案

1. 必须使用正确的钩子

WordPress中添加后台菜单的标准钩子是admin_menu,这个钩子的时机刚好是后台菜单注册的阶段,如果你用了其他钩子(比如init),会因为注册时机太早而导致子菜单找不到父菜单。

确保你的两个函数都挂在admin_menu钩子上,哪怕你想控制执行顺序,只要顶级菜单的函数优先级不低于子菜单的就行(默认优先级都是10,顶级菜单会先执行,因为WordPress会按顺序处理同优先级的钩子)。

2. 确保add_submenu_page的父菜单slug完全匹配

这是最容易踩坑的点!add_submenu_page的第一个参数必须和add_menu_page的**最后一个参数(菜单slug)**完全一致,大小写、字符都不能错。

举个完整的可运行示例:

// 注册顶级菜单
function whatever() {
    // 注意最后一个参数是顶级菜单的唯一slug:my-custom-top-menu
    add_menu_page(
        '我的顶级菜单',       // 页面标题
        '自定义菜单',         // 后台侧边栏显示的菜单名
        'manage_options',    // 访问权限(这里用管理员权限)
        'my-custom-top-menu',// 菜单slug(关键!子菜单要用到)
        'my_top_menu_callback', // 页面回调函数
        'dashicons-admin-tools',// 菜单图标
        20                   // 菜单排序位置
    );
}
// 挂到admin_menu钩子
add_action('admin_menu', 'whatever');

// 注册子菜单
function whatever2() {
    // 第一个参数必须和顶级菜单的slug完全一致:my-custom-top-menu
    add_submenu_page(
        'my-custom-top-menu',// 父菜单slug
        '子菜单1页面',       // 子菜单页面标题
        '子菜单1',           // 侧边栏显示的子菜单名
        'manage_options',    // 访问权限
        'my-submenu-1',      // 子菜单slug
        'my_submenu_1_callback'// 子菜单页面回调
    );

    add_submenu_page(
        'my-custom-top-menu',
        '子菜单2页面',
        '子菜单2',
        'manage_options',
        'my-submenu-2',
        'my_submenu_2_callback'
    );

    add_submenu_page(
        'my-custom-top-menu',
        '子菜单3页面',
        '子菜单3',
        'manage_options',
        'my-submenu-3',
        'my_submenu_3_callback'
    );

    add_submenu_page(
        'my-custom-top-menu',
        '子菜单4页面',
        '子菜单4',
        'manage_options',
        'my-submenu-4',
        'my_submenu_4_callback'
    );
}
// 同样挂到admin_menu钩子
add_action('admin_menu', 'whatever2');

// 别忘了定义回调函数(不然点击菜单会报错)
function my_top_menu_callback() {
    echo '<h1>我的顶级菜单页面</h1>';
}

function my_submenu_1_callback() {
    echo '<h1>子菜单1页面</h1>';
}

function my_submenu_2_callback() {
    echo '<h1>子菜单2页面</h1>';
}

function my_submenu_3_callback() {
    echo '<h1>子菜单3页面</h1>';
}

function my_submenu_4_callback() {
    echo '<h1>子菜单4页面</h1>';
}

3. 其他可能的排查点

  • 权限参数一致:确保顶级菜单和子菜单的权限参数(第三个参数)相同,比如都是manage_options,如果权限不匹配,低权限用户看不到子菜单。
  • 避免slug冲突:子菜单的slug不能和其他菜单或页面的slug重复,否则会被覆盖。
  • 清除缓存:有时候WordPress后台缓存会导致菜单不更新,刷新页面或者清除浏览器缓存试试。
  • 排查冲突:如果还是不行,暂时禁用其他插件、切换到默认主题,看看是不是有其他代码修改了菜单结构。

内容的提问来源于stack exchange,提问作者The SuperKat

火山引擎 最新活动