WooCommerce

Как изменить, скрыть и переименовать поля оформления заказа в WooCommerce

M
Markabus
·
Фотореалистичный кадр сверху под углом: на деревянном столе смартфон с формой оформления заказа интернет-магазина — несколько полей и кнопка, за ним ноутбук с редактором той же формы, где часть полей отключена переключателями; рядом чек, коробка с этикеткой, кружка и кабель — иллюстрация к статье о настройке полей чекаута в WooCommerce

Каждое лишнее поле на странице оформления заказа — это ещё один повод бросить корзину. Магазину, который доставляет по России, не нужны «Название компании» и «Адрес, строка 2», а обязательный индекс отпугивает тех, кто его не помнит. Для настройки полей есть плагины, но грузить сайт ещё одним плагином ради трёх строк кода не хочется — WooCommerce умеет это стандартными фильтрами.

Код из этой заметки добавляется в functions.php активной темы (лучше дочерней, чтобы правки пережили обновление). Но прежде чем вставлять, прочитайте следующий раздел — от него зависит, сработает ли код вообще.

Сначала проверьте, какой у вас чекаут

Это главное, что нужно знать, прежде чем писать код. Начиная с WooCommerce 8.3 страница оформления заказа на новых магазинах собирается на блоке Checkout, а не на классическом шорткоде [woocommerce_checkout]. Блочный чекаут построен на React, и фильтр woocommerce_checkout_fields, о котором пойдёт речь ниже, на него не действует. Код вставится без ошибок, но ничего не изменит — и это самая частая причина вопросов «почему не работает».

Проверить просто: откройте страницу оформления заказа в редакторе WordPress. Если видите блок «Checkout» с настройками в боковой панели — у вас блочный чекаут. Если в содержимом стоит шорткод [woocommerce_checkout] — классический, и всё ниже работает как есть.

Для блочного чекаута часть настроек делается без кода: выделите в редакторе блок с адресными полями, и в боковой панели для полей «Компания», «Адрес, строка 2» и «Телефон» можно выбрать «Обязательное», «Необязательное» или «Скрыто». Для своих дополнительных полей есть отдельный API — woocommerce_register_additional_checkout_field(). А вот переименовать стандартные подписи блочного чекаута тем же фильтром не получится — там это отдельная задача с переводом строк.

Классический чекаут: три задачи одним фильтром

Все три операции — сделать поле необязательным, скрыть, переименовать — делаются через один фильтр woocommerce_checkout_fields. Он получает массив всех полей чекаута, сгруппированных по секциям: billing, shipping, account, order. Меняем то, что нужно, и возвращаем массив.

Можно повесить три отдельные функции на один и тот же хук, но удобнее держать всё в одной — так видно полную картину изменений:

add_filter( 'woocommerce_checkout_fields', 'shop_customize_checkout_fields' );
function shop_customize_checkout_fields( $fields ) {

    // 1. Делаем поля необязательными
    $fields['billing']['billing_last_name']['required'] = false; // фамилия
    $fields['billing']['billing_address_1']['required'] = false; // адрес

    // 2. Скрываем лишние поля
    unset( $fields['billing']['billing_company'] );   // название компании
    unset( $fields['billing']['billing_address_2'] ); // адрес, строка 2
    unset( $fields['billing']['billing_postcode'] );  // индекс

    // 3. Переименовываем подписи
    $fields['billing']['billing_email']['label'] = 'Email (для чека и уведомлений о заказе)';
    $fields['billing']['billing_phone']['label'] = 'Телефон для связи с курьером';

    return $fields;
}

Частая ошибка — сначала сделать поле необязательным, а затем его же удалить. Второе действие полностью перекрывает первое — если поле скрыто, его обязательность уже не имеет значения. Оставьте что-то одно.

Что ещё можно менять в поле

