Я создаю заказ в админке. Я добавил некоторые функции на страницу оплаты заказа, которая отправляется клиенту (form-pay.php). Я добавил возможность удалять товары из заказа, а также обновлять данные для выставления счетов и доставки (как для заказа, так и для аккаунта). Я использую ajax и Calculate_totals () после удаления элемента, который работает.
Тем не менее, я не могу понять, как применить доставку к заказу. Мне нужно, чтобы это происходило при создании заказа в админе и когда кто-то удаляет элемент в интерфейсе.
Я попытался просто установить мету доставки, но это не работает.
function my_order_update_shipping($order_id, $items) {
$order = wc_get_order($order_id);
$order_subtotal = $order->get_subtotal();
if($order_subtotal > '17.99'){
update_post_meta($order_id, '_order_shipping', '0');
}else{
update_post_meta($order_id, '_order_shipping', '4');
}
}
add_action('woocommerce_before_save_order_items', 'my_order_update_shipping');
Как мне этого добиться? Или применить способ доставки таким образом?
Я наконец понял это. Работает хорошо, но вам нужно нажать кнопку «пересчитать» при добавлении / удалении элемента в админ> создать заказ. Приведенный ниже код применяет 1 из 2 способов доставки на основе статической суммы промежуточного итога.
$delivery_zones = WC_Shipping_Zones::get_zones();
foreach ((array) $delivery_zones as $key => $the_zone) {
$shipping_methods = $the_zone['shipping_methods'];
}
// Apply Correct Shipping Method
if ($order_subtotal > '17.99') {
$rate = $shipping_methods[2];
$item = new WC_Order_Item_Shipping();
$item->set_props(array('method_id' => $rate->id, 'total' => wc_format_decimal($rate->cost)));
$order->add_item($item);
} else {
$rate = $shipping_methods[1];
$item = new WC_Order_Item_Shipping();
$item->set_props(array('method_id' => $rate->id, 'total' => wc_format_decimal($rate->cost)));
$order->add_item($item);
}
$order->calculate_totals();
$order->save();
Других решений пока нет …