Установите минимальную и максимальную стоимость доставки по зоне доставки в WooCommerce

У меня сейчас 2 зоны доставки (Франция, Европа), и в каждой из них есть несколько вариантов доставки, включая фиксированную ставку. Эти варианты с фиксированной ставкой имеют другое уравнение для расчета комиссии в зависимости от количества товара с тремя разными классами доставки A B и C. Это достаточно просто сделать с помощью расширенных вариантов затрат, встроенных в Woocommerce.

Моя проблема в том, что я хотел бы установить минимум и максимум для платы за доставку, и эти минимумы / максимумы предназначены только для варианта с фиксированной ставкой и отличаются от географической зоны к другой. В двух словах :

  • Метод фиксированной ставки во Франции: 2€ + (1€*[qtyA] + 2€*[qtyB] + 5€*[qtyC]) с Min = 7 и Max = 15
  • Метод фиксированной ставки в Европе: 6€ + (2€*[qtyA] + 4€*[qtyB] + 8€*[qtyC]) с Min = 10 и Max = 25

Я попытался написать код в function.php с условиями, зависящими от зоны доставки и способа доставки, но ни минимальное, ни максимальное значение не применяются.

Надеюсь, может быть, кто-нибудь сможет помочь, поскольку это сводит меня с ума.

function maximum_shipping_rates_function( $rates, $package ) {

    $methods = WC()->shipping()->get_shipping_methods();
    $shipping_limit = 10.50; // I set my minimul to 10.50€
    $only_apply_to_rates = array( 'shipping_method_0_flat_rate2', 'flat_rate' ); // I put here the Shipping method ID thqt I get by inspecting the option on the checkout page

    // Loop through all rates
    foreach ( $rates as $rate_id => $rate ) {
        
        // Skip the shipping rates that are not in the list
        if ( ! in_array( $rate_id, $only_apply_to_rates ) ) {
            continue;
        }
        
        // Check if the rate is higher than my maximum
        if ( $rate->cost > $shipping_limit ) {
            $rate->cost = $shipping_limit;
            
            // Recalculate shipping taxes
            if ( $method = $methods[ $rate->get_method_id() ] ) {
                $taxes = WC_Tax::calc_shipping_tax( $rate->cost, WC_Tax::get_shipping_tax_rates() );
                $rate->set_taxes( $method->is_taxable() ? $taxes : array() );
            }
        }

    }

    return $rates;}
add_action( 'woocommerce_package_rates', 'maximum_shipping_rates_function', 10, 2 );

person Nick54530    schedule 05.01.2021    source источник
comment
Вы всегда должны указывать в своем вопросе код, который вы пытались написать, даже если он не работает… Без этого никто не собирается писать его для вас с нуля бесплатно.   -  person LoicTheAztec    schedule 06.01.2021
comment
Спасибо за совет @LoicTheAztec - я добавил свой код выше.   -  person Nick54530    schedule 07.01.2021


Ответы (1)


Чтобы установить другую минимальную и максимальную стоимость доставки по названию зоны доставки, используйте вместо этого следующее:

add_filter( 'woocommerce_package_rates', 'specificproductsshipping_methods', 10, 2 );
function specificproductsshipping_methods( $rates, $package ){
    $first_rate  = reset($rates); // get first rate (to get the shipping zone from)
    $chosen_zone = WC_Shipping_Zones::get_zone_by( 'instance_id', $first_rate->instance_id ); // Current Shipping Zone Object
    $zone_name   = $chosen_zone->get_zone_name(); // Get shipping zone name

    // Loop through all rates
    foreach ( $rates as $rate_key => $rate ) {
        // Targeting "Flat rate" shipping methods only
        if ( 'flat_rate' === $rate->method_id ) {
            $initial_cost = $new_cost = $rate->cost;

            // 1. For "France" shipping zone name (set min and max cost)
            if ( 'France' === $zone_name ) {
                if ( $initial_cost < 7 ) {
                    $new_cost = 7;
                } elseif ( $initial_cost > 15 ) {
                    $new_cost = 15;
                }
            }
            // For "Europe" shipping zone name (set min and max cost)
            elseif ( 'Europe' === $zone_name ) {
                if ( $initial_cost < 10 ) {
                    $new_cost = 10;
                } elseif ( $initial_cost > 25 ) {
                    $new_cost = 25;
                }
            }

            if ( $new_cost != $initial_cost ) {
                $rates[$rate_key]->cost = $new_cost; // Set the new cost

                $taxes = []; // Initializing

                // Taxes: Loop through the shipping taxes array (as they can be many)
                foreach ($rate->taxes as $key => $tax){
                    if( $tax > 0 ){
                        $initial_tax_cost = $tax; // Get the initial tax cost

                        $tax_rate    = $initial_tax_cost / $initial_cost; // Get the tax rate conversion

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

Код находится в файле functions.php активной дочерней темы (или активной темы). Проверено и работает.

Не забудьте очистить корзину, чтобы обновить кеши способов доставки.

person LoicTheAztec    schedule 07.01.2021