Каждое лишнее поле на странице оформления заказа — это ещё один повод бросить корзину. Магазину, который доставляет по России, не нужны «Название компании» и «Адрес, строка 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 дополнительных полей.
Частые вопросы
Скорее всего, у вас блочный чекаут — он стоит по умолчанию с WooCommerce 8.3. Этот фильтр действует только на классический чекаут на шорткоде [woocommerce_checkout]. Для блока поля настраиваются в боковой панели редактора и через API дополнительных полей.
Через фильтр woocommerce_default_address_fields — он меняет шаблон адресных полей до того, как из него собираются обе секции. Ключи там без префикса: postcode, company, address_2.
Через ключ priority у поля: поля сортируются по возрастанию этого числа. Задайте телефону priority меньше, чем у email, и он поднимется выше.
Технически — да, но не стоит: на email уходят подтверждение и уведомления о заказе, без него покупатель останется без связи с магазином. То же касается адреса и индекса, если по ним считается доставка.
Источники
- 1.Customising checkout fields using actions and filters — документация WooCommercehttps://woocommerce.com/document/tutorial-customising-checkout-fields-using-actions-and-filters/
- 2.Additional Checkout Fields — Cart and Checkout Blocks, WooCommerce Developer Docshttps://developer.woocommerce.com/docs/block-development/extensible-blocks/cart-and-checkout-blocks/additional-checkout-fields/
- 3.Cart and Checkout Blocks — WooCommerce Developer Docshttps://developer.woocommerce.com/docs/block-development/extensible-blocks/cart-and-checkout-blocks/



