如何按用户角色重定向WooCommerce对应商品的结账页面?
基于用户角色控制商品结账页面访问权限的解决方案
现有代码的使用(不符合需求,仅作参考)
原代码的作用是:当指定角色(specific_role)的用户访问单个商品页面时,强制跳转到首页。
使用方式:
- 把代码复制到WordPress主题的
functions.php,或者用Code Snippets这类插件添加 - 把
'specific_role'改成你要限制的角色slug(比如默认普通用户是subscriber,自定义角色要对应实际slug)
但这段代码完全不匹配你的需求——它只针对单一角色屏蔽所有商品页面,既没区分商品类型,也没针对结账页面做控制。
符合需求的正确代码
前提说明
先确认几个关键标识(请根据你的实际设置替换):
- 商品分类slug:
general-product(普通商品)、pro-product(专业商品)、ultra-pro-product(超级专业商品) - 用户角色slug:
general_user(普通用户)、pro_user(专业用户)、ultra_pro_user(超级专业用户)
以下代码实现你的权限规则:
add_action( 'template_redirect', 'restrict_checkout_access_by_role_and_product' ); function restrict_checkout_access_by_role_and_product() { // 只在结账页面生效,排除订单完成等端点页面 if ( ! is_checkout() || is_wc_endpoint_url() ) { return; } $current_user = wp_get_current_user(); $user_roles = (array) $current_user->roles; // 检查购物车里的商品类型 $cart_items = WC()->cart->get_cart(); $has_pro = false; $has_ultra_pro = false; foreach ( $cart_items as $item ) { $product_id = $item['product_id']; if ( has_term( 'pro-product', 'product_cat', $product_id ) ) { $has_pro = true; } if ( has_term( 'ultra-pro-product', 'product_cat', $product_id ) ) { $has_ultra_pro = true; } } // 普通用户:禁止购买专业/超级专业商品 if ( in_array( 'general_user', $user_roles ) && ( $has_pro || $has_ultra_pro ) ) { wp_safe_redirect( home_url() ); exit; } // 专业用户:禁止购买超级专业商品 if ( in_array( 'pro_user', $user_roles ) && $has_ultra_pro ) { wp_safe_redirect( home_url() ); exit; } }
代码说明
- 用
template_redirect钩子处理跳转,比原代码的wp钩子更精准 - 只在结账页面触发判断,避免影响其他页面
- 遍历购物车商品,检查所属分类来判断商品类型
- 针对不同角色的权限逐一判断,不符合就跳转到首页
- 用
wp_safe_redirect替代wp_redirect,更安全可靠
可选调整
- 如果还要限制商品详情页的访问,可在函数开头添加
|| is_product()的判断,再单独检查当前商品的分类和用户角色 - 如果商品类型是用自定义字段区分的,把
has_term换成get_post_meta来读取字段值判断
内容的提问来源于stack exchange,提问作者Cyber Warrior
相关产品推荐
相关产品推荐

