Automattic\WooCommerce\Internal\Admin\Orders\MetaBoxes

CustomMetaBox::handle_metadata_changespublicWC 1.0

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() code WC 9.9.3

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();
	}
}