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

如何用PHP为未购买产品的用户禁用或隐藏指定导航链接?

用PHP实现根据用户购买状态控制导航链接的显示/禁用

第一步:先写通用的用户购买状态判断函数

首先我们需要一个可靠的函数,用来判断当前登录用户是否购买过产品(基于WooCommerce环境):

// 判断当前登录用户是否购买过产品
function has_user_purchased() {
    // 用户未登录直接返回未购买
    if ( ! is_user_logged_in() ) {
        return false;
    }
    
    $current_user = wp_get_current_user();
    $user_id = $current_user->ID;
    
    // 查询用户已完成或处理中的有效订单
    $customer_orders = get_posts( array(
        'numberposts' => -1,
        'meta_key'    => '_customer_user',
        'meta_value'  => $user_id,
        'post_type'   => 'shop_order',
        'post_status' => array('wc-completed','wc-processing')
    ) );
    
    // 有订单则返回已购买,反之未购买
    return ! empty( $customer_orders );
}

方案1:修改特定链接的CSS类

如果你的导航链接原本带有google-link类,我们可以通过WordPress的菜单过滤器,根据购买状态替换类名:

// 修改目标导航链接的CSS类
function modify_menu_link_class( $classes, $item ) {
    // 替换成你要控制的菜单项标题,比如"会员链接1"、"会员链接2"
    $target_links = array( '会员链接1', '会员链接2' );
    
    // 判断当前菜单项是否是目标链接
    if ( in_array( $item->title, $target_links ) ) {
        // 移除原来的google-link类
        $classes = array_diff( $classes, array( 'google-link' ) );
        
        // 根据购买状态添加对应类
        if ( has_user_purchased() ) {
            $classes[] = 'normal-link'; // 已购买用户用正常类
        } else {
            $classes[] = 'disabled-link'; // 未购买用户用禁用类
        }
    }
    return $classes;
}
add_filter( 'nav_menu_css_class', 'modify_menu_link_class', 10, 2 );

之后用CSS控制样式:

.disabled-link {
    pointer-events: none; /* 禁止点击 */
    opacity: 0.5; /* 半透明 */
    cursor: not-allowed; /* 鼠标变禁止样式 */
}
.normal-link {
    /* 正常链接样式,可根据需求自定义 */
}

提示:如果不想用标题判断,也可以用菜单项ID(在WordPress后台编辑菜单时,每个菜单项右上角有ID),把in_array( $item->title, $target_links )改成in_array( $item->ID, array(123, 456) ),这样更精准。


方案2:定位特定位置的菜单项(类似nth-child效果)

如果你想直接针对导航中的第N个、第M个链接修改,可以通过菜单项的排序位置来判断:

// 根据菜单项位置控制样式或显示
function modify_menu_by_position( $classes, $item, $args ) {
    // 替换成你的导航菜单名称,比如"主导航"
    if ( $args->menu->name !== '主导航' ) {
        return $classes;
    }
    
    // WordPress的menu_order从1开始,转成从0开始的索引
    $menu_index = $item->menu_order - 1;
    
    // 目标位置:比如第3个和第5个链接(对应索引2和4)
    $target_indexes = array( 2, 4 );
    
    if ( in_array( $menu_index, $target_indexes ) ) {
        if ( ! has_user_purchased() ) {
            // 未购买用户添加禁用类
            $classes[] = 'disabled-link';
            // 如果要直接隐藏链接,把上面一行换成下面的:
            // $classes = array( 'hidden' );
        }
    }
    return $classes;
}
add_filter( 'nav_menu_css_class', 'modify_menu_by_position', 10, 3 );

如果用隐藏的话,加CSS:

.hidden {
    display: none !important;
}

你当前代码的问题说明

  1. 用了body_class过滤器,这个是给<body>标签加类的,没法直接修改单个导航链接的类;
  2. 依赖$_POST['username']获取用户,不符合正常登录逻辑——用户登录后WordPress已经有当前用户的信息,直接用wp_get_current_user()即可;
  3. 直接覆盖了传入的$class参数,会破坏原有body标签的类逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:02:46