Помимо required и label у каждого поля есть и другие ключи. placeholder — подсказка внутри пустого поля. priority — число, по которому поля сортируются: чем меньше, тем выше; так можно поставить телефон перед email, задав ему priority меньше. class — массив CSS-классов, где стандартные form-row-first и form-row-last ставят два поля в одну строку, а form-row-wide растягивает на всю ширину.

$fields['billing']['billing_phone']['priority']    = 25;              // выше email
$fields['billing']['billing_phone']['placeholder'] = '+7 (___) ___-__-__';
$fields['billing']['billing_phone']['class']       = array( 'form-row-wide' );

Адресные поля: доставка и оплата сразу

Поля адреса — имя, фамилия, компания, адрес, город, индекс — существуют в двух копиях: для оплаты (billing_*) и для доставки (shipping_*). Если правите через woocommerce_checkout_fields, придётся повторить изменения для обеих секций. Есть более короткий путь — фильтр woocommerce_default_address_fields, который меняет шаблон адресных полей до того, как из него собираются обе секции:

add_filter( 'woocommerce_default_address_fields', 'shop_default_address_fields' );
function shop_default_address_fields( $fields ) {
    $fields['postcode']['required'] = false;
    unset( $fields['company'] );
    unset( $fields['address_2'] );
    return $fields;
}

Здесь ключи без префикса: postcode, а не billing_postcode. Изменение применится и к адресу оплаты, и к адресу доставки, и к формам адреса в личном кабинете.

Осторожно с обязательностью

Делать поля необязательными легко, но у части из них есть последствия. Если убрать обязательность у индекса или адреса, а в магазине включён расчёт доставки по адресу, калькулятор доставки может не сработать. Email лучше оставить обязательным всегда — на него уходят уведомления о заказе, и без него покупатель останется без подтверждения. Перед тем как убирать поле, спросите себя, кто им пользуется дальше по цепочке: курьер, служба доставки, бухгалтерия.

Частые ошибки

Код вставлен, а ничего не меняется. В девяти случаях из десяти — блочный чекаут. Смотрите первый раздел.

Правки пропали после обновления темы. Код лежал в functions.php родительской темы. Используйте дочернюю тему или небольшой плагин.

Скрытое поле всё равно требуется. Поле убрано только из одной секции, а валидация идёт по другой — например, скрыли billing_postcode, а shipping_postcode остался обязательным. Для адресных полей надёжнее woocommerce_default_address_fields.

Коротко

На классическом чекауте вся настройка полей умещается в один фильтр woocommerce_checkout_fields: обязательность, видимость, подписи, порядок. Для адресных полей есть более короткий woocommerce_default_address_fields, который меняет сразу и оплату, и доставку. Но прежде чем писать код, откройте страницу чекаута в редакторе: если там блок, а не шорткод, — эти фильтры не сработают, и настраивать поля нужно через боковую панель блока и API дополнительных полей.

Частые вопросы

Q.Почему фильтр woocommerce_checkout_fields не работает?

Скорее всего, у вас блочный чекаут — он стоит по умолчанию с WooCommerce 8.3. Этот фильтр действует только на классический чекаут на шорткоде [woocommerce_checkout]. Для блока поля настраиваются в боковой панели редактора и через API дополнительных полей.

Q.Как скрыть поле сразу и в адресе оплаты, и в адресе доставки?

Через фильтр woocommerce_default_address_fields — он меняет шаблон адресных полей до того, как из него собираются обе секции. Ключи там без префикса: postcode, company, address_2.

Q.Как поменять порядок полей на чекауте?

Через ключ priority у поля: поля сортируются по возрастанию этого числа. Задайте телефону priority меньше, чем у email, и он поднимется выше.

Q.Можно ли сделать email необязательным?

Технически — да, но не стоит: на email уходят подтверждение и уведомления о заказе, без него покупатель останется без связи с магазином. То же касается адреса и индекса, если по ним считается доставка.

Источники

Поделиться:OKVK