Диагностика проблемы с неактивными товарами
В интернет-магазинах на WooCommerce часто возникает необходимость автоматически скрывать или отключать товары, которые не продаются или не обновлялись длительное время. Это помогает держать каталог актуальным, уменьшать нагрузку на базу данных и улучшать пользовательский опыт. Основные признаки проблемы:
- Товары без продаж и просмотров долгое время (например, 3-6 месяцев);
- Ручное отключение или удаление занимает много времени;
- Отсутствие автоматизации приводит к устаревшему каталогу и снижению конверсии.
Для решения задачи нужно настроить автоматическое отключение (перевод в статус «черновик» или «скрытый») таких товаров.
Пошаговое решение: автоматическое отключение товаров по дате последнего обновления
1. Подключение к WP-Cron для регулярной проверки
Используем встроенный механизм WP-Cron для запуска функции проверки неактивных товаров. Добавляем в functions.php или в собственный плагин:
if ( ! wp_next_scheduled( 'auto_disable_inactive_products' ) ) {
wp_schedule_event( time(), 'daily', 'auto_disable_inactive_products' );
}2. Функция для выборки и отключения товаров
Пишем функцию, которая выбирает товары, не обновлявшиеся более N дней, и переводит их в статус draft:
function disable_inactive_products() {
$days_inactive = 90; // Порог неактивности в днях
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_inactive} days"));
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'date_query' => array(
array(
'column' => 'post_modified',
'before' => $date_threshold,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$query = new WP_Query($args);
if ( ! empty($query->posts) ) {
foreach ( $query->posts as $product_id ) {
wp_update_post(array(
'ID' => $product_id,
'post_status' => 'draft',
));
}
}
}
add_action('auto_disable_inactive_products', 'disable_inactive_products');3. Дополнительная проверка по продажам (опционально)
Для более точного определения неактивных товаров можно проверить наличие заказов с этим товаром за последние N дней. Пример запроса к базе:
function has_sales_last_days( $product_id, $days = 90 ) {
global $wpdb;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$query = $wpdb->prepare(
"SELECT COUNT( DISTINCT p.ID )
FROM {$wpdb->prefix}posts p
INNER JOIN {$wpdb->prefix}woocommerce_order_items oi ON p.ID = oi.order_id
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
WHERE p.post_type = 'shop_order'
AND p.post_status IN ( 'wc-completed', 'wc-processing' )
AND p.post_date > %s
AND oim.meta_key = '_product_id'
AND oim.meta_value = %d",
$date_threshold,
$product_id
);
return $wpdb->get_var( $query ) > 0;
}В функцию disable_inactive_products можно добавить проверку has_sales_last_days и исключать товары с продажами.
Проверка результата после внедрения
- Запустить вручную функцию для теста (временно вызвать
disable_inactive_products()в админке или через WP-CLI `wp eval 'disable_inactive_products();'`); - Проверить, что товары, которые не обновлялись и не продавались, стали статусом
draft; - Убедиться, что товары с активными продажами остались опубликованными;
- Проверить журнал ошибок PHP и логи сервера на отсутствие ошибок;
- Через сутки убедиться, что автоматический запуск WP-Cron сработал (можно установить плагин WP Crontrol для мониторинга).
Частые ошибки и как их исправить
- WP-Cron не срабатывает: по умолчанию WP-Cron запускается при посещении сайта. Если трафика мало, можно настроить системный cron на вызов
wp-cron.phpнапрямую. - Некорректный выбор товаров: проверьте параметры
date_queryи статус товара. Например, если товары уже вdraft, они не попадут в выборку. - Функция отключает слишком много товаров: добавьте проверку на продажи или просмотры, чтобы исключить активные позиции.
- Проблемы с производительностью: если товаров много, разбивайте обработку на батчи, используйте пагинацию в WP_Query.
Практические советы по безопасности и производительности
- Используйте транзакции или проверяйте результаты
wp_update_postдля исключения ошибок обновления. - Добавьте логирование отключенных товаров в отдельный файл для аудита.
- Для крупных магазинов рекомендуем запускать скрипт в фоне через WP-CLI или отдельный cron-задание, чтобы избежать таймаутов.
- Ограничьте права пользователя, под которым выполняется скрипт, чтобы минимизировать риск безопасности.
Сравнение способов реализации автоматического отключения товаров
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| WP-Cron + PHP код | Стандартный планировщик WordPress с кастомной функцией отключения | Без плагинов, гибко, легко кастомизировать | Зависит от посещаемости сайта, возможны пропуски срабатывания |
| Внешний системный cron + WP-CLI | Вызов WP-CLI команды по расписанию на сервере | Надежно, не зависит от трафика, высокая производительность | Требует доступа к серверу и навыков работы с консолью |
| Плагин автоматизации (например, Advanced Cron Manager) | Использование готового плагина для управления задачами | Удобный интерфейс, мониторинг задач | Дополнительная нагрузка, зависимость от стороннего кода |