Automattic\WooCommerce\Internal\RestApi\Routes\V4\Orders
UpdateUtils::update_order_from_request
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() 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();
}
}