Как сделать разные поля в адресе доставки Woocommerce?
На движке WooCoommerce при оформление заказа в зависимости от способа доставки нужно сделать разные поля для адреса доставки и контактных данных и вариантов оплаты.
Например:
1. Самовывоз - для него доступны способы оплаты - оплата наличными / оплата переводом на карту / кредит.
Поля адреса при самовывозе - Имя / Телефон / E-mail.
2. Доставка по городу - оплата наличными.
Поля адреса при доставке по городу - Имя / Телефон / E-mail / Адрес.
3. Доставка по России - 100% предоплата.
Поля адреса при доставке по России - Имя / Телефон / E-mail / Адрес.
Дополнительные вопросы
нужно писать плагин доставки
Ответы на вопрос 0
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для WooCommerce это решается не разными страницами оформления, а динамическим изменением checkout-полей и доступных способов оплаты/доставки. Логика такая: пользователь выбирает способ доставки, после этого WooCommerce пересчитывает checkout, а вы через hooks показываете нужные поля и оставляете только подходящие способы оплаты.
Что нужно разделить:
woocommerce_checkout_fields;woocommerce_available_payment_gateways;Пример: скрыть адрес для самовывоза и сделать его обязательным для доставки:
add_filter('woocommerce_checkout_fields', function ($fields) { $chosen = WC()->session ? WC()->session->get('chosen_shipping_methods') : []; $method = is_array($chosen) && isset($chosen[0]) ? $chosen[0] : ''; $is_pickup = strpos($method, 'local_pickup') !== false; if ($is_pickup) { unset($fields['shipping']['shipping_address_1']); unset($fields['shipping']['shipping_city']); unset($fields['shipping']['shipping_postcode']); } else { $fields['shipping']['shipping_address_1']['required'] = true; $fields['shipping']['shipping_city']['required'] = true; } return $fields; });
Пример ограничения оплат для самовывоза:
add_filter('woocommerce_available_payment_gateways', function ($gateways) { if (is_admin() || ! WC()->session) { return $gateways; } $chosen = WC()->session->get('chosen_shipping_methods'); $method = is_array($chosen) && isset($chosen[0]) ? $chosen[0] : ''; if (strpos($method, 'local_pickup') !== false) { return array_intersect_key($gateways, array_flip(['cod', 'bacs'])); } return $gateways; });
На фронте при смене доставки checkout должен обновляться. Обычно WooCommerce делает это сам, но если тема мешает, добавляют JS-триггер
update_checkout. После настройки обязательно проверьте все сценарии: самовывоз, доставка по городу, доставка ТК, гость, авторизованный пользователь, мобильная версия.