Automattic\WooCommerce\StoreApi\Routes\V1
Checkout::validate_callback │ public │ WC 1.0
Validation callback for the checkout route.
This runs after individual field validation_callbacks have been called.
Method of the class: Checkout{}
No Hooks.
Returns
true|\WP_Error.
Usage
$Checkout = new Checkout(); $Checkout->validate_callback( $request );
- $request(WP_REST_Request) (required)
- Request object.
Checkout::validate_callback() Checkout::validate callback code WC 10.8.1
public function validate_callback( $request ) {
$validate_contexts = [
'shipping_address' => [
'group' => 'shipping',
'location' => 'address',
'param' => 'shipping_address',
],
'billing_address' => [
'group' => 'billing',
'location' => 'address',
'param' => 'billing_address',
],
'contact' => [
'group' => 'other',
'location' => 'contact',
'param' => 'additional_fields',
],
'order' => [
'group' => 'other',
'location' => 'order',
'param' => 'additional_fields',
],
];
if ( ! WC()->cart->needs_shipping() ) {
unset( $validate_contexts['shipping_address'] );
}
$invalid_groups = [];
$invalid_details = [];
$is_partial = in_array( $request->get_method(), [ 'PUT', 'PATCH' ], true );
foreach ( $validate_contexts as $context => $context_data ) {
$errors = new \WP_Error();
$document_object = $this->get_document_object_from_rest_request( $request );
$document_object->set_context( $context );
$additional_fields = $this->additional_fields_controller->get_contextual_fields_for_location( $context_data['location'], $document_object );
// These values are used to validate custom rules and generate the document object.
$field_values = (array) $request->get_param( $context_data['param'] ) ?? [];
foreach ( $additional_fields as $field_key => $field ) {
// Skip values that were not posted if the request is partial or the field is not required.
if ( ! isset( $field_values[ $field_key ] ) && ( $is_partial || true !== $field['required'] ) ) {
continue;
}
// Clean the field value to trim whitespace.
$field_value = wc_clean( wp_unslash( $field_values[ $field_key ] ?? '' ) );
if ( empty( $field_value ) ) {
if ( true === $field['required'] ) {
/* translators: %s: is the field label */
$error_message = sprintf( __( '%s is required', 'woocommerce' ), $field['label'] );
if ( 'shipping_address' === $context ) {
/* translators: %s: is the field error message */
$error_message = sprintf( __( 'There was a problem with the provided shipping address: %s', 'woocommerce' ), $error_message );
} elseif ( 'billing_address' === $context ) {
/* translators: %s: is the field error message */
$error_message = sprintf( __( 'There was a problem with the provided billing address: %s', 'woocommerce' ), $error_message );
}
$errors->add( 'woocommerce_required_checkout_field', $error_message, [ 'key' => $field_key ] );
}
continue;
}
$valid_check = $this->additional_fields_controller->validate_field( $field, $field_value );
if ( is_wp_error( $valid_check ) && $valid_check->has_errors() ) {
foreach ( $valid_check->get_error_codes() as $code ) {
$valid_check->add_data(
array(
'location' => $context_data['location'],
'key' => $field_key,
),
$code
);
}
$errors->merge_from( $valid_check );
continue;
}
}
// Validate all fields for this location (this runs custom validation callbacks).
$valid_location_check = $this->additional_fields_controller->validate_fields_for_location( $field_values, $context_data['location'], $context_data['group'] );
if ( is_wp_error( $valid_location_check ) && $valid_location_check->has_errors() ) {
foreach ( $valid_location_check->get_error_codes() as $code ) {
$valid_location_check->add_data(
array(
'location' => $context_data['location'],
),
$code
);
}
$errors->merge_from( $valid_location_check );
}
if ( $errors->has_errors() ) {
$invalid_groups[ $context_data['param'] ] = $errors->get_error_message();
$invalid_details[ $context_data['param'] ] = rest_convert_error_to_response( $errors )->get_data();
}
}
if ( $invalid_groups ) {
return new \WP_Error(
'rest_invalid_param',
/* translators: %s: List of invalid parameters. */
esc_html( sprintf( __( 'Invalid parameter(s): %s', 'woocommerce' ), implode( ', ', array_keys( $invalid_groups ) ) ) ),
array(
'status' => 400,
'params' => $invalid_groups,
'details' => $invalid_details,
)
);
}
return true;
}