如何用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; }
你当前代码的问题说明
- 用了
body_class过滤器,这个是给<body>标签加类的,没法直接修改单个导航链接的类; - 依赖
$_POST['username']获取用户,不符合正常登录逻辑——用户登录后WordPress已经有当前用户的信息,直接用wp_get_current_user()即可; - 直接覆盖了传入的
$class参数,会破坏原有body标签的类逻辑。
内容的提问来源于stack exchange,提问作者velvet
相关产品推荐
相关产品推荐

