web-dev-qa-db-ja.com

カートに商品を1つだけ入れるには、Woocommerceが必要です。製品がすでにカートにあり、別の1が追加されている場合、前の1を削除する必要があります

私はこのコードはうまくいくと思いますが、どこに置くべきか正確にはわかりません。私が試したところどこでも失敗しました...

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();
        }
    }

}
18
Swof

残念ながら、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;
}
38
fornyhucker

受け入れられた回答と最新のWooバージョン2.5.1に基づいて、wooをclass-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;
    }
14
Jared

私から 別の質問に答える

そこにisアイテムがカートに追加される前に実行されるフィルター/フックは、各製品が追加される前に検証を受けます。

そのため、製品を検証するときに、カートにすでにアイテムがあるかどうかをチェックし、それらをクリアして(現在のアイテムを追加できる場合)、エラーメッセージを追加できます。

/**
 * 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 );
10
helgatheviking

これは私の魅力のように機能し、以前の製品を削除し、新しい製品構成で新しい製品を追加します。乾杯

更新: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 );

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->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 );
5
Digamber

次の2つのオプションがあります。

  1. WooCommerce最小/最大数量拡張
  2. functions.phpテーマファイルに追加された次のコード
 
 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); 
} 
} 
 
4

コマースファイルに直接関数を追加しないでください。更新すると、すべてのコードが失われます。

ユーザー関数は、常にテーマのfunctions.phpを通じてフックする必要があります。

3
Ross

製品の数を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 );
2
Rao

これを試して、

カートからすべての商品を削除し、最後に追加した商品を追加するには、

//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のカートに追加する関数に追加できます。

その作品を願っています...

2
Jobin Jose