需要Woocommerce只允许购物车中的1个产品。如果产品已经在购物车中并且另外添加了1,那么它应该删除之前的1

时间:2014-01-26 12:23:48

标签: wordpress woocommerce product cart shopping

我认为这段代码应该有效,但不能确定放置它的位置。到目前为止,我尝试过的任何地方都失败了......

add_action('init', 'woocommerce_clear_cart');

function woocommerce_clear_cart() {
global $woocommerce, $post, $wpdb;

$url = explode('/', 'http://'.$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
$slug=$url[4];
$postid = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_status='publish' AND post_name = '$slug'");

    if ($postid){
        if ($postid == PRODUCTID1 || $postid == PRODUCTID2){
        $woocommerce->cart->empty_cart();
        }
    }

}

9 个答案:

答案 0 :(得分:38)

不幸的是,没有'行动'在WooCommerce将商品添加到购物车之前挂钩。但他们有一个过滤器'在添加到购物车之前挂钩。 这就是我使用它的方式:

add_filter( 'woocommerce_add_cart_item_data', 'woo_custom_add_to_cart' );

function woo_custom_add_to_cart( $cart_item_data ) {

    global $woocommerce;
    $woocommerce->cart->empty_cart();

    // Do nothing with the data and return
    return $cart_item_data;
}

答案 1 :(得分:14)

根据接受的答案和最新的Woo版本2.5.1,我使用类wc-checkout.php中的代码来更新函数,使其更加清晰

add_filter( 'woocommerce_add_cart_item_data', '_empty_cart' );

    function _empty_cart( $cart_item_data ) {

        WC()->cart->empty_cart();

        return $cart_item_data;
    }

答案 2 :(得分:10)

来自我的answer on another question

过滤器/挂钩,在项目添加到购物车之前运行,因为每个产品在添加之前都经过验证。

因此,在验证产品时,我们可以检查项目是否已经存在购物车中的商品并清除(如果能够添加当前商品)并添加错误消息。

/**
 * When an item is added to the cart, remove other products
 */
function so_27030769_maybe_empty_cart( $valid, $product_id, $quantity ) {

    if( ! empty ( WC()->cart->get_cart() ) && $valid ){
        WC()->cart->empty_cart();
        wc_add_notice( 'Whoa hold up. You can only have 1 item in your cart', 'error' );
    }

    return $valid;

}
add_filter( 'woocommerce_add_to_cart_validation', 'so_27030769_maybe_empty_cart', 10, 3 );

答案 3 :(得分:5)

这对我来说就像一个魅力,删除了以前的产品,并添加了新的产品配置。干杯

更新:适用于WooCommerce 3.0.X

function check_if_cart_has_product( $valid, $product_id, $quantity ) {  

            if(!empty(WC()->cart->get_cart()) && $valid){
                foreach (WC()->cart->get_cart() as $cart_item_key => $values) {
                    $_product = $values['data'];

                    if( $product_id == $_product->get_id() ) {
                        unset(WC()->cart->cart_contents[$cart_item_key]);
                    }
                }
            }

            return $valid;

        }
        add_filter( 'woocommerce_add_to_cart_validation', 'check_if_cart_has_product', 10, 3 );

对于低于3.0.X的WooCommerce版本

function check_if_cart_has_product( $valid, $product_id, $quantity ) {  

    if(!empty(WC()->cart->get_cart()) && $valid){
        foreach (WC()->cart->get_cart() as $cart_item_key => $values) {
            $_product = $values['data'];

            if( $product_id == $_product->id ) {
                unset(WC()->cart->cart_contents[$cart_item_key]);
            }
        }
    }

    return $valid;

}
add_filter( 'woocommerce_add_to_cart_validation', 'check_if_cart_has_product', 10, 3 );

答案 4 :(得分:4)

您有两种选择:

  1. WooCommerce Min/Max Quantities extension
  2. 以下代码已添加到您的functions.php主题文件
  3. 
        add_filter ( 'woocommerce_before_cart' , 'allow_single_quantity_in_cart' );
        function allow_single_quantity_in_cart() {
                global $woocommerce;
    
                $cart_contents  =  $woocommerce->cart->get_cart();
                $keys           =  array_keys ( $cart_contents );
    
                foreach ( $keys as $key ) {
                        $woocommerce->cart->set_quantity ( $key, 1, true );
                }
        }
    
    

答案 5 :(得分:3)

不要将功能直接添加到您的商务文件中...您在更新时将丢失所有代码。

用户函数应始终通过主题的functions.php挂钩。

答案 6 :(得分:2)

试试这个,

要从购物车中删除所有商品并添加最后添加的商品,

//For removing all the items from the cart
global $woocommerce;
$woocommerce->cart->empty_cart();
$woocommerce->cart->add_to_cart($product_id,$qty);

类文件为wp-content/plugins/woocommerce/classes/class-wc-cart.php

您可以在functions.php。

中的添加到购物车功能中添加上述代码

希望它的作品......

答案 7 :(得分:2)

如果您想将产品数量限制为1:

function check_if_cart_has_product( $valid, $product_id, $quantity ) {  

    if(!empty(WC()->cart->get_cart()) && $valid){
        foreach (WC()->cart->get_cart() as $cart_item_key => $values) {
            $_product = $values['data'];

            if( $product_id == $_product->id ) {
                wc_add_notice( 'The product is already in cart', 'error' );
                return false;
            }
        }
    }

    return $valid;

}
add_filter( 'woocommerce_add_to_cart_validation', 'check_if_cart_has_product', 10, 3 );

答案 8 :(得分:1)

Wordpress Product Update Process

在 WordPress 5.6.1 上。无需添加自定义过滤器或编写代码,可以选择限制将一种产品添加到购物车。