Диагностика задачи: почему нужно ограничивать сроки доставки и способы оплаты для товаров
В интернет-магазинах на 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');
}
}
}Проверка результата после внедрения
- Создайте товар с разным значением срока доставки (например, 1 и 5 дней).
- Добавьте товары в корзину по отдельности и проверьте доступные способы оплаты на странице оформления заказа.
- Попробуйте выбрать дату доставки раньше допустимой — должно появиться предупреждение.
- Убедитесь, что при выборе товара с коротким сроком доставки отключаются неподходящие способы оплаты.
Частые ошибки и как их исправить
- Метаполе _delivery_time не сохраняется: Проверьте, что функции сохранения подключены и не конфликтуют с другими плагинами.
- Способы оплаты не ограничиваются: Убедитесь, что фильтр
woocommerce_available_payment_gatewaysправильно подключён и не перезаписывается позже. - Ошибка при проверке даты доставки: Проверьте формат даты и используйте
sanitize_text_fieldдля входящих данных. - Не учитываются все товары в корзине: Проверьте, что перебираете все элементы
WC()->cart->get_cart()и правильно извлекаете мета.
Практические советы по производительности и безопасности
- Кешируйте результаты метаданных товаров, если корзина большая, чтобы избежать лишних запросов к базе.
- Используйте nonce и проверку прав пользователя при сохранении метаполей для безопасности.
- Обязательно тестируйте на staging-сайте перед внедрением в продакшен.
- Для сложных ограничений рассмотрите использование плагинов, например, Clearfy Pro, поддерживающего оптимизацию и управление правилами.
Сравнение способов реализации ограничения способов оплаты и сроков доставки
| Метод | Плюсы | Минусы |
|---|---|---|
| Код через хуки и метаполя | Гибкость, полная кастомизация, отсутствие зависимости от плагинов | Требует навыков разработки, может конфликтовать с другими кастомизациями |
| Плагины для правил оплаты и доставки | Простота настройки, поддержка, визуальный интерфейс | Дополнительная нагрузка, возможные ограничения в логике, стоимость |