购物车

时间:2017-04-29 17:21:25

标签: php wordpress woocommerce cart categories

在这个Question / Answer上,我找到了关于如何在Woocommerce中的每个类别中添加一个产品的PHP代码。

代码工作正常,但我想将最新添加的产品添加到购物车中,如果购物车中已经有该类别的产品,我想删除最旧的产品。

add_filter( 'woocommerce_add_to_cart_validation', 'custom_checking_product_added_to_cart', 10, 3 );
function custom_checking_product_added_to_cart( $passed, $product_id, $quantity) {

// HERE Type your alert displayed message
// $message = __( 'BLA BLA YOUR MESSAGE.', 'woocommerce' );

$product_cats_object = get_the_terms( $product_id, 'product_cat' );
foreach($product_cats_object as $obj_prod_cat){
    $product_cats[] = $obj_prod_cat->slug;
}

foreach (WC()->cart->get_cart() as $cart_item ){
if( has_term( $product_cats, 'product_cat', $cart_item['product_id'] )) {
        $passed = false;
        wc_add_notice( $message, 'error' );
        break;
    }
}
return $passed;
}

这是来自LoicTheAztec 的一段代码。它工作正常,但我需要一个额外的选项......

在我的Woocommerce中有5个不同的类别,购物车中只有每个类别一个项目的位置。最新添加的项目应保留,必须从购物车中删除已在购物车中的相同类别的项目。 你们有人有解决方案吗?

非常感谢!

1 个答案:

答案 0 :(得分:4)

以下是您的代码安静,它将删除与当前产品类别匹配的产品类别的购物车商品。

add_filter( 'woocommerce_add_to_cart_validation', 'custom_checking_product_added_to_cart', 10, 3 );
function custom_checking_product_added_to_cart( $passed, $product_id, $quantity) {

    // Getting the product categories slugs in an array for the current product
    $product_cats_object = get_the_terms( $product_id, 'product_cat' );
    foreach($product_cats_object as $obj_prod_cat)
        $product_cats[] = $obj_prod_cat->slug;

    // Iterating through each cart item
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item ){

        // When the product category of the current product match with a cart item
        if( has_term( $product_cats, 'product_cat', $cart_item['product_id'] ))
        {
            // Removing the cart item
            WC()->cart->remove_cart_item($cart_item_key);

            // Displaying a message
            wc_add_notice( 'Only one product from a category is allowed in cart', 'notice' );

            // We stop the loop
            break;
        }
    }
    return $passed;
}

此代码位于活动子主题(或主题)的function.php文件中或任何插件文件中。

此代码经过测试,适用于WooCommerce版本2.6+和3.0 +