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

WordPress中对未登录用户隐藏菜单项及其子链接的方法

优化后的会员菜单隐藏方案

问题分析

你当前的代码存在两个核心问题:

  1. 逻辑完全颠倒:当前是已登录用户隐藏「Members Area」,和需求恰好相反
  2. 仅处理父菜单项,未关联删除其子链接,导致子项残留

修复后的代码

add_filter('wp_nav_menu_objects', 'hide_members_area_menu_for_guests', 10, 2);
function hide_members_area_menu_for_guests($items, $args) {
    // 仅对未登录用户执行隐藏逻辑
    if (!is_user_logged_in()) {
        $members_parent_id = 0;
        
        // 第一步:定位「Members Area」父菜单项的ID
        foreach ($items as $key => $item) {
            if ($item->title == 'Members Area') {
                $members_parent_id = $item->ID;
                unset($items[$key]); // 删除父项
                break;
            }
        }
        
        // 第二步:删除所有属于该父项的子链接
        if ($members_parent_id > 0) {
            foreach ($items as $key => $item) {
                if ($item->menu_item_parent == $members_parent_id) {
                    unset($items[$key]);
                }
            }
        }
    }
    
    return $items;
}

代码说明

  • 逻辑修正:通过!is_user_logged_in()判断,仅在用户未登录时隐藏菜单,符合会员制网站需求
  • 关联子项:先获取父项ID,再遍历删除所有menu_item_parent等于该ID的子菜单项,确保父项和子项同步隐藏
  • 性能优化:找到父项后立即终止循环,仅在父项存在时才处理子项,减少不必要的遍历

额外优化建议

  • 避免标题匹配风险:如果后续可能修改菜单标题,建议给「Members Area」父项添加自定义CSS类(比如members-area-parent),然后通过in_array('members-area-parent', $item->classes)判断,这样更稳定
  • 优先级调整:如果主题有其他菜单过滤逻辑,可调整函数第三个参数(比如改为20),确保该逻辑最后执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:42:08