wplinks.ru wordpress WPLinks.ru

Автоматическое отключение товаров в WooCommerce после окончания срока акции

Диагностика проблемы: почему товары остаются активными после окончания акции

В WooCommerce часто приходится запускать временные акции с ограниченным сроком. Проблема в том, что после окончания акции товары остаются доступны для покупки, хотя скидка должна автоматически прекращаться, а товар — становиться недоступным или скрытым. Такое поведение приводит к путанице у покупателей и потерям на стороне магазина.

Основная причина — отсутствие автоматизации отключения товара или изменения его статуса после даты окончания скидки. WooCommerce по умолчанию не умеет автоматически менять статус товара при завершении акционной цены.

Пошаговое решение: как автоматически отключать товары после окончания акции

1. Используем WP-Cron для регулярной проверки дат окончания акций

Для автоматизации нужно создать задачу, которая будет запускаться, например, раз в сутки и проверять товары с установленной акционной ценой и датой окончания. Если дата окончания прошла, товар переводится в статус «черновик» или «скрыт».

2. Пример кода для functions.php или кастомного плагина

<?php
// Регистрируем событие при активации темы или плагина
function my_activation_schedule() {
    if ( ! wp_next_scheduled( 'check_sale_end_hook' ) ) {
        wp_schedule_event( time(), 'daily', 'check_sale_end_hook' );
    }
}
register_activation_hook( __FILE__, 'my_activation_schedule' );

// Удаляем расписание при деактивации
function my_deactivation_schedule() {
    wp_clear_scheduled_hook( 'check_sale_end_hook' );
}
register_deactivation_hook( __FILE__, 'my_deactivation_schedule' );

// Хук, который запускает функцию проверки
add_action( 'check_sale_end_hook', 'check_and_disable_expired_sales' );

function check_and_disable_expired_sales() {
    $today = current_time( 'Y-m-d' );
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_sale_price_dates_to',
                'value'   => 0,
                'compare' => '>',
                'type'    => 'NUMERIC',
            ],
        ],
        'fields' => 'ids',
    ];

    $sale_products = get_posts( $args );

    foreach ( $sale_products as $product_id ) {
        $sale_to = get_post_meta( $product_id, '_sale_price_dates_to', true );
        if ( $sale_to ) {
            $sale_end_date = date( 'Y-m-d', $sale_to );
            if ( $sale_end_date < $today ) {
                // Снимаем акцию
                update_post_meta( $product_id, '_sale_price', '' );
                update_post_meta( $product_id, '_sale_price_dates_from', '' );
                update_post_meta( $product_id, '_sale_price_dates_to', '' );

                // Отключаем товар (переводим в черновик)
                wp_update_post( [
                    'ID'          => $product_id,
                    'post_status' => 'draft',
                ] );
            }
        }
    }
}
?>

3. Что делает код

  • Создаёт задачу в WP-Cron, которая срабатывает ежедневно.
  • Ищет товары, у которых установлен период акции (_sale_price_dates_to > 0).
  • Если дата окончания акции меньше текущей, то акция снимается и товар переводится в статус «черновик».

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

Чтобы проверить, что автоматическое отключение работает:

  1. Задайте акцию на товар с датой окончания, например, вчерашним числом.
  2. Запустите Cron вручную через WP-CLI: wp cron event run check_sale_end_hook или дождитесь следующего срабатывания.
  3. Проверьте статус товара в админке — он должен стать «черновиком».
  4. Проверьте в каталоге магазина — товар должен быть скрыт.

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

  • Cron не срабатывает: убедитесь, что WP-Cron включён и работает, или настройте системный cron на вызов wp-cron.php.
  • Товары не находятся: проверьте правильность meta_query — ключи _sale_price_dates_to должны быть в формате Unix timestamp.
  • Статус товара не меняется: проверьте права пользователя и что функция wp_update_post вызывается с корректным ID.
  • Акция не снимается, а товар остаётся в продаже: убедитесь, что обновление мета данных проходит успешно, можно добавить отладочные логи.

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

  • Не запускайте проверку слишком часто, раз в сутки достаточно для большинства случаев.
  • Используйте WP-CLI для тестирования и отладки cron задач.
  • Добавьте кеширование, если товаров очень много — разбивайте выборку на страницы.
  • Всегда тестируйте на тестовом сайте, чтобы избежать случайного отключения активных товаров.

Сравнение подходов для автоматического отключения товаров

МетодПлюсыМинусыПример использования
WP-Cron + кастомный кодГибкость, полное управление, бесплатноЗависит от корректной работы WP-Cron, требует навыков программированияКод из статьи
Плагины управления акциямиПростота настройки, дополнительные функцииЧасто платные, могут замедлять сайтAdvanced Coupons, WooCommerce Scheduler
Ручное отключениеПростота, нет сложностей с кодомТребует времени, риск забытьАдминка WooCommerce
×
Сделай свой сайт крутым!

Скидка -20% на премиум плагины WordPress

Выбрать плагин сейчас ⋙