Диагностика проблемы с неактивными товарами в WooCommerce
В интернет-магазинах на WooCommerce часто возникает задача автоматически скрывать или отключать товары, которые не продаются долгое время или не обновлялись. Это помогает поддерживать актуальность ассортимента без необходимости ручного контроля. Проблема: товары остаются опубликованными, что вводит покупателей в заблуждение и мешает SEO.
Как понять, что товар неактивен?
- Отсутствие продаж за заданный период (например, 90 дней).
- Отсутствие обновлений товара (изменение цены, описания).
- Отсутствие остатков товара (stock quantity равен нулю).
Для автоматизации процесса необходимо использовать один или несколько из этих критериев.
Пошаговое решение: автоматическое отключение неактивных товаров
Реализуем функцию, которая проверяет товары и меняет их статус на "черновик", если они не продавались более 90 дней.
1. Подключение функции к планировщику WP-Cron
if (!wp_next_scheduled('auto_disable_inactive_products')) {
wp_schedule_event(time(), 'daily', 'auto_disable_inactive_products');
}2. Основная функция проверки и отключения товаров
function disable_inactive_woocommerce_products() {
global $wpdb;
$days_threshold = 90;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_threshold . ' days'));
// Получаем ID товаров, у которых не было заказов после $date_threshold
$product_ids = $wpdb->get_col($wpdb->prepare(
"SELECT DISTINCT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_id IN (
SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key = '_product_id' AND meta_value = p.ID
)
LEFT JOIN {$wpdb->prefix}posts o ON o.ID = oi.order_id
WHERE p.post_type = 'product'
AND (o.post_date IS NULL OR o.post_date < %s)
AND p.post_status = 'publish'",
$date_threshold
));
if (!empty($product_ids)) {
foreach ($product_ids as $product_id) {
// Меняем статус товара на черновик
wp_update_post(array(
'ID' => $product_id,
'post_status' => 'draft'
));
}
}
}
add_action('auto_disable_inactive_products', 'disable_inactive_woocommerce_products');3. Добавление проверки остатка товара
Если вы хотите также отключать товары с нулевым остатком, добавьте дополнительную проверку:
foreach ($product_ids as $product_id) {
$stock_quantity = get_post_meta($product_id, '_stock', true);
if ($stock_quantity === '' || intval($stock_quantity) > 0) {
continue; // Пропускаем товары с остатком
}
wp_update_post(array(
'ID' => $product_id,
'post_status' => 'draft'
));
}Проверка результата после внедрения
Для проверки работы скрипта:
- Выполните вручную запуск задачи:
do_action('auto_disable_inactive_products'); - Проверьте в админке WooCommerce, что товары, которые не продавались более 90 дней и имеют нулевой остаток, переведены в статус "Черновик".
- Отследите логи ошибок PHP и убедитесь, что нет предупреждений.
- Запустите
wp cron event listчерез WP-CLI для проверки расписания задачи.
Частые ошибки и способы их исправления
- Ошибка: Скрипт не отключает товары.
Причина: Неправильно определены заказы или дата.
Исправление: Проверьте правильность SQL-запроса, убедитесь, что заказы существуют и их даты корректны. - Ошибка: WP-Cron не запускается.
Причина: Система не обрабатывает cron-задания.
Исправление: Настройте системный cron или используйте плагин WP Crontrol для тестирования. - Ошибка: Отключаются товары с остатком.
Причина: Проверьте корректность проверки остатка, возможно, метаполе '_stock' отсутствует или хранит некорректные данные.
Практические советы по безопасности и производительности
- Не запускайте тяжелые запросы в пользовательском запросе – используйте WP-Cron или системный cron.
- Добавьте логирование отключений товаров для последующего аудита.
- Оптимизируйте SQL-запросы, избегайте JOIN'ов без индексов.
- Используйте transient API для кеширования результатов, если проверка занимает много времени.
Сравнение вариантов автоматического отключения товаров
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Плагин автоматизации | Простота настройки, поддержка | Может замедлять сайт, лишний функционал | WC Smart Manager, WooCommerce Scheduler |
| Код в functions.php | Легковесность, полный контроль | Требует навыков, ответственность за ошибки | Пример из статьи |
| Внешний cron с WP-CLI | Точная настройка, минимальная нагрузка | Сложна для новичков, доступ к серверу | wp cron event run --due-now |