fix: shipping cost applied to orders + dynamic field rendering
Shipping Fix: - Frontend now sends shipping_cost and shipping_title in order payload - Backend uses these values as fallback when WC zone-based rate lookup fails - Fixes issue where Rajaongkir and other API-based shipping wasn't applied Dynamic Field Rendering: - Added billingFields/shippingFields filters sorted by priority - Added getBillingField/getShippingField helpers that return undefined for hidden fields - All standard fields now conditionally rendered based on API response - Fields use labels and required flags from API - Any field can be hidden via PHP snippet (type: 'hidden' or hidden: true) - Removed unused isFieldHidden function
This commit is contained in:
@@ -426,6 +426,23 @@ class CheckoutController {
|
||||
'taxes' => $rate->get_taxes(),
|
||||
]);
|
||||
$order->add_item($item);
|
||||
} elseif (!empty($payload['shipping_cost']) && $payload['shipping_cost'] > 0) {
|
||||
// Fallback: use shipping_cost directly from frontend
|
||||
// This handles API-based shipping like Rajaongkir where WC zones don't apply
|
||||
$item = new \WC_Order_Item_Shipping();
|
||||
|
||||
// Parse method ID from shipping_method (format: "method_id:instance_id" or "method_id:instance_id:variant")
|
||||
$parts = explode(':', $payload['shipping_method']);
|
||||
$method_id = $parts[0] ?? 'shipping';
|
||||
$instance_id = isset($parts[1]) ? (int)$parts[1] : 0;
|
||||
|
||||
$item->set_props([
|
||||
'method_title' => sanitize_text_field($payload['shipping_title'] ?? 'Shipping'),
|
||||
'method_id' => sanitize_text_field($method_id),
|
||||
'instance_id' => $instance_id,
|
||||
'total' => floatval($payload['shipping_cost']),
|
||||
]);
|
||||
$order->add_item($item);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user