Почему важно отключать неактивные товары в WooCommerce
В больших интернет-магазинах на WooCommerce часто возникает проблема с устаревшими или временно недоступными товарами, которые остаются опубликованными. Это негативно сказывается на пользовательском опыте и SEO, а также увеличивает нагрузку на базу данных и фронтенд сайта. Автоматическое отключение таких товаров помогает поддерживать каталог в актуальном состоянии без постоянного ручного контроля.
Диагностика: как определить неактивные товары
Под неактивными товарами понимаются те, у которых отсутствуют продажи, просмотры или обновления за определённый период времени. Для начала нужно понять:
- Какой период безактивности считать критичным (например, 3 месяца без заказов).
- Какие метрики использовать — дата последней покупки, дата обновления товара, количество просмотров.
- Какой статус товара считать "отключённым": черновик, снят с публикации или пользовательский статус.
Для диагностики можно воспользоваться SQL-запросом к базе данных WooCommerce, чтобы получить список товаров без заказов за последний квартал:
SELECT p.ID, p.post_title FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_name = p.ID
LEFT JOIN wp_posts o ON o.ID = oi.order_id AND o.post_status IN ('wc-completed', 'wc-processing')
WHERE p.post_type = 'product'
AND o.ID IS NULL
AND p.post_date < DATE_SUB(NOW(), INTERVAL 3 MONTH);Этот запрос покажет товары, которые не связывались с завершёнными или обрабатываемыми заказами за последние 3 месяца.
Пошаговое решение: автоматическое отключение товаров с помощью WP Cron
1. Создание функции для отключения неактивных товаров
function wc_disable_inactive_products() {
$args = [
'post_type' => 'product',
'post_status' => 'publish',
'date_query' => [
[
'column' => 'post_date',
'before' => '3 months ago',
],
],
'meta_query' => [
[
'key' => '_last_order_date',
'compare' => 'NOT EXISTS',
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$products = get_posts($args);
foreach ($products as $product_id) {
wp_update_post([
'ID' => $product_id,
'post_status' => 'draft',
]);
}
}Здесь мы выбираем товары, у которых нет мета-поля с датой последнего заказа (которое нужно обновлять отдельно при покупке) и которые опубликованы более 3 месяцев назад.
2. Обновление мета-поля даты последнего заказа
Чтобы функция работала корректно, нужно при каждом успешном заказе обновлять мета-данные товаров:
add_action('woocommerce_order_status_completed', 'update_last_order_date_for_products');
function update_last_order_date_for_products($order_id) {
$order = wc_get_order($order_id);
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
update_post_meta($product_id, '_last_order_date', current_time('mysql'));
}
}3. Настройка WP Cron для периодического запуска
if (!wp_next_scheduled('wc_disable_inactive_products_cron')) {
wp_schedule_event(time(), 'daily', 'wc_disable_inactive_products_cron');
}
add_action('wc_disable_inactive_products_cron', 'wc_disable_inactive_products');Эта настройка запускает проверку и отключение товаров раз в сутки.
Проверка результата после внедрения
- Посмотрите в админке WooCommerce раздел "Товары" и отфильтруйте по статусу "Черновик" — должны появиться отключённые товары.
- Проверьте логи Cron (можно использовать плагин WP Crontrol), что событие выполняется без ошибок.
- Убедитесь, что мета-поле
_last_order_dateкорректно обновляется при заказах, сделав тестовый заказ. - Проверьте, что отключённые товары не отображаются на витрине сайта.
Частые ошибки и как их исправить
- Функция не отключает товары: Проверьте, что мета-поле
_last_order_dateдействительно заполняется — без него условие не сработает. - Cron-задача не запускается: Убедитесь, что на хостинге разрешена работа WP Cron или настройте системный cron на вызов
wp-cron.php. - Товары отключаются слишком рано: Проверьте правильность параметров
date_queryи период безактивности. - Сбои из-за большого количества товаров: Разбейте обработку на порции, используя пагинацию в запросе, чтобы избежать превышения лимитов памяти.
Практические советы по безопасности и производительности
- Не отключайте товары сразу навсегда — сначала переводите в статус черновика, чтобы была возможность восстановить.
- Используйте транзакции или логи, если отключение происходит в несколько шагов, чтобы избежать потери данных.
- Регулярно очищайте устаревшие мета-данные для уменьшения размера базы данных.
- Если магазин большой, рассмотрите использование специализированных плагинов для управления статусом товаров и отчетности.
Сравнение вариантов реализации
| Способ | Плюсы | Минусы |
|---|---|---|
| Код на WP Cron (как в статье) | Контроль, кастомизация, бесплатно | Нужны навыки, возможно нагрузка при большом каталоге |
| Плагин управления товарами (например, "WooCommerce Smart Manager") | Простой интерфейс, функции без кода | Платно, ограничена гибкость |
| Ручное отключение | Точно контролируете каждый товар | Трудозатратно, риск пропусков |