Диагностика проблемы: почему товары остаются активными после окончания акции
В 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).
- Если дата окончания акции меньше текущей, то акция снимается и товар переводится в статус «черновик».
Проверка результата после внедрения
Чтобы проверить, что автоматическое отключение работает:
- Задайте акцию на товар с датой окончания, например, вчерашним числом.
- Запустите Cron вручную через WP-CLI:
wp cron event run check_sale_end_hookили дождитесь следующего срабатывания. - Проверьте статус товара в админке — он должен стать «черновиком».
- Проверьте в каталоге магазина — товар должен быть скрыт.
Частые ошибки и как их исправить
- 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 |