在WooCommerce中将订单限制为一种产品,从而允许可变产品的不同变体

时间:2019-04-04 18:10:03

标签: php wordpress woocommerce product cart

我试图限制客户通过woocommerce购买一种产品。我使用以下代码:

export const slideInAnimation = trigger('routeAnimations', [
  transition('* <=> *', [
    style({ position: 'fixed' }),
    query(
      ':enter, :leave',
      [
        style({
          position: 'fixed',
          top: 0,
          left: 0
        })
      ],
      { optional: true }
    ),
    query(':enter', [style({ top: '-100%' })], { optional: true }),
    query(':leave', animateChild(), { optional: true }),
    group([
      query(':leave', [animate('900ms ease-in', style({ top: '100%' }))], {
        optional: true
      }),
      query(':enter', [animate('900ms ease-in', style({ top: '0%' }))], {
        optional: true
      })
    ]),
    query(':enter', animateChild(), { optional: true })
  ])
]);

问题是我不能在同一个变量产品中使用两个变体。我需要一些东西来限制每个订单的一种产品,但是可以允许客户使用同一变量产品的多个变体。

示例:客户购买了黑色的三星j7智能手机,同时购买了蓝色的三星j7。现在,如果客户想要另外添加Sony Xperia智能手机,则必须再次订购。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

以下内容将限制“添加到购物车”以仅允许来自同一产品的商品(因此对于可变产品,它将允许向购物车添加同一可变产品的不同变体)

add_filter( 'woocommerce_add_to_cart_validation', 'filter_add_to_cart_validation', 10, 4 );
function filter_add_to_cart_validation( $passed, $product_id, $quantity, $variation_id = 0 ) {
    if( WC()->cart->is_empty() )
        return $passed;

    $product = wc_get_product($product_id);
    $items_in_cart = [];

    if ( $product && 'variable' !== $product->get_type() ) {
        $passed = false;
    } elseif ( $product && 'variable' === $product->get_type() ) {
        $items_in_cart[$product_id] = $product_id;

        // Loop through cart items
        foreach( WC()->cart->get_cart() as $cart_item ){
            $items_in_cart[$cart_item['product_id']] = $cart_item['product_id'];
        }
        if( count($items_in_cart) > 1 )
            $passed = false;
    }

    // Avoid add to cart and display an error notice
    if( ! $passed )
        wc_add_notice( __("Different items are not allowed on an order.", "woocommerce" ), 'error' );

    return $passed;
}

代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试,可以正常工作。