Как сделать разные поля в адресе доставки Woocommerce?

Ссылка скопирована
1 ответ

На движке WooCoommerce при оформление заказа в зависимости от способа доставки нужно сделать разные поля для адреса доставки и контактных данных и вариантов оплаты.

Например:
1. Самовывоз - для него доступны способы оплаты - оплата наличными / оплата переводом на карту / кредит.
Поля адреса при самовывозе - Имя / Телефон / E-mail.
2. Доставка по городу - оплата наличными.
Поля адреса при доставке по городу - Имя / Телефон / E-mail / Адрес.
3. Доставка по России - 100% предоплата.
Поля адреса при доставке по России - Имя / Телефон / E-mail / Адрес.

Дополнительные вопросы

нужно писать плагин доставки

  • Refguser, Спасибо за ответ
  • Ответы на вопрос 0

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Антон С. Ответ

    Для WooCommerce это решается не разными страницами оформления, а динамическим изменением checkout-полей и доступных способов оплаты/доставки. Логика такая: пользователь выбирает способ доставки, после этого WooCommerce пересчитывает checkout, а вы через hooks показываете нужные поля и оставляете только подходящие способы оплаты.

    Что нужно разделить:

    • поля checkout — через woocommerce_checkout_fields;
    • обязательность полей — через тот же фильтр и валидацию;
    • способы оплаты — через woocommerce_available_payment_gateways;
    • условия доставки — через shipping methods/zones.

    Пример: скрыть адрес для самовывоза и сделать его обязательным для доставки:

    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_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;
    });

    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. После настройки обязательно проверьте все сценарии: самовывоз, доставка по городу, доставка ТК, гость, авторизованный пользователь, мобильная версия.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно