从 WooCommerce 中具有特定标签的产品中获取购物车商品数量

Get cart items quantities from products with specific tag in WooCommerce

思路:

客户将一个盒子放入购物车(四种不同的简单产品)。每盒可装 4、9、16 或 24 件。

然后客户开始选择要放入箱子中的产品。这些产品应来自混搭产品标签。如果不是,它们将单独包装,但更重要的是,不算混搭产品。

我不知道怎么做是这样的:

该函数需要计算购物车中有多少箱子,并自动计算可以添加多少件。

整体例子:

客户添加了可装4件的盒子和可装16件的盒子。客户现在总共可以将 20 种混搭产品添加到购物车。

如果客户没有将 20 件混搭产品添加到他们的购物车,则会显示一条消息。如果客户将超过 20 种混搭产品添加到他们的购物车,则会显示不同的消息。

以下是一些消息示例:

“您添加了适合 XX 件的盒子。请将额外的 XX 混搭产品添加到您的购物车。注意:非混搭产品将单独包装在玻璃纸袋中。”

"您已添加XX盒。您可以添加XX件。请在您的购物车中添加额外的XX混搭产品。注意:非混搭产品将单独包装在玻璃纸袋中."

这是我需要帮助修改的代码:

add_action('woocommerce_before_shop_loop', 'number_of_pieces_in_boxes', 1, 1 );
add_action('woocommerce_before_add_to_cart_form', 'number_of_pieces_in_boxes', 1, 1 );
function number_of_pieces_in_boxes( $cart ) {

    if ( is_admin() && !defined( 'DOING_AJAX' ) ) return;

    global $product;

    $product_count = WC()->cart->cart_contents_count;

    $product_ids = array( 1718, 1719, 1720, 1721 );

    $fits_four = '4';
    $fits_nine = '9';
    $fits_sixteen = '16';
    $fits_twentyfour = '24';
    $piece_slug = 'mix-and-match';

    $in_cart = false;

        foreach( WC()->cart->get_cart() as $cart_item ) {

            $product_in_cart = $cart_item['product_id'];

            if ( in_array( $product_in_cart, $product_ids ) && has_term( 'mix-and-match', 'product_tag', $product_in_cart, $product_ids ) ) {

                $in_cart = true;

                break;
        }
    }

    if ( ! $in_cart ) {

        echo '<div class="product-count">You have '.$product_count.' pieces in your cart whereof none fits inside a box. We will pack and wrap them for you.</div>';

        } else {
    
            echo '<div class="product-count">You have '.$product_count.' pieces in your cart.</div>';
    }
}

我真的很感激我能得到的任何帮助。

  • 您使用的钩子默认不包含 $cart 作为参数
  • 要从包含特定标签的购物车中的产品中获取购物车商品数量,您可以使用 WC_Cart::get_cart_item_quantities()
  • $box_ids数组中添加箱子+产品ID的内容,确保这些产品不包含相关标签
  • 带有特定标签的产品的购物车商品数量保存在计数器中
  • 每个盒子可以装的东西 * 购物车里每个盒子的件数存储在另一个柜台
  • 有了这个包含您需要的所有数据的基本答案,您可以选择任何一种方式,这取决于您具体想要什么

所以你得到:

function action_woocommerce_before_add_to_cart_form() {
    // Settings
    $term = 'mix-and-match';
    $taxonomy = 'product_tag';
    
    // Box IDs. Important, these should not contain the term!
    // Contents => Product ID
    $box_ids = array( 
        4  => 1718,
        9  => 1719,
        16 => 1720,
        20 => 1721
    );
    
    // Initialize
    $total_term = 0;
    $total_box = 0;
    
    // True
    if ( WC()->cart ) { 
        // Loop trough cart items quantities
        foreach( WC()->cart->get_cart_item_quantities() as $product_id => $cart_item_quantity ) {
            // Contains the definite term
            if ( has_term( $term, $taxonomy, $product_id ) ) {
                // Add the cart item quantity from this certain product to the counter
                $total_term += $cart_item_quantity;
            // The box ID is in the cart
            } elseif( in_array( $product_id, $box_ids ) ) {
                // Add contens * the cart item quantity to the counter
                $total_box += ( array_search ( $product_id, $box_ids ) * $cart_item_quantity );
            }
        }
    }
    
    echo '<p>Total term: ' . $total_term . '</p>';
    echo '<p>Total box = ' . $total_box . '</p>';
}
add_action( 'woocommerce_before_add_to_cart_form', 'action_woocommerce_before_add_to_cart_form', 10, 0 );