Диагностика проблемы с устаревшими товарами и отсутствующими вариантами в WooCommerce
В интернет-магазинах на WooCommerce со временем возникают товары, которые устарели, больше не продаются или имеют варианты, которых фактически нет в наличии или которые неактуальны. Ручное удаление таких товаров и вариантов занимает много времени и чревато ошибками — например, когда забывают очистить связанные данные, что влияет на производительность и качество каталога.
Проблема усугубляется, если у магазина большой ассортимент и регулярные обновления. В итоге на сайте накапливаются неактуальные товары и варианты, что снижает конверсию и увеличивает нагрузку на базу данных.
Пошаговое решение: автоматизация удаления старых товаров и отсутствующих вариантов
1. Определяем критерии "устаревшего" товара
Для автоматического удаления нужно чётко определить, что считать устаревшим. Чаще всего используют следующие критерии:
- Дата последнего обновления товара старше определённого периода (например, 180 дней).
- Статус товара — например, 'черновик' или 'отключен'.
- Отсутствие продаж за период.
- Отсутствие остатков на складе (для вариантов).
2. Используем WP-CLI или WP-Cron для регулярного запуска задачи
Для автоматизации на сервере рекомендуется настроить WP-Cron, который будет запускать функцию очистки по расписанию — например, раз в неделю.
3. Пример кода для удаления устаревших товаров и отсутствующих вариантов
Ниже пример простого кода, который можно добавить в functions.php темы или оформить в плагин. Он удаляет товары, обновлённые более 180 дней назад, и варианты с нулевым запасом.
<?php
add_action('wp_loaded', 'auto_delete_old_products_and_variations');
function auto_delete_old_products_and_variations() {
// Проверяем, что это крона, чтобы не тормозить сайт при обычных запросах
if (!wp_doing_cron()) {
return;
}
$days = 180; // Период устаревания
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
// WP_Query для поиска устаревших товаров (простой пример)
$args = [
'post_type' => 'product',
'post_status' => 'publish',
'date_query' => [
[
'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_trash_post($product_id);
}
}
// Удаляем вариации с запасом 0
$variation_args = [
'post_type' => 'product_variation',
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids',
];
$variation_query = new WP_Query($variation_args);
if (!empty($variation_query->posts)) {
foreach ($variation_query->posts as $variation_id) {
$stock = get_post_meta($variation_id, '_stock', true);
$manage_stock = get_post_meta($variation_id, '_manage_stock', true);
if ($manage_stock === 'yes' && intval($stock) <= 0) {
wp_trash_post($variation_id);
}
}
}
}
// Запускаем задачу через WP-Cron, например раз в неделю
add_action('wp', function() {
if (!wp_next_scheduled('weekly_delete_old_products')) {
wp_schedule_event(time(), 'weekly', 'weekly_delete_old_products');
}
});
add_action('weekly_delete_old_products', 'auto_delete_old_products_and_variations');
?>4. Настройка WP-Cron вручную (если нужно)
Для надежности на продакшене лучше настроить системный cron на сервере, чтобы вызывать wp-cron.php. Пример команды для Linux:
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Добавить в crontab:
0 3 * * 1 wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Проверка результата после внедрения
- Перейдите в админку WooCommerce > Товары и проверьте, что устаревшие товары перенесены в корзину или удалены.
- Проверьте, что вариации с нулевым запасом отсутствуют.
- Запустите cron вручную через WP-CLI (wp cron event run --due-now) и посмотрите логи ошибок.
- Обратите внимание на производительность сайта — наличие мусора в БД должно уменьшиться.
Частые ошибки и как их исправить
- Код не запускается автоматически: проверьте, что WP-Cron активен и что событие запланировано (wp cron event list).
- Удаляются не те товары: уточните критерии в
WP_Query, возможно, нужно добавить проверку статуса или категорий. - Удаление вариаций не работает: проверьте, что у вариаций корректно заполнены мета-поля
_stockи_manage_stock. - Функция тормозит сайт: ограничьте количество товаров в запросе, используйте batch-обработку.
Практические советы по безопасности и производительности
- Не удаляйте товары без возможности восстановления — используйте корзину (trash) вместо полного удаления.
- Используйте WP-CLI для отладки и запуска задач без нагрузки на пользовательский трафик.
- Ограничьте количество товаров, обрабатываемых за один запуск, чтобы избежать таймаутов.
- Логируйте удалённые товары и варианты для аудита.
Сравнение вариантов решения удаления старых товаров
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Ручное удаление | Простота, контроль | Долго, ошибки, трудоемко | Через админку WooCommerce |
| Плагин очистки (например, WP Bulk Delete) | Удобный интерфейс, гибкие настройки | Нагрузка, зависимость от сторонних решений | Clearfy (функции очистки) |
| Собственный код + WP-Cron | Полный контроль, автоматизация | Нужно тестировать, требует навыков | Код из статьи |