$request ); $document_object->set_context( 'order' ); $additional_fields_order = $this->additional_fields_controller->get_contextual_fields_for_location( 'order', $document_object ); $additional_fields_contact = $this->additional_fields_controller->get_contextual_fields_for_location( 'contact', $document_object ); $additional_fields = array_merge( $additional_fields_order, $additional_fields_contact ); } else { $additional_fields_order = $this->additional_fields_controller->get_fields_for_location( 'order' ); $additional_fields_contact = $this->additional_fields_controller->get_fields_for_location( 'contact' ); $additional_fields = array_merge( $additional_fields_order, $additional_fields_contact ); } $field_values = (array) $request['additional_fields'] ?? []; foreach ( $additional_fields as $key => $field ) { if ( isset( $field_values[ $key ] ) ) { $this->additional_fields_controller->persist_field_for_order( $key, $field_values[ $key ], $this->order, 'other', false ); } } // The above logic sets visible fields, but not hidden fields. Unset the hidden fields here. $other_posted_field_values = array_diff_key( $field_values, $additional_fields ); foreach ( $other_posted_field_values as $key => $value ) { if ( $this->additional_fields_controller->is_field( $key ) ) { $this->additional_fields_controller->persist_field_for_order( $key, '', $this->order, 'other', false ); } } // We need to sync the customer additional fields with the order otherwise they will be overwritten on next page load. if ( 0 !== $this->order->get_customer_id() && get_current_user_id() === $this->order->get_customer_id() ) { $this->additional_fields_controller->sync_customer_additional_fields_with_order( $this->order, wc()->customer ); } } /** * Returns a document object from a REST request. * * @param \WP_REST_Request $request The REST request. * @return DocumentObject The document object or null if experimental blocks are not enabled. */ public function get_document_object_from_rest_request( \WP_REST_Request $request ) { return new DocumentObject( [ 'customer' => [ 'billing_address' => $request['billing_address'], 'shipping_address' => $request['shipping_address'], 'additional_fields' => array_intersect_key( $request['additional_fields'] ?? [], array_flip( $this->additional_fields_controller->get_contact_fields_keys() ) ), ], 'checkout' => [ 'payment_method' => $request['payment_method'], 'create_account' => $request['create_account'], 'customer_note' => $request['customer_note'], 'additional_fields' => array_intersect_key( $request['additional_fields'] ?? [], array_flip( $this->additional_fields_controller->get_order_fields_keys() ) ), ], ] ); } }