WooCommerce में विशिष्ट श्रेणी से प्रत्येक 2 आइटम को फ्लैट रेट शिपिंग के लिए अतिरिक्त लागत जोड़ें

Jan 16 2021

Woocommerce उत्तर कोड में प्रत्येक 3 आइटम को फ्लैट दर शिपिंग करने के लिए अतिरिक्त लागत जोड़ें के आधार पर , मैंने फ्लैट में एक अतिरिक्त लागत जोड़ने के लिए कुछ बदलाव किए हैं प्रत्येक 2 आइटम (बजाय प्रत्येक 3 आइटम) की शिपिंग विधि है और केवल जब विशेष रूप से आइटम होते हैं एक विशिष्ट श्रेणी से (यहां "टी-शर्ट्स" श्रेणी)।

यहाँ मेरा कोड प्रयास है:

// add X amount to shipping for every 2 items added to the cart (flat rate only)
add_filter('woocommerce_package_rates', 'shipping_additional_cost_each_three_items', 100, 2);
function shipping_additional_cost_each_three_items( $rates, $package ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return $rates; // HERE set your additional shipping cost $additional_cost = 8.40;
    $items_count = WC()->cart->get_cart_contents_count(); // Define/replace here your correct category slug (!) $product_category = 't-shirts';
    $prod_cat = false; // Going through each item in cart to see if there is anyone of your category foreach ( WC()->cart->get_cart() as $cart_item ) {
        $product_id = $cart_item['product_id'];
        if ( has_term( $product_category, 'product_cat', $product_id ) ){
            $prod_cat = true; } } // Loop through the shipping taxes array foreach ( $rates as $rate_key => $rate ){
        $has_taxes = false; // Targetting "flat rate" if( 'flat_rate' === $rate->method_id ){

            // Get the initial cost
            $initial_cost = $new_cost = $rates[$rate_key]->cost;

            // Adding the additional cost if product in T-Shirt category after every 2 items (3, 6, 9 …)
            if ( $prod_cat ) { for($i = 0; $i <= $items_count; $i+=3){ $new_cost += $additional_cost; } } // Set the new cost $rates[$rate_key]->cost = $new_cost;

            // Taxes rate cost (if enabled)
            $taxes = []; // Loop through the shipping taxes array (as they can be many) foreach ($rates[$rate_key]->taxes as $key => $tax){ if( $rates[$rate_key]->taxes[$key] > 0 ){
                    // Get the initial tax cost
                    $initial_tax_cost = $new_tax_cost = $rates[$rate_key]->taxes[$key]; // Get the tax rate conversion $tax_rate    = $initial_tax_cost / $initial_cost;

                    // Set the new tax cost
                    $taxes[$key] = $new_cost * $tax_rate;
                    $has_taxes = true; // Enabling tax } } } if( $has_taxes )
            $rates[$rate_key]->taxes = $taxes; return $rates;
    }
}

"फ्लैट रेट" के लिए चुने गए शिपिंग विधि, कोड ठीक काम करता है जब "टी-शर्ट" श्रेणी के आइटम कार्ट में होते हैं। लेकिन अगर कोई ऐसा आइटम है जो "टी-शर्ट" श्रेणी का नहीं है, तो दर गायब हो जाती है और बिना किसी राशि के शीर्षक दिखाती है।

क्या कोई मुझे बता सकता है कि मुझे उस कोड को क्रियाशील बनाने के लिए 'अगर श्रेणी X है', तो क्या शर्त रखनी होगी?

जवाब

1 LoicTheAztec Jan 16 2021 at 14:15

आपके कोड में कुछ गलतियाँ हैं (जैसे return $rates;कि अंतिम समापन ब्रैकेट से ठीक पहले होना चाहिए)। इसके बजाय निम्नलिखित पुनरीक्षित कोड का प्रयास करें:

add_filter('woocommerce_package_rates', 'shipping_additional_cost_each_three_items', 100, 2);
function shipping_additional_cost_each_three_items( $rates, $package ){ if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return $rates;

    // HERE set your additional shipping cost
    $additional_cost = 8.40; $each_items      = 2; // Number of items (for additional cost)

    // Her set your category(ies) (can be term Ids slugs or names)
    $product_categories = array('t-shirts'); $items_cat_count    = 0; // Initializing

    // Loop through cart items for the current shipping package        
    foreach( $package['contents'] as $cart_item ) {
        if ( ! has_term( $product_categories, 'product_cat', $cart_item['product_id'] ) ){
            $items_cat_count += $cart_item['quantity']; // Count items from defined category
        }
    }
    
    if ( $items_cat_count >= $each_items ) {
       // Loop through the shipping taxes array
        foreach ( $rates as $rate_key => $rate ){ // Targetting "flat rate" if( 'flat_rate' === $rate->method_id ){
                $initial_cost = $new_cost = $rate->cost; // Get the initial cost $has_taxes    = false; // Initializing
                $taxes = array(); // Initializing // Adding to cost the additional cost each 2 items (2, 4, 6 …) for($i = 0; $i <= $items_cat_count; $i += $each_items){
                    $new_cost += $additional_cost;
                }
                $rates[$rate_key]->cost = $new_cost; // Set the new cost // Taxes rate cost (if any) - Loop through taxes array (as they can be many) foreach ($rate->taxes as $key => $tax){
                    if( $tax > 0 ){ // Get the initial tax cost $initial_tax_cost = $new_tax_cost = $tax;
    
                        // Get the tax rate conversion
                        $tax_rate = $initial_tax_cost / $initial_cost; // Set the new tax cost in the array $taxes[$key] = $new_cost * $tax_rate; $has_taxes   = true; // Enabling tax changes
                    }
                }
                // set array of shipping tax cost
                if( $has_taxes ) { $rates[$rate_key]->taxes = $taxes; 
                }
            } 
        }
    }
    return $rates;
}

कोड सक्रिय चाइल्ड थीम (या सक्रिय थीम) की फ़ंक्शन.php फ़ाइल में जाता है। यह काम करना चाहिए।

कैश्ड डेटा को रीफ़्रेश करने के लिए अपनी कार्ट को खाली करना न भूलें।