Untitled

 avatar
unknown
plain_text
a month ago
2.4 kB
5
Indexable

add_filter('b2bking_cart_item_quantity_tiersz', function($qty, $variation_id, $product_id = '') {

    if (empty($product_id)){
        $product_id = wp_get_post_parent_id($variation_id);
    }

    // Get cached grouped products mapping
    $grouped_products_map = get_transient('b2bking_grouped_products_map');
    
    // If cache doesn't exist, build the mapping
    if (false === $grouped_products_map) {
        $grouped_products_map = [];
        
        // Get all grouped products
        $grouped_products = get_posts(array(
            'post_type' => 'product',
            'posts_per_page' => -1,
            'tax_query' => array(
                array(
                    'taxonomy' => 'product_type',
                    'field' => 'slug',
                    'terms' => 'grouped'
                )
            )
        ));

        // Build mapping of product IDs to their group ID
        foreach ($grouped_products as $grouped_product) {
            $children = get_post_meta($grouped_product->ID, '_children', true);
            if (!empty($children)) {
                foreach ($children as $child_id) {
                    $grouped_products_map[$child_id] = $grouped_product->ID;
                }
            }
        }
        
        // Cache the mapping for 12 hours
        set_transient('b2bking_grouped_products_map', $grouped_products_map, 12 * HOUR_IN_SECONDS);
    }
    
    // If current product is not part of any group, return original quantity
    if (!isset($grouped_products_map[$product_id])) {
        return $qty;
    }
    
    $group_id = $grouped_products_map[$product_id];
    $cart = WC()->cart;
    $total_group_qty = 0;
    
    // Calculate total quantity for all products in the same group
    foreach ($cart->get_cart() as $cart_item) {
        $cart_product_id = $cart_item['product_id'];
        if (isset($grouped_products_map[$cart_product_id]) && 
            $grouped_products_map[$cart_product_id] === $group_id) {
            $total_group_qty += $cart_item['quantity'];
        }
    }
    
    return $total_group_qty;
}, 10, 3);

// Clear cache when products are modified
add_action('save_post_product', function($post_id) {
    delete_transient('b2bking_grouped_products_map');
});

add_action('woocommerce_delete_product', function($post_id) {
    delete_transient('b2bking_grouped_products_map');
});
Leave a Comment