В WooCommerce оформление заказа — это ключевой этап, где собираются важные данные от клиента. Чтобы обеспечить корректность и полноту информации, необходимо реализовать проверку и валидацию данных. В этой статье рассмотрим, как добавлять пользовательские проверки в форму оформления заказа WooCommerce, какие хуки использовать, а также приведём примеры кода для типичных задач.
Почему важна проверка данных в форме оформления заказа WooCommerce
Данные, введённые клиентом, влияют на успешную обработку заказа, доставку и последующую коммуникацию. Некорректные или неполные данные могут привести к ошибкам, возвратам или неудобствам для клиента и магазина. По умолчанию WooCommerce проверяет только основные поля. Однако если вы добавляете свои поля или хотите расширить валидацию, нужно программно реализовать дополнительные проверки.
Правильная валидация помогает:
- Избежать ошибок при оформлении заказа;
- Обеспечить корректность данных для доставки и оплаты;
- Снизить нагрузку на службу поддержки;
- Обеспечить соответствие требованиям законодательства (например, проверка ИНН или паспортных данных).
Как добавить свою проверку в форму оформления заказа WooCommerce
WooCommerce предоставляет несколько хуков для расширения логики проверки. Основной для валидации — woocommerce_checkout_process. В этот хук можно добавить свою функцию, которая будет проверять данные и, при необходимости, добавлять сообщения об ошибках.
Пример базовой функции проверки пользовательского поля:
function wporders_validate_custom_checkout_field() {
if ( empty( $_POST['wporders_custom_field'] ) ) {
wc_add_notice( __( 'Пожалуйста, заполните поле «Особые требования».' ), 'error' );
}
}
add_action( 'woocommerce_checkout_process', 'wporders_validate_custom_checkout_field' );Здесь мы проверяем, что поле wporders_custom_field не пустое. Если оно пустое, добавляем ошибку через wc_add_notice, и пользователь не сможет продолжить оформление заказа, пока не исправит ошибку.
Добавление пользовательского поля в форму оформления заказа
Для полноценной проверки часто нужно сначала добавить своё поле в форму. Для этого используется хук woocommerce_after_order_notes или woocommerce_checkout_fields. Пример добавления текстового поля:
function wporders_add_custom_checkout_field( $checkout ) {
echo '<div id="wporders_custom_checkout_field">';
woocommerce_form_field( 'wporders_custom_field', array(
'type' => 'text',
'class' => array('wporders-custom-field form-row-wide'),
'label' => __('Особые требования к заказу'),
'placeholder' => __('Введите ваши пожелания'),
'required' => false,
), $checkout->get_value( 'wporders_custom_field' ));
echo '</div>';
}
add_action( 'woocommerce_after_order_notes', 'wporders_add_custom_checkout_field' );Такое поле появится на странице оформления заказа. Теперь к нему можно применить валидацию, как показано выше.
Валидация сложных данных: примеры и решения
Иногда требуется проверять данные по специальным правилам. Например, проверка формата ИНН, почтового индекса, телефона или даты. Рассмотрим примеры.
Проверка формата ИНН в заказе
Добавим поле ИНН и проверим, что введённый номер состоит из 10 или 12 цифр:
function wporders_add_inn_field( $checkout ) {
woocommerce_form_field( 'wporders_inn', array(
'type' => 'text',
'class' => array('wporders-inn form-row-wide'),
'label' => __('ИНН'),
'required' => true,
), $checkout->get_value( 'wporders_inn' ));
}
add_action( 'woocommerce_after_order_notes', 'wporders_add_inn_field' );
function wporders_validate_inn_field() {
if ( isset( $_POST['wporders_inn'] ) ) {
$inn = trim( $_POST['wporders_inn'] );
if ( ! preg_match('/^\d{10}|\d{12}$/', $inn) ) {
wc_add_notice( __( 'Введите корректный ИНН из 10 или 12 цифр.' ), 'error' );
}
}
}
add_action( 'woocommerce_checkout_process', 'wporders_validate_inn_field' );Проверка телефонного номера с маской
Для проверки телефона используем регулярное выражение, например, для российского формата:
function wporders_validate_phone_field() {
if ( isset( $_POST['billing_phone'] ) ) {
$phone = trim( $_POST['billing_phone'] );
if ( ! preg_match('/^\+7\d{10}$/', $phone) ) {
wc_add_notice( __( 'Введите телефон в формате +7XXXXXXXXXX.' ), 'error' );
}
}
}
add_action( 'woocommerce_checkout_process', 'wporders_validate_phone_field' );Сохранение пользовательских данных в заказ
После успешной валидации и оформления заказа важно сохранить введённые данные в мета-поля заказа для дальнейшего использования. Для этого используем хук woocommerce_checkout_update_order_meta:
function wporders_save_custom_checkout_field( $order_id ) {
if ( ! empty( $_POST['wporders_custom_field'] ) ) {
update_post_meta( $order_id, '_wporders_custom_field', sanitize_text_field( $_POST['wporders_custom_field'] ) );
}
if ( ! empty( $_POST['wporders_inn'] ) ) {
update_post_meta( $order_id, '_wporders_inn', sanitize_text_field( $_POST['wporders_inn'] ) );
}
}
add_action( 'woocommerce_checkout_update_order_meta', 'wporders_save_custom_checkout_field' );Отображение пользовательских данных в админке и письмах
Чтобы видеть введённые данные в админке заказа, добавим их отображение с помощью хука woocommerce_admin_order_data_after_billing_address:
function wporders_display_custom_data_in_admin( $order ) {
$custom_field = get_post_meta( $order->get_id(), '_wporders_custom_field', true );
if ( $custom_field ) {
echo '<p><strong>Особые требования:</strong> ' . esc_html( $custom_field ) . '</p>';
}
$inn = get_post_meta( $order->get_id(), '_wporders_inn', true );
if ( $inn ) {
echo '<p><strong>ИНН:</strong> ' . esc_html( $inn ) . '</p>';
}
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'wporders_display_custom_data_in_admin' );Для добавления данных в письма используется фильтр woocommerce_email_order_meta_fields. Например:
function wporders_add_custom_data_to_emails( $fields, $sent_to_admin, $order ) {
$fields['wporders_custom_field'] = array(
'label' => __('Особые требования'),
'value' => get_post_meta( $order->get_id(), '_wporders_custom_field', true ),
);
$fields['wporders_inn'] = array(
'label' => __('ИНН'),
'value' => get_post_meta( $order->get_id(), '_wporders_inn', true ),
);
return $fields;
}
add_filter( 'woocommerce_email_order_meta_fields', 'wporders_add_custom_data_to_emails', 10, 3 );Плагины для расширенной проверки и валидации полей WooCommerce
Если не хочется писать код, можно использовать готовые плагины для валидации полей на странице оформления заказа. Рекомендуются:
- Clearfy Pro — расширенный плагин для оптимизации и безопасности, содержит возможности для кастомизации форм.
- WooCommerce Checkout Field Editor — позволяет добавлять и валидировать поля без программирования.
Однако для точного контроля лучше использовать собственные решения на базе хуков.
Выводы и рекомендации
Расширение проверки и валидации данных в форме оформления заказа WooCommerce — важная задача для повышения качества данных и удобства работы магазина. Используя хуки woocommerce_checkout_process, woocommerce_after_order_notes и другие, можно реализовать точечные проверки и сохранить данные вместе с заказом.
Не забывайте всегда проверять и фильтровать пользовательский ввод для безопасности. И при необходимости расширять отображение данных в админке и письмах для удобства обработки заказов.