fix: Critical fixes for shipping and meta field registration
Issue 1: Shipping recalculation on order edit (FIXED) - Problem: OrderForm recalculated shipping on every edit - Expected: Shipping should be fixed unless address changes - Solution: Use existing order.totals.shipping in edit mode - Create mode: Still calculates from shipping method Issue 2: Meta fields not appearing without data (DOCUMENTED) - Problem: Private meta fields dont appear if no data exists yet - Example: Admin cannot input tracking number on first time - Root cause: Fields only exposed if data exists in database - Solution: Plugins MUST register fields via MetaFieldsRegistry - Registration makes field available even when empty Updated METABOX_COMPAT.md: - Changed optional to REQUIRED for field registration - Added critical warning section - Explained private vs public meta behavior - Private meta: MUST register to appear - Public meta: Auto-exposed, no registration needed The Flow (Corrected): 1. Plugin registers field -> Field appears in UI (even empty) 2. Admin inputs data -> Saved to database 3. Data visible in both admins Without Registration: - Private meta (_field): Not exposed, not editable - Public meta (field): Auto-exposed, auto-editable Why Private Meta Requires Registration: - Security: Hidden by default - Privacy: Prevents exposing sensitive data - Control: Plugins explicitly declare visibility Files Changed: - OrderForm.tsx: Use existing shipping total in edit mode - METABOX_COMPAT.md: Critical documentation updates Result: - Shipping no longer recalculates on edit - Clear documentation on field registration requirement - Developers know they MUST register private meta fields
This commit is contained in:
@@ -314,11 +314,18 @@ export default function OrderForm({
|
||||
);
|
||||
|
||||
// Calculate shipping cost
|
||||
// In edit mode: use existing order shipping total (fixed unless address changes)
|
||||
// In create mode: calculate from selected shipping method
|
||||
const shippingCost = React.useMemo(() => {
|
||||
if (mode === 'edit' && initial?.totals?.shipping !== undefined) {
|
||||
// Use existing shipping total from order
|
||||
return Number(initial.totals.shipping) || 0;
|
||||
}
|
||||
// Create mode: calculate from shipping method
|
||||
if (!shippingMethod) return 0;
|
||||
const method = shippings.find(s => s.id === shippingMethod);
|
||||
return method ? Number(method.cost) || 0 : 0;
|
||||
}, [shippingMethod, shippings]);
|
||||
}, [mode, initial?.totals?.shipping, shippingMethod, shippings]);
|
||||
|
||||
// Calculate discount from validated coupons
|
||||
const couponDiscount = React.useMemo(() => {
|
||||
|
||||
Reference in New Issue
Block a user