WooCommerce可变产品如何禁用用户已购商品的加入购物车选项
WooCommerce可变产品购买后禁用加购解决方案(适配Martfury主题)
你当前简单产品功能正常、可变产品失效,核心原因是常规的购买校验钩子仅覆盖了简单产品类型,未对可变产品的变体单独做校验,Martfury主题遵循WooCommerce核心钩子规范,按以下步骤操作即可实现需求:
实现步骤
- 第一步:将以下代码添加到WordPress站点子主题的
functions.php文件,或使用Code Snippets这类自定义代码插件插入(不要直接修改父主题文件,避免主题更新后代码被覆盖)
// 校验用户是否已购买指定产品(含可变产品变体) function custom_user_has_bought_product( $product_id ) { if ( ! is_user_logged_in() ) return false; $user_id = get_current_user_id(); // 可根据需求调整订单状态,此处仅校验已完成订单 $statuses = array( 'wc-completed' ); $customer_orders = wc_get_orders( array( 'customer_id' => $user_id, 'status' => $statuses, 'return' => 'ids', ) ); foreach ( $customer_orders as $order_id ) { $order = wc_get_order( $order_id ); foreach ( $order->get_items() as $item ) { // 若买过任意变体就禁用整个可变产品,把下方$product_id换成$item->get_product_id()即可 if ( in_array( $product_id, array( $item->get_product_id(), $item->get_variation_id() ) ) ) { return true; } } } return false; } // 覆盖简单产品可购买性判断 add_filter( 'woocommerce_is_purchasable', 'custom_disable_add_to_cart_after_purchase', 10, 2 ); // 覆盖可变产品变体可购买性判断(解决可变产品失效的核心逻辑) add_filter( 'woocommerce_variation_is_purchasable', 'custom_disable_add_to_cart_after_purchase', 10, 2 ); function custom_disable_add_to_cart_after_purchase( $is_purchasable, $product ) { if ( custom_user_has_bought_product( $product->get_id() ) ) { return false; } return $is_purchasable; } // 自定义不可购买时的按钮提示文本 add_filter( 'woocommerce_product_add_to_cart_text', 'custom_purchased_product_button_text', 10, 2 ); function custom_purchased_product_button_text( $text, $product ) { if ( custom_user_has_bought_product( $product->get_id() ) ) { return __( '已购买', 'woocommerce' ); } return $text; }
- 第二步:根据需求调整校验逻辑:
- 若需要用户购买任意变体就禁用整个可变产品的所有加购选项,按代码中的注释修改对应判断逻辑即可
- 若需要校验包含处理中、待发货等状态的订单,修改
$statuses数组新增对应状态值即可,例如新增'wc-processing'
- 第三步:清理站点缓存(包括页面缓存、WooCommerce对象缓存)后测试可变产品效果即可
若添加代码后可变产品仍未生效,可检查Martfury主题的「产品页设置」中是否开启了自定义加购按钮功能,关闭自定义选项即可兼容默认WooCommerce钩子逻辑。
内容的提问来源于stack exchange,提问作者Jubair hossain
相关产品推荐
相关产品推荐

