WooCommerce:购物车中每个类别一个产品

时间:2016-11-12 19:24:35

标签: woocommerce

我试图阻止用户将特定类别中的多个项目添加到他们的购物车中。我找到了这个功能:

function cart_has_licence_in_it()
{
  //Check to see if user has product in cart
  global $woocommerce;
  //assigns a default negative value
  $product_in_cart = false;

  foreach ($woocommerce->cart->get_cart() as $cart_item_key => $values) {

    $_product = $values['data'];
    $terms    = get_the_terms($_product->id, 'product_cat');

    if ($terms) {
      foreach ($terms as $term) {
        $_categoryid = $term->term_id;

        if ($_categoryid === 23) {
          $product_in_cart = true;

        }
      }

    }
  }
  return $product_in_cart;
}

我刚刚将类别ID号更改为23。 现在我想检查购物车是否已有该类别的商品,如果是,请从购物车中删除商品并显示消息:

add_filter( 'woocommerce_add_cart_item_data', 'woo_custom_add_to_cart' );

function woo_custom_add_to_cart( $cart_item_data ) {
global $woocommerce;
$categorie = get_the_terms($cart_item_data->id, 'product_cat');
$_lacat = $categorie->term_id;
if (($_lacat===23)&&(cart_has_licence_in_it())) {
        wc_add_notice('You cannot add this license to your cart because there is already another license in it. Please remove the other license from your cart first.', 'error' );
        $woocommerce->cart->remove_cart_item($cart_item_data->id);
    }
else return $cart_item_data;
}

但它不起作用,我甚至都没有收到消息。

由于我是一般编写WordPress和PHP的新手,我很确定我的代码中存在很多错误。

1 个答案:

答案 0 :(得分:1)

经过大量的反复试验后,我设法解决了我的问题。这是解决方案。

请注意,使用此代码段,新项目会覆盖旧项目,而不是警告客户他们需要删除旧项目。

add_filter('woocommerce_add_to_cart', 'my_woocommerce_add_to_cart', 8, 6);

function my_woocommerce_add_to_cart( $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data ){
global $woocommerce;
$_category_id = 23; //put your category ID here

//Doe the item you added belong to that category ?

$_categorie = get_the_terms($product_id, 'product_cat');
if ($_categorie) {
    $product_is_licence = false;
    foreach ($_categorie as $_cat) {
        $_lacat = $_cat->term_id;
        if ($_lacat === $_category_id) {
            $product_is_licence = true;
        }
    }
}

//If it does, remove all items from same category from cart

if($product_is_licence){
    foreach ($woocommerce->cart->get_cart() as $cart_item_key => $value) {
        $_product = $value['data'];
        $_thisID    = $_product->id;
        $terms    = get_the_terms($_product->id, 'product_cat');
        if ($terms) {
            foreach ($terms as $term) {
                $_categoryid = $term->term_id;
                if (($_categoryid === $_category_id)&&($product_id !== $_thisID)) {
                    $woocommerce->cart->remove_cart_item($cart_item_key);
                    $message = sprintf( '%s has been removed from your cart.',$_product->get_title()); //displays the removal message
                    wc_add_notice($message, 'success');
                }
            }
        }
    }
}
}