You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress:仅针对头部主导航实现登录状态切换导航

仅针对WordPress头部主导航实现登录状态菜单切换

你的代码问题出在wp_nav_menu_args过滤器会作用于所有调用wp_nav_menu()的导航菜单,所以页脚的三个菜单也被统一替换了。要只修改头部主导航,需要通过导航位置标识或菜单自身属性做条件判断,只在匹配头部导航时执行替换逻辑。


推荐方案:通过主题导航位置(theme_location)判断

这是最可靠的方式,因为主题注册菜单时会给不同位置的导航分配唯一标识(比如头部主导航通常叫primary或main-navigation)。

修改后的代码:

function my_wp_nav_menu_args( $args = '' ) {
    // 替换成你主题中头部主导航的theme_location值
    if ( $args['theme_location'] === 'primary' ) {
        $args['menu'] = is_user_logged_in() ? 80 : 25;
    }
    return $args;
}
add_filter( 'wp_nav_menu_args', 'my_wp_nav_menu_args' );

如何找到正确的theme_location?

打开主题的functions.php文件,找register_nav_menus()函数,里面会有类似这样的代码:

register_nav_menus( array(
    'primary' => '网站主导航',
    'footer-1' => '页脚菜单1',
    'footer-2' => '页脚菜单2',
) );

这里的'primary'就是头部主导航的theme_location,把代码里的'primary'替换成这个值即可。


备选方案:通过菜单ID/名称判断

如果你的主题没有设置theme_location,或者你明确知道头部导航的菜单ID/名称,可以用这种方式:

按菜单ID判断

function my_wp_nav_menu_args( $args = '' ) {
    // 替换成头部导航默认的菜单ID(比如未登录时显示的25)
    if ( $args['menu'] == 25 ) {
        $args['menu'] = is_user_logged_in() ? 80 : 25;
    }
    return $args;
}
add_filter( 'wp_nav_menu_args', 'my_wp_nav_menu_args' );

按菜单名称判断

function my_wp_nav_menu_args( $args = '' ) {
    // 替换成头部导航的菜单名称(比如“主导航菜单”)
    if ( $args['menu'] === '主导航菜单' ) {
        $args['menu'] = is_user_logged_in() ? 80 : 25;
    }
    return $args;
}
add_filter( 'wp_nav_menu_args', 'my_wp_nav_menu_args' );

注意事项

  • 优先使用theme_location方案,因为它是主题设计时的固定标识,不会因为菜单修改(比如ID变化、名称修改)而失效。
  • 替换代码中的菜单ID(80、25)和标识值时,确保和你后台设置的菜单ID/位置名称一致。

内容的提问来源于stack exchange,提问作者Adam Bell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:15:42