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

|

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

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

Типичные запросы:

Как проверить текущие ограничения и поведение WooCommerce

Для диагностики:

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

1. Ограничение способов оплаты на уровне корзины

Добавим фильтр, который будет убирать из списка способов оплаты те, которые не подходят, если в корзине есть определённые товары (по ID или категории).

add_filter('woocommerce_available_payment_gateways', 'restrict_payment_gateways_for_products');
function restrict_payment_gateways_for_products($available_gateways) {
    if (is_admin()) return $available_gateways; // не трогаем админку

    $restricted_product_ids = array(123, 456); // ID товаров с ограничениями
    $cart_items = WC()->cart->get_cart();

    foreach ($cart_items as $item) {
        if (in_array($item['product_id'], $restricted_product_ids)) {
            // например, запретим 'cod' и 'cheque'
            unset($available_gateways['cod']);
            unset($available_gateways['cheque']);
            break;
        }
    }
    return $available_gateways;
}

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

Чтобы скрыть способ доставки при наличии определённых товаров, используем аналогичный фильтр:

add_filter('woocommerce_package_rates', 'restrict_shipping_methods_for_products', 10, 2);
function restrict_shipping_methods_for_products($rates, $package) {
    $restricted_product_ids = array(123, 456);
    $found = false;

    foreach ($package['contents'] as $item) {
        if (in_array($item['product_id'], $restricted_product_ids)) {
            $found = true;
            break;
        }
    }

    if ($found) {
        // Оставим только определённый способ доставки, например 'local_pickup'
        foreach ($rates as $rate_id => $rate) {
            if ('local_pickup' !== $rate->method_id) {
                unset($rates[$rate_id]);
            }
        }
    }
    return $rates;
}

3. Установка минимального срока доставки для конкретных товаров

WooCommerce не имеет встроенного таймера для сроков доставки, поэтому можно добавить кастомное поле для товара и показывать предупреждение на странице оформления заказа, если выбранный срок доставки меньше минимального.

Пример добавления метаполя с минимальным сроком доставки (в днях) в админке товара (через functions.php или плагин):

add_action('woocommerce_product_options_shipping', 'add_min_delivery_time_field');
function add_min_delivery_time_field() {
    woocommerce_wp_text_input(
        array(
            'id' => '_min_delivery_time',
            'label' => __('Минимальный срок доставки (дни)', 'woocommerce'),
            'type' => 'number',
            'custom_attributes' => array('step' => '1', 'min' => '0'),
        )
    );
}

add_action('woocommerce_process_product_meta', 'save_min_delivery_time_field');
function save_min_delivery_time_field($post_id) {
    $min_delivery_time = isset($_POST['_min_delivery_time']) ? intval($_POST['_min_delivery_time']) : '';
    update_post_meta($post_id, '_min_delivery_time', $min_delivery_time);
}

Далее на странице оформления заказа проверим выбранный способ доставки и сравним с минимальным сроком доставки товаров в корзине:

add_action('woocommerce_checkout_process', 'check_min_delivery_time');
function check_min_delivery_time() {
    $chosen_shipping_methods = WC()->session->get('chosen_shipping_methods');
    if (empty($chosen_shipping_methods)) return;

    $min_days = 0;
    foreach (WC()->cart->get_cart() as $cart_item) {
        $product_id = $cart_item['product_id'];
        $product_min = get_post_meta($product_id, '_min_delivery_time', true);
        if ($product_min && $product_min > $min_days) {
            $min_days = $product_min;
        }
    }

    // Здесь поставьте логику проверки срока доставки, например, сравните с выбранным способом
    // Для примера просто выведем ошибку, если срок меньше 3 дней
    $allowed_min_days = 3; // пример
    if ($min_days > $allowed_min_days) {
        wc_add_notice(sprintf('Минимальный срок доставки для некоторых товаров: %d дней. Пожалуйста, выберите другой способ доставки.', $min_days), 'error');
    }
}

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

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

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

Сравнение подходов: плагин vs кастомный код

КритерийПлагин (например, Conditional Shipping and Payments)Кастомный кодКомпромисс
ГибкостьВысокая, с интерфейсомМаксимальная, требует знанийКод сложнее поддерживать
ПроизводительностьМожет замедлять сайтЛегковесный, при правильном кодеТребует тестирования
Простота использованияДля админа без знаний кодаТребует разработчикаОптимально для больших проектов
СтоимостьПлатныйБесплатноЗависит от времени разработки
Как использовать REST API WordPress для создания кастомных функций
29.11.2025
WooCommerce: установка ограничений на сроки доставки и способы оплаты для конкретных товаров
03.05.2026
Как отключить создание заказа в WooCommerce после неудачной оплаты
13.08.2026
Как автоматически удалять неактивных пользователей WordPress
23.03.2026
Как сделать динамические шорткоды WordPress: примеры и практические решения
13.11.2025
×

AI-плагин

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

SEO и мета-теги

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

Изображения

Комментарии

Подробнее