Automattic\WooCommerce\StoreApi\Utilities
OrderController::validate_addresses
Validates customer address data based on the locale to ensure required fields are set.
Method of the class: OrderController{}
No Hooks.
Returns
null. Nothing (null).
Usage
// protected - for code of main (parent) or child class $result = $this->validate_addresses( $order, $needs_shipping );
- $order(WC_Order) (required)
- Order object.
- $needs_shipping(true|false) (required)
- Whether the order needs shipping.
OrderController::validate_addresses() OrderController::validate addresses code WC 10.8.1
protected function validate_addresses( \WC_Order $order, bool $needs_shipping ) {
$errors = new \WP_Error();
$billing_country = $order->get_billing_country();
$shipping_country = $order->get_shipping_country();
if ( $needs_shipping ) {
$local_pickup_method_ids = LocalPickupUtils::get_local_pickup_method_ids();
$selected_shipping_rates = ShippingUtil::get_selected_shipping_rates_from_packages( WC()->shipping()->get_packages() );
$selected_shipping_rates_are_all_local_pickup = ArrayUtil::array_all(
$selected_shipping_rates,
function ( $rate ) use ( $local_pickup_method_ids ) {
return in_array( $rate->get_method_id(), $local_pickup_method_ids, true );
}
);
// If only local pickup is selected, we don't need to validate the shipping country.
if ( ! $selected_shipping_rates_are_all_local_pickup && ! $this->validate_allowed_country( $shipping_country, (array) wc()->countries->get_shipping_countries() ) ) {
$countries = WC()->countries->get_countries();
$shipping_country_name = $countries[ $shipping_country ] ?? $shipping_country;
throw new RouteException(
'woocommerce_rest_invalid_address_country',
sprintf(
/* translators: %s country name. */
esc_html__( 'Sorry, we do not ship orders to the provided country (%s)', 'woocommerce' ),
esc_html( $shipping_country_name )
),
400,
array(
'allowed_countries' => array_map( 'esc_html', array_keys( wc()->countries->get_shipping_countries() ) ),
)
);
}
}
if ( ! $this->validate_allowed_country( $billing_country, (array) wc()->countries->get_allowed_countries() ) ) {
$countries = WC()->countries->get_countries();
$billing_country_name = $countries[ $billing_country ] ?? $billing_country;
throw new RouteException(
'woocommerce_rest_invalid_address_country',
sprintf(
/* translators: %s country name. */
esc_html__( 'Sorry, we do not allow orders from the provided country (%s)', 'woocommerce' ),
esc_html( $billing_country_name )
),
400,
array(
'allowed_countries' => array_map( 'esc_html', array_keys( wc()->countries->get_allowed_countries() ) ),
)
);
}
if ( $needs_shipping ) {
$this->validate_address_fields( $order, 'shipping', $errors );
}
$this->validate_address_fields( $order, 'billing', $errors );
if ( ! $errors->has_errors() ) {
return;
}
$errors_by_code = array();
$error_codes = $errors->get_error_codes();
foreach ( $error_codes as $code ) {
$errors_by_code[ $code ] = $errors->get_error_messages( $code );
}
// Surface errors from first code.
foreach ( $errors_by_code as $code => $error_messages ) {
throw new RouteException(
'woocommerce_rest_invalid_address',
sprintf(
/* translators: %s Address type. */
esc_html__( 'There was a problem with the provided %s:', 'woocommerce' ) . ' ' . esc_html( implode( ', ', $error_messages ) ),
'shipping' === $code ? esc_html__( 'shipping address', 'woocommerce' ) : esc_html__( 'billing address', 'woocommerce' )
),
400,
array(
'errors' => $errors_by_code, // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped
)
);
}
}