WooCommerce: установка ограничений на сроки доставки и способы оплаты для конкретных товаров

|

Диагностика задачи: почему нужно ограничивать сроки доставки и способы оплаты для товаров

В интернет-магазинах на WooCommerce часто возникает необходимость ограничить выбор способов оплаты и сроки доставки в зависимости от типа товара. Например, для продуктов с коротким сроком годности важна быстрая доставка и ограниченный выбор способов оплаты. Для цифровых товаров сроки доставки не актуальны, а способы оплаты могут отличаться.

Без таких ограничений покупатели могут оформить заказ с неподходящими условиями, что приводит к возвратам, отменам и неудовлетворенности.

Как определить, что ограничения нужны именно для вашего магазина

Пошаговое решение: ограничение сроков доставки и способов оплаты для товаров в WooCommerce

1. Добавляем кастомное поле для срока доставки у товаров

Используем ACF или стандартное метаполе, чтобы задать срок доставки в днях для каждого товара.

function add_delivery_time_field() {
    woocommerce_wp_text_input( array(
        'id' => '_delivery_time',
        'label' => __('Срок доставки (дней)', 'woocommerce'),
        'desc_tip' => 'true',
        'description' => __('Укажите срок доставки в днях для этого товара', 'woocommerce'),
        'type' => 'number',
        'custom_attributes' => array(
            'min' => '0',
            'step' => '1',
        )
    ));
}
add_action('woocommerce_product_options_shipping', 'add_delivery_time_field');

function save_delivery_time_field($post_id) {
    $delivery_time = isset($_POST['_delivery_time']) ? intval($_POST['_delivery_time']) : '';
    update_post_meta($post_id, '_delivery_time', $delivery_time);
}
add_action('woocommerce_process_product_meta', 'save_delivery_time_field');

2. Ограничиваем выбор способов оплаты по срокам доставки товаров в корзине

Добавим фильтр, который отключит способы оплаты, если в корзине есть товар со сроком доставки меньше заданного порога.

add_filter('woocommerce_available_payment_gateways', 'restrict_payment_gateways_by_delivery_time');
function restrict_payment_gateways_by_delivery_time($available_gateways) {
    $min_allowed_delivery = 3; // минимальный срок доставки для выбранных способов оплаты
    $has_fast_delivery_items = false;

    foreach (WC()->cart->get_cart() as $cart_item) {
        $delivery_time = get_post_meta($cart_item['product_id'], '_delivery_time', true);
        if ($delivery_time !== '' && intval($delivery_time) < $min_allowed_delivery) {
            $has_fast_delivery_items = true;
            break;
        }
    }

    if ($has_fast_delivery_items) {
        // Удаляем способы оплаты, не поддерживающие быструю доставку
        foreach ($available_gateways as $gateway_id => $gateway) {
            if (!in_array($gateway_id, array('cod', 'bacs'))) { // допустим, разрешаем только наложенный платеж и банковский перевод
                unset($available_gateways[$gateway_id]);
            }
        }
    }

    return $available_gateways;
}

3. Ограничение сроков доставки на странице оформления заказа

Добавим кастомное сообщение и ограничение выбора даты доставки в зависимости от максимального срока доставки из корзины.

add_action('woocommerce_after_order_notes', 'add_custom_delivery_date_field');
function add_custom_delivery_date_field($checkout) {
    $max_delivery_time = 0;
    foreach (WC()->cart->get_cart() as $cart_item) {
        $delivery_time = get_post_meta($cart_item['product_id'], '_delivery_time', true);
        if ($delivery_time !== '') {
            $max_delivery_time = max($max_delivery_time, intval($delivery_time));
        }
    }

    echo '<p class="form-row form-row-wide">';
    woocommerce_form_field('delivery_date', array(
        'type' => 'date',
        'class' => array('form-row-wide'),
        'label' => __('Выберите дату доставки'),
        'required' => true,
        'custom_attributes' => array(
            'min' => date('Y-m-d', strtotime('+' . $max_delivery_time . ' days'))
        )
    ), $checkout->get_value('delivery_date'));
    echo '</p>';
}

add_action('woocommerce_checkout_process', 'validate_delivery_date_field');
function validate_delivery_date_field() {
    if (!$_POST['delivery_date']) {
        wc_add_notice(__('Пожалуйста, выберите дату доставки.'), 'error');
    } else {
        $selected_date = strtotime(sanitize_text_field($_POST['delivery_date']));
        $max_delivery_time = 0;
        foreach (WC()->cart->get_cart() as $cart_item) {
            $delivery_time = get_post_meta($cart_item['product_id'], '_delivery_time', true);
            if ($delivery_time !== '') {
                $max_delivery_time = max($max_delivery_time, intval($delivery_time));
            }
        }
        $min_date = strtotime('+' . $max_delivery_time . ' days');
        if ($selected_date < $min_date) {
            wc_add_notice(sprintf(__('Дата доставки должна быть не раньше чем через %d дней.'), $max_delivery_time), 'error');
        }
    }
}

Проверка результата после внедрения

Частые ошибки и как их исправить

Практические советы по производительности и безопасности

Сравнение способов реализации ограничения способов оплаты и сроков доставки

МетодПлюсыМинусы
Код через хуки и метаполяГибкость, полная кастомизация, отсутствие зависимости от плагиновТребует навыков разработки, может конфликтовать с другими кастомизациями
Плагины для правил оплаты и доставкиПростота настройки, поддержка, визуальный интерфейсДополнительная нагрузка, возможные ограничения в логике, стоимость
WooCommerce: как изменить цену товара в зависимости от роли пользователя
25.06.2026
WooCommerce: как программно изменить статус заказа без плагинов
28.05.2026
Как добавить настройки в панель управления WordPress с помощью плагина и кода
25.11.2025
Как автоматизировать удаление спама в комментариях WordPress
05.02.2026
Как удалить неиспользуемые таблицы в базе данных WordPress
19.01.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее