Automattic\WooCommerce\Internal\RestApi\Routes\V4\Orders

UpdateUtils::update_order_from_requestpublicWC 1.0

Update an order from the request.

Method of the class: UpdateUtils{}

No Hooks.

Returns

null. Nothing (null).

Usage

$UpdateUtils = new UpdateUtils();
$UpdateUtils->update_order_from_request( $order, $request );
$order(WC_Order) (required)
Order object.
$request(WP_REST_Request) (required)
Request object.

UpdateUtils::update_order_from_request() code WC 10.4.3

public function update_order_from_request( WC_Order $order, WP_REST_Request $request ) {
	// Get data that can be edited from schema.
	$ignore_keys = array( 'created_via', 'status', 'customer_id' );
	$data_keys   = array_diff( array_keys( $this->order_schema->get_writable_item_schema_properties() ), $ignore_keys );

	// Make sure gateways are loaded so hooks from gateways fire on save/create.
	WC()->payment_gateways();

	// Handle all writable props.
	foreach ( $data_keys as $key ) {
		$value = $request[ $key ];

		if ( is_null( $value ) ) {
			continue;
		}

		if ( 'billing' === $key || 'shipping' === $key ) {
			$this->update_address( $order, $key, (array) $value );
		} elseif ( 'coupon_lines' === $key ) {
			$this->update_line_items( $order, (array) $value, 'coupon' );
		} elseif ( 'line_items' === $key ) {
			$this->update_line_items( $order, (array) $value, 'line_item' );
		} elseif ( 'shipping_lines' === $key ) {
			$this->update_line_items( $order, (array) $value, 'shipping' );
		} elseif ( 'fee_lines' === $key ) {
			$this->update_line_items( $order, (array) $value, 'fee' );
		} elseif ( 'meta_data' === $key ) {
			$this->update_meta_data( $order, (array) $value );
		} elseif ( is_callable( array( $order, "set_{$key}" ) ) ) {
			$order->{"set_{$key}"}( $value );
		}
	}

	if ( ! is_null( $request['customer_id'] ) && 0 !== $request['customer_id'] ) {
		// The customer must exist, and in a multisite context must be visible to the current user.
		if ( is_wp_error( Users::get_user_in_current_site( $request['customer_id'] ) ) ) {
			throw new WC_REST_Exception( 'woocommerce_rest_invalid_customer_id', esc_html__( 'Customer ID is invalid.', 'woocommerce' ), (int) WP_Http::BAD_REQUEST );
		}

		// Make sure customer is part of blog.
		if ( is_multisite() && ! is_user_member_of_blog( $request['customer_id'] ) ) {
			add_user_to_blog( get_current_blog_id(), $request['customer_id'], 'customer' );
		}

		$order->set_customer_id( (int) $request['customer_id'] );
	}

	// Save before calculating totals to ensure all line items are up to date.
	$order->save();

	// If items have changed, recalculate order totals.
	if ( isset( $request['billing'] ) || isset( $request['shipping'] ) || isset( $request['line_items'] ) || isset( $request['shipping_lines'] ) || isset( $request['fee_lines'] ) ) {
		$order->calculate_totals( true );
	}

	if ( isset( $request['coupon_lines'] ) ) {
		$order->recalculate_coupons();
	}

	if ( ! empty( $request['status'] ) ) {
		$order->set_status( $request['status'], '', true );
		$order->save();
	}
}