ПРИМЕР:
Товар 1 стоит 33 евро
Товар 2 стоит 44 евро
Товар 3 стоит 55 евро
Общая стоимость заказа : 132 евро = бесплатная доставка.
Клиент просит вернуть товар 2, поэтому общая стоимость заказа меняется на менее 100 евро.
Общая стоимость заказа: Стандартная стоимость доставки 88 евро + 9 евро.
Но теперь, когда я возвращаю 1 товар, постоянно сообщается о бесплатной доставке, что неверно.
Код: Выделить всё
add_action('woocommerce_order_refunded', 'adjust_shipping_after_refund', 10, 2);
function adjust_shipping_after_refund($order_id, $refund_id) {
$order = wc_get_order($order_id);
$total_sale_price = 0;
// Calculate new total after refund
foreach ($order->get_items() as $item_id => $item) {
$product = $item->get_product();
$quantity = $item->get_quantity();
$sale_price = $product->get_sale_price();
if ($sale_price) {
$total_sale_price += $sale_price * $quantity;
} else {
$total_sale_price += $product->get_regular_price() * $quantity;
}
}
// If the total is under €100, apply flat rate shipping
if ($total_sale_price < 100) {
foreach ($order->get_shipping_methods() as $shipping_item_id => $shipping_item) {
if ($shipping_item->get_method_id() === 'free_shipping') {
$order->remove_item($shipping_item_id); // Remove free shipping
}
}
// Add flat rate shipping of €9
if (empty($order->get_shipping_methods())) {
$rate = new WC_Shipping_Rate('flat_rate', 'Verzendkosten', 9, array(), 'flat_rate');
$shipping_item = new WC_Order_Item_Shipping();
$shipping_item->set_props(array(
'method_title' => $rate->get_label(),
'method_id' => $rate->get_method_id(),
'total' => wc_format_decimal($rate->get_cost())
));
$order->add_item($shipping_item);
}
// Recalculate totals
$order->calculate_totals();
$order->save();
}
}
- Подключился к woocommerce_order_refunded действие для перерасчета стоимости доставки.
- Удален метод бесплатной доставки, когда общая сумма составляет менее 100 евро.
- Добавлен новый способ доставки с фиксированной ставкой 9 евро.
Подробнее здесь: https://stackoverflow.com/questions/790 ... o-recalcul