【问题标题】:WooCommerce: If specific product is the only item in cart, clear cartWooCommerce:如果特定产品是购物车中唯一的商品,则清除购物车
【发布时间】:2020-11-15 06:09:37
【问题描述】:

如果用户在我的网站上购买了产品,我会为他们提供在结账时将打折产品添加到购物车的选项。但是,用户可以从购物车中删除原始产品,而打折的产品仍保留在购物车中。

是否有可能这样,如果打折的产品是购物车中唯一的一个,那么购物车应该是空的?我还没有找到办法。

我的尝试

目前,我使用 Github 上的 bekarice 中的 the following code

/**
 * Renders a notice and prevents checkout if the cart
 * only contains products in a specific category
 */
function sv_wc_prevent_checkout_for_category() {
    
    // set the slug of the category for which we disallow checkout
    $category = 'clothing';
    
    // get the product category
    $product_cat = get_term_by( 'slug', $category, 'product_cat' );
    
    // sanity check to prevent fatals if the term doesn't exist
    if ( is_wp_error( $product_cat ) ) {
        return;
    }
    
    $category_name = '<a href="' . get_term_link( $category, 'product_cat' ) . '">' . $product_cat->name . '</a>';
    
    // check if this category is the only thing in the cart
    if ( sv_wc_is_category_alone_in_cart( $category ) ) {
        
        // render a notice to explain why checkout is blocked
        wc_add_notice( sprintf( 'Hi there! Looks like your cart only contains products from the %1$s category &ndash; you must purchase a product from another category to check out.', $category_name ), 'error' );
    }
}
add_action( 'woocommerce_check_cart_items', 'sv_wc_prevent_checkout_for_category' );


/**
 * Checks if a cart contains exclusively products in a given category
 * 
 * @param string $category the slug of the product category
 * @return bool - true if the cart only contains the given category
 */
function sv_wc_is_category_alone_in_cart( $category ) {
        
    // check each cart item for our category
    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
        
        // if a product is not in our category, bail out since we know the category is not alone
        if ( ! has_term( $category, 'product_cat', $cart_item['data']->id ) ) {
            return false;
        }
    }
        
    // if we're here, all items in the cart are in our category
    return true;
}

但我不认为这是一个很好的方法。基本上,如果购物车仅包含某个类别的商品,它不允许用户结帐。

【问题讨论】:

    标签: php wordpress woocommerce product cart


    【解决方案1】:

    您可以使用以下代码检查是否将您的特定折扣产品添加到购物车中,即购物车不是空的并且它不是单独在购物车中,然后将其从购物车中删除:

    // Add to cart validation for the discounted product
    add_filter( 'woocommerce_add_to_cart_validation', 'check_specific_discounted_product', 10, 3 );
    function check_specific_discounted_product( $passed, $product_id, $quantity ) {
        // Settings
        $discounted_product_id = 53;
    
        if( WC()->cart->is_empty() && $discounted_product_id == $product_id ) {
            wc_add_notice( __("This product can't be purchased alone."), 'notice' );
            return false;
        }
    
        return $passed;
    }
    
    // Removing the discounted product if it's alone in cart
    add_action( 'woocommerce_before_calculate_totals', 'conditionally_remove_a_discounted_product' );
    function conditionally_remove_a_discounted_product( $cart ) {
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
        // Settings
        $discounted_product_id = 53;
    
        // Initializing variables
        $discounted_item_key = false;
    
        // Loop through cart items (first loop)
        foreach ( $cart->get_cart() as $cart_item_key => $cart_item ){
            // When free productis is cart
            if ( in_array( $discounted_product_id, array($cart_item['product_id'], $cart_item['variation_id']) ) ) {
                $discounted_item_key = $cart_item_key;
            }
            // if any other product is in cart: EXIT
            else {
               return;
            }
        }
        // When the discounted product is alone in cart, remove it
        if( $discounted_item_key ) {
            // display notice on removal (optional)
            wc_clear_notices();
            wc_add_notice( __("The discounted product can't be purchased alone and has been removed."), 'notice' );
    
            $cart->remove_cart_item( $discounted_item_key ); // Remove
        }
    }
    

    代码在您的活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

    【讨论】:

    • Loic,你怎么知道需要使用woocommerce_add_to_cart_validation这个钩子?
    • @gvgvgvijayan 因为,我试过没有,但有问题......这就是为什么......
    • github.com/woocommerce/woocommerce/blob/master/includes/… 我希望这对某人有所帮助,为什么单击 ajax 添加到购物车按钮时验证失败,将其重定向到产品页面。
    • @gvgvgvijayan 错误:它与 Ajax 兼容 添加到所有存档页面上的购物车 请在 WC_Ajax class 中查看它,它在产品循环上运行......现在请停止这个,因为我在这里回答 OP 和这段代码已经过测试并且运行良好。
    • @LoicTheAztec une 解决方案!求救!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 2019-01-27
    • 2018-06-03
    • 1970-01-01
    • 2018-07-31
    • 2018-10-19
    相关资源
    最近更新 更多