Automattic\WooCommerce\Internal\Admin\Orders\MetaBoxes
CustomMetaBox::handle_metadata_changes
Handle the possible changes in order metadata coming from an order edit page in admin (labeled "custom fields" in the UI).
This method expects the $_POST array to contain a 'meta' key that is an associative array of [meta item id => [ 'key' => meta item name, 'value' => meta item value ]; and also to contain (possibly empty) 'metakeyinput' and 'metavalue' keys.
Method of the class: CustomMetaBox{}
No Hooks.
Returns
null. Nothing (null).
Usage
$CustomMetaBox = new CustomMetaBox(); $CustomMetaBox->handle_metadata_changes( $order );
- $order(WC_Order) (required)
- The order to handle.
CustomMetaBox::handle_metadata_changes() CustomMetaBox::handle metadata changes code WC 10.6.2
public function handle_metadata_changes( $order ) {
$has_meta_changes = false;
$order_meta = $order->get_meta_data();
$order_meta =
array_combine(
array_map( fn( $meta ) => $meta->id, $order_meta ),
$order_meta
);
// phpcs:disable WordPress.Security.ValidatedSanitizedInput, WordPress.Security.NonceVerification.Missing
foreach ( ( $_POST['meta'] ?? array() ) as $request_meta_id => $request_meta_data ) {
$request_meta_id = wp_unslash( $request_meta_id );
$request_meta_key = wp_unslash( $request_meta_data['key'] );
$request_meta_value = wp_unslash( $request_meta_data['value'] );
if ( array_key_exists( $request_meta_id, $order_meta ) &&
( $order_meta[ $request_meta_id ]->key !== $request_meta_key || $order_meta[ $request_meta_id ]->value !== $request_meta_value ) ) {
$order->update_meta_data( $request_meta_key, $request_meta_value, $request_meta_id );
$has_meta_changes = true;
}
}
$request_new_key = wp_unslash( $_POST['metakeyinput'] ?? '' );
$request_new_value = wp_unslash( $_POST['metavalue'] ?? '' );
if ( '' !== $request_new_key ) {
$order->add_meta_data( $request_new_key, $request_new_value );
$has_meta_changes = true;
}
// phpcs:enable WordPress.Security.ValidatedSanitizedInput, WordPress.Security.NonceVerification.Missing
if ( $has_meta_changes ) {
$order->save();
}
}