Automattic\WooCommerce\StoreApi\Utilities

OrderController::validate_address_fields()protectedWC 1.0

Check all required address fields are set and return errors if not.

Метод класса: OrderController{}

Хуков нет.

Возвращает

null. Ничего (null).

Использование

// protected - в коде основоного (родительского) или дочернего класса
$result = $this->validate_address_fields( $order, $address_type, $errors );
$order(\WC_Order) (обязательный)
Order object.
$address_type(строка) (обязательный)
billing or shipping address, used in error messages.
$errors(\WP_Error) (обязательный)
Error object.

Код OrderController::validate_address_fields() WC 8.7.0

protected function validate_address_fields( \WC_Order $order, $address_type, \WP_Error $errors ) {
	$all_locales    = wc()->countries->get_country_locale();
	$address        = $order->get_address( $address_type );
	$current_locale = isset( $all_locales[ $address['country'] ] ) ? $all_locales[ $address['country'] ] : array();

	$additional_fields = $this->additional_fields_controller->get_all_fields_from_order( $order );

	foreach ( $additional_fields as $field_id => $field_value ) {
		$prefix = '/' . $address_type . '/';
		if ( strpos( $field_id, $prefix ) === 0 ) {
			$address[ str_replace( $prefix, '', $field_id ) ] = $field_value;
		}
	}

	$fields              = $this->additional_fields_controller->get_additional_fields();
	$address_fields_keys = $this->additional_fields_controller->get_address_fields_keys();
	$address_fields      = array_filter(
		$fields,
		function( $key ) use ( $address_fields_keys ) {
			return in_array( $key, $address_fields_keys, true );
		},
		ARRAY_FILTER_USE_KEY
	);

	if ( $current_locale ) {
		foreach ( $current_locale as $key => $field ) {
			if ( isset( $address_fields[ $key ] ) ) {
				$address_fields[ $key ]['label']    = isset( $field['label'] ) ? $field['label'] : $address_fields[ $key ]['label'];
				$address_fields[ $key ]['required'] = isset( $field['required'] ) ? $field['required'] : $address_fields[ $key ]['required'];
			}
		}
	}

	foreach ( $address_fields as $address_field_key => $address_field ) {
		if ( empty( $address[ $address_field_key ] ) && $address_field['required'] ) {
			/* translators: %s Field label. */
			$errors->add( $address_type, sprintf( __( '%s is required', 'woocommerce' ), $address_field['label'] ), $address_field_key );
		}
	}

	// Validate additional fields.
	$result = $this->additional_fields_controller->validate_fields_for_location( $address, 'address', $address_type );

	if ( $result->has_errors() ) {
		// Add errors to main error object but ensure they maintain the billing/shipping error code.
		foreach ( $result->get_error_codes() as $code ) {
			$errors->add( $address_type, $result->get_error_message( $code ), $code );
		}
	}
}