Настроить сумму налога в хуке woocommerce_package_rates

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

Вот мой код:

add_filter( 'woocommerce_package_rates', 'woocommerce_package_rates' );
function woocommerce_package_rates( $rates ) {
    $user_id = get_current_user_id();
    if ( ! wc_memberships_is_user_active_member( $user_id, 'silver' ) ) { return $rates; }
    $discount_amount = 30; // 30%

    foreach($rates as $key => $rate ) {
        $rates[$key]->cost = $rates[$key]->cost - ( $rates[$key]->cost * ( $discount_amount/100 ) );
    }

    return $rates;
}

Но еще один шаг - это налог! Я ввел неверный налог.
Например, у меня есть стоимость доставки 3$. Со скидкой теперь 2,10$.

Я покупаю один товар за 2$ и за 2.10$ доставку. Я получил 1 доллар в качестве налога (так как стоимость доставки 3 доллара. Похоже, он не принимает изменения), и обычно это 0.82$.

Что мне нужно, чтобы правильно рассчитать налог?


person Efbi    schedule 04.09.2017    source источник


Ответы (2)


Обновление: связано с расчетом налоговой стоимости для способов доставки.

В вашем коде есть небольшие ошибки, и вы пропустили скидку при расчете налога. Я немного пересмотрел ваш код, вы должны попробовать это:

add_filter( 'woocommerce_package_rates', 'conditional_shipping_discount', 10, 2 );
function conditional_shipping_discount( $rates, $packages ) {

    $user_id = get_current_user_id();
    if ( ! wc_memberships_is_user_active_member( $user_id, 'silver' ) ) return $rates;

    $percent = 30; // 30%
    $discount = 1 - ($percent / 100);

    foreach($rates as $rate_key => $rate_values ) {
        // Get original cost
        $original_cost = $rates[$rate_id]->cost;
        // Calculate the discounted rate cost
        $new_cost = $original_cost * $discount;
        // Set the discounted rate cost
        $rates[$rate_key]->cost = number_format(new_cost, 2);
        // calculate the conversion rate (for taxes)
        $conversion_rate = $new_cost / $original_cost;

        // Taxes rate cost (if enabled)
        $taxes = array();
        foreach ($rate->taxes as $key => $tax){
            if( $tax > 0 ){ // set the new tax cost
                // set the new line tax cost in the taxes array
                $taxes[$key] = number_format( $tax * $conversion_rate, 2 );
            }
        }
        // Set the new taxes costs
        $rates[$rate_key]->taxes = $taxes
    }
    return $rates;
}

Код находится в файле function.php вашей активной дочерней темы (или темы) или также в любом файле плагина.

Этот код протестирован и работает.

Вам необходимо обновить кеши доставки:

  1. Сначала этот код уже сохранен в вашем файле function.php.
  2. В настройках доставки введите Зону доставки, отключите Способ доставки и сохраните. Затем снова включите этот Способ доставки и сохраните. Готово.
person LoicTheAztec    schedule 04.09.2017
comment
Ой, милый! Большое спасибо @LoicTheAztec !! Совершенно то, что мне нужно - person Efbi; 05.09.2017
comment
Я не понимаю, я использую ваш ответ и на этот раз расчет налога не работает. Может, этот код с чем-то конфликтует? - person Efbi; 11.01.2018
comment
@Efbi Я обновил код, связанный с расчетом налога - person LoicTheAztec; 11.01.2018
comment
Привет, некоторые проблемы возникли, 1 / Части тарифов скрывают цену 2 / Когда я помещаю часть налогов, у меня остается пустая страница - person Efbi; 12.01.2018
comment
Упс, это просто; пропущенный. Спасибо, это работает ! Я сохраняю предыдущую версию, потому что она скрывает цену и адаптирует ее - person Efbi; 12.01.2018
comment
Немного поздно, но почему бы просто не использовать $ rate_values- ›Tax = $ Tax; вместо $ rate [$ rate_key] - ›Tax = $ Tax? - person Jordan Carter; 27.11.2020

Ниже код @LoicTheAztec без ошибок:

add_filter( 'woocommerce_package_rates', 'conditional_shipping_discount', 10, 2 );
    function conditional_shipping_discount( $rates, $packages ) {

    $user_id = get_current_user_id();
    if ( ! wc_memberships_is_user_active_member( $user_id, 'silver' ) ) return $rates;

    $percent = 30; // 30%
    $discount = 1 - ($percent / 100);

    foreach($rates as $rate_key => $rate_values ) {
        // Get original cost
        $original_cost = $rates[$rate_key]->cost;
        // Calculate the discounted rate cost
        $new_cost = $original_cost * $discount;
        // Set the discounted rate cost
        $rates[$rate_key]->cost = number_format($new_cost, 2);
        // calculate the conversion rate (for taxes)
        $conversion_rate = $new_cost / $original_cost;

        // Taxes rate cost (if enabled)
        $taxes = array();
        foreach ($rates[$rate_key]->taxes as $key => $tax){
            if( $tax > 0 ){ // set the new tax cost
                // set the new line tax cost in the taxes array
                $taxes[$key] = number_format( $tax * $conversion_rate, 2 );
            }
        }
        // Set the new taxes costs
        $rates[$rate_key]->taxes = $taxes;
    }
    return $rates;
}
person Jankyz    schedule 14.06.2019