WordPress登录/登出切换次级菜单且保留主导航不变如何实现
问题原因
你现有代码使用的wp_nav_menu_args过滤器是全局生效的,没有限制作用范围,所以会修改全站所有导航菜单的调用参数,导致主导航也被强制替换为登录/登出对应的次级菜单。
解决方案
你只需要在原有过滤逻辑中增加菜单显示位置判定,仅让切换逻辑作用于顶部次级菜单对应的位置即可,步骤如下:
- 先获取顶部次级菜单的位置别名
进入WordPress后台 → 外观 → 菜单 → 切换到「管理位置」标签页,找到你部署Player Logged-in/Player Logged-out这两个次级菜单的位置,复制对应的英文别名(不同主题的命名不同,常见如top_sub_menu、header_secondary等) - 替换
functions.php中的原有代码为以下版本
注意将代码中的your_top_sub_menu_location替换为你上一步复制的位置别名:
function my_wp_nav_menu_args( $args ) { // 仅对顶部次级菜单的位置执行切换逻辑 if ( $args['theme_location'] === 'your_top_sub_menu_location' ) { if( is_user_logged_in() ) { $args['menu'] = "Player Logged-in"; } else { $args['menu'] = "Player Logged-out"; } } return $args; } add_filter( 'wp_nav_menu_args', 'my_wp_nav_menu_args' );
修改后,只有顶部次级菜单会根据用户登录状态切换,Main主导航不会受到任何影响。
备用方案(无需过滤器)
如果你是直接在主题模板(一般是header.php)中手动调用顶部次级菜单,可以直接在调用位置写判断逻辑,无需使用全局过滤器,写法更简单:
// 直接在需要输出顶部次级菜单的位置添加以下代码 if ( is_user_logged_in() ) { wp_nav_menu( array( 'menu' => 'Player Logged-in' ) ); } else { wp_nav_menu( array( 'menu' => 'Player Logged-out' ) ); }
内容的提问来源于stack exchange,提问作者Brittany Marillier
相关产品推荐
相关产品推荐

