WooCommerce Product Bundles - Cart Quantity

谁都会走 提交于 2019-12-02 03:41:11

I believe that a Bundle in per-product pricing mode will automatically count the number of bundled items. When in "bundle" mode the number of items is assumed to be equal to the parent.

This count tweak is achieved in the Bundles' cart class... so I think it could be disabled via:

function so_28359520_remove_bundles_counting(){
    global $woocommerce_bundles;
    remove_filter( 'woocommerce_cart_contents_count',  array( $woocommerce_bundles->display, 'woo_bundles_cart_contents_count' ) );
}
add_action( 'init', 'so_28359520_remove_bundles_counting' );

Edit: I've revised the code above because it seems that Bundles is using a global variable to access the plugin's main class. Additionally, I think that woocommerce_loaded fires before the theme is loaded, so that wasn't likely to work ever. I've changed to the init hook.

Edit 2: Bundles will skip counting on the parent item if that item is set to use per-product shipping calculations. But if that isn't applicable then you need to disable the Bundles filtering and apply your own:

function so_28359520_cart_contents_count( $count ) {

    $cart = WC()->cart->get_cart();

    $subtract = 0;

    foreach ( $cart as $key => $value ) {

        if ( isset( $value[ 'stamp' ] ) && ! isset( $value[ 'bundled_by' ] ) ) {
            $subtract += $value[ 'quantity' ];
        }
    }

    return $count - $subtract;

}
add_filter( 'woocommerce_cart_contents_count',  'so_28359520_cart_contents_count' );
David Clough

With heaps of help from @helgatheviking I have been able to come up with the following solution in my functions.php:

function cit_update_cart_count() {
    global $woocommerce;
    $count = 0;
    $cart = $woocommerce->cart->get_cart();
    foreach ($cart as $key => $value) {
        if (!isset($value['bundled_items'])) {
            $count += $value['quantity'];
        }
    }
    $woocommerce->cart->cart_contents_count = $count;
}
add_action('init','cit_update_cart_count',10);
theminjus

You can use the same function in early posts that is written here

  function so_28359520_cart_contents_count( $count ) {

    $cart = WC()->cart->get_cart();

    $subtract = 0;

    foreach ( $cart as $key => $value ) {

        if ( isset( $value[ 'stamp' ] ) && ! isset( $value[ 'bundled_by' ] ) ) {
            $subtract += $value[ 'quantity' ];
        }
    }

    return $count - $subtract;

}

But you must use it inside class-wc-pb-cart.php

and inside construct add
add_filter( 'woocommerce_cart_contents_count', 'so_28359520_cart_contents_count' );

That works like a charm , but in my theme I had problem with WC()->cart->cart_contents_count in header.php , somehow the filter is not applied on that , but using

<?php 
    global $woocommerce;
    // get cart quantity
    $qty = $woocommerce->cart->get_cart_contents_count();
?>

Inside header.php the filter is applied and I get the correct count.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!