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)Кастомный кодКомпромисс
ГибкостьВысокая, с интерфейсомМаксимальная, требует знанийКод сложнее поддерживать
ПроизводительностьМожет замедлять сайтЛегковесный, при правильном кодеТребует тестирования
Простота использованияДля админа без знаний кодаТребует разработчикаОптимально для больших проектов
СтоимостьПлатныйБесплатноЗависит от времени разработки
Как использовать внешние API в WordPress с помощью AJAX: практическое руководство
02.04.2026
WooCommerce: как программно удалять неактивные корзины и заказы
31.05.2026
WooCommerce: как устроить автоперенаправление после оформления заказа
29.06.2026
Как автоматизировать удаление спама в комментариях WordPress
05.02.2026
Как добавить двойную авторизацию в WordPress без плагинов
12.03.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше