Как изменить суммы налогов при обновлении заказа

Вопрос или проблема

Я разрабатываю плагин на основе WooCommerce для заказа подарочных коробок. Каждая коробка — это продукт WooCommerce, состоящий из нескольких “альтернативных продуктов” (которые созданы на основе кастомного типа поста). По некоторым причинам (коробка может иметь разные ставки налогов и т.д.) мне нужно переопределять суммы налогов при оформлении заказа. Мне удалось сделать это следующим образом:

add_action( 'woocommerce_calculate_totals', 'custom_calc_total', 999, 1 );
function custom_calc_total( $cart ) {
    // здесь я рассчитываю суммы различных налогов в зависимости от содержимого коробок

    // и здесь я перезаписываю сумму налогов в корзине моими значениями
    $cart->set_cart_contents_taxes(
        array(
            1 => $total_tax20, // французский налог 20%
            5 => $total_tax5, // французский налог 5.5%
            //=> идентификаторы 1 и 5 зависят от моего сайта
        )
    );
}

Клиент может завершить заказ, и если продавец перейдет в панель заказов на бэкенде, мы увидим правильные суммы налогов (имею в виду индивидуально рассчитанные).

правильные суммы

(A: мои коробки и суммы индивидуальных налогов, сохранённые в метаданных продуктов на случай; B: правильные суммы, когда заказ еще не обновлён)

Но если продавец обновит заказ, чтобы изменить статус с “в ожидании” на “завершено”, например, WooCommerce, я думаю, пересчитывает и обновляет некоторые значения (итоги, налоги и т.д.). Таким образом, поскольку мой продукт WooCommerce “Подарочная коробка” является своего рода “ложным продуктом”, значения которого (цена, вес, налоги и т.д.) перезаписываются в процессе покупки в зависимости от содержимого коробки, результаты пересчета WooCommerce оказываются неверными.

неверные суммы

(после обновления заказа сумма налога неверна. Здесь имеется только налог на доставку, поскольку коробка является продуктом WooCommerce с фиксированной ставкой)

Итак, как (какой хук и какую функцию) можно использовать, чтобы мой плагин переопределял суммы налогов при обновлении заказа так же, как я делаю это в процессе покупки?

Я нашел хук woocommerce_order_after_calculate_totals и другие, такие как здесь
и я нашел некоторые полезные функции, такие как $order->get_total_tax(), $order->get_cart_tax(), $order->get_tax_totals(), $order-> get_taxes(), $order->set_cart_tax()
поэтому я попробовал что-то вроде этого:

add_action( 'woocommerce_order_after_calculate_totals', 'woocommerce_order_after_calculate_totals_test', 999,2);
function woocommerce_order_after_calculate_totals_test ($and_taxes, $order){
    $order->set_cart_tax( 1000 );//изменение общей суммы налогов, а не
    $order->save();
}

но я упустил что-то, и мне не удается сделать то, что я хочу.

Я также видел что-то вроде этого, но еще не пробовал. Возможно, это направление для изучения? :

apply_filters( 'woocommerce_order_get_tax_totals', $tax_totals, $this );

и

$order->update_meta_data( '_' . $key, $value ); ?

Так что, если у вас есть идея, было бы здорово.

Спасибо

Что ж, мне удалось отфильтровать вывод итогов:

add_filter( 'woocommerce_order_get_tax_totals', 'filter_function_name_1942', 10, 2 );
function filter_function_name_1942( $tax_totals, $order ){

   foreach( $tax_totals as $single_tax_key => $single_tax_value ){
	    if( $single_tax_value->rate_id == 1){
            $tax_totals[$single_tax_key]->amount = 1000;
            $tax_totals[$single_tax_key]->formatted_amount = wc_price('1000');
	    }
    }
    
    return $tax_totals;
}

Это просто пример с жестко заданными значениями, но он работает.

Проблема, которую я теперь вижу, состоит в том, что таким образом отображаемое значение верно, но записанное в базу данных значение все еще неверно (я полагаю). Я прав? Необходимо ли сохранять правильное значение также в базе данных? если оно используется другим плагином, например. Если да, есть идея, как это сделать? Я не могу найти метод для сохранения пользовательского значения

Ответ или решение

Чтобы решить проблему с изменением суммы налогов при обновлении заказа в WooCommerce для вашего плагина "Подарочные коробки", необходимо учитывать несколько факторов. Ваша задача состоит в том, чтобы сохранить корректные значения налогов не только на этапе оформления заказа, но и при его последующем обновлении администратором. Вот пошаговый подход к решению вашей задачи.

1. Понимание сути проблемы

WooCommerce, при каждом обновлении заказа через панель администратора, пересчитывает налоги, что приводит к неправильному отображению налогов для ваших "виртуальных" продуктов. Ваш текущий метод фильтрации выводимых налогов решает проблему отображения, но не обновляет сохраненные в базе данных значения. Это может стать проблемой, если другие плагины или функции будут зависеть от этих значений.

2. Выбор правильного хука

Для решения задачи необходимо использовать правильные хуки, которые позволяют изменять налоги не только для отображения, но и для сохранения:

  • woocommerce_order_before_save: Этот хук вызывается перед сохранением заказа в базе данных и может использоваться для изменения данных заказа перед его сохранением.
  • save_post_shop_order: Этот хук вызывается при сохранении постов типа shop_order, что может быть полезно для манипуляции данными заказа до их сохранения.

3. Реализация изменения налогов

Используйте код ниже для реализации логики изменения налогов в заказах:

add_action('woocommerce_order_before_save', 'custom_update_order_taxes', 10, 2);

function custom_update_order_taxes($order) {
    // Обновите данные о налогах на основе содержимого заказа (например, содержимого коробки)
    $new_taxes = array(
        // Предполагается, что $new_tax20 и $new_tax5 содержат обновленные значения налогов
        1 => $new_tax20, // Налог 20%
        5 => $new_tax5,  // Налог 5.5%
    );

    // Устанавливаем обновленные значения налогов
    $order->set_taxes($new_taxes);

    // Не забывайте обновлять другие данные заказа, если необходимо
    // $order->set_total(...); // Другие изменения
}

4. Сохранение обновленных данных

После изменения налоговых данных, обязательно вызывайте метод $order->save(), чтобы гарантировать сохранение этих изменений в базе данных.

// Внутри вашей функции
$order->save();

5. Проверка и тестирование

После внедрения вышеуказанных изменений, убедитесь, что тестируете на реальном сайте или в тестовом окружении:

  • Оформите заказ с вашей "Подарочной коробкой" и убедитесь, что налоги отображаются правильно.
  • Измените статус заказа через административный интерфейс и проверьте, что налоги остаются корректными.
  • Убедитесь, что другие плагины и функции, использующие данные о налогах, также работают корректно.

Заключение

Подходя к решению этой задачи, важно не только исправить визуальное отображение налогов, но и гарантировать корректность записей в базе данных. Это поможет избежать проблем совместимости с другими функциями и плагинами WooCommerce.

Оцените материал
Добавить комментарий

Капча загружается...