Необходимо, чтобы 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();
        }
    }

}

Ответ 1

К сожалению, нет крюка "действия", прежде чем 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;
}

Ответ 2

Основываясь на принятом ответе и последней версии 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;
    }

Ответ 3

Из моего ответа по другому вопросу:

Существует фильтр/крюк, который выполняется до добавления элемента в корзину, поскольку каждый продукт проходит проверку до его добавления.

Таким образом, при проверке продукта мы можем проверить, есть ли элемент, если в корзине уже есть элементы, и очищает их (если текущий элемент можно добавить) и добавляет сообщение об ошибке.

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

Ответ 4

Это работало для меня как шарм, удаляет предыдущий продукт и добавляет новый с новой конфигурацией продукта. Приветствия

Обновление: для 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

У вас есть два варианта:

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

Ответ 6

Не добавляйте функции непосредственно в файлы вашей коммерции... вы потеряете весь свой код при обновлении.

Пользовательские функции всегда должны быть подключены через функцию functions.php вашей темы.

Ответ 7

Попробуйте это,

Для удаления всех продуктов из корзины и добавления последнего добавленного,

//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.

Надейся на свои работы.

Ответ 8

Все как есть, так как у тебя есть все, что нужно,

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