Диагностика проблемы с неактивными товарами и вариациями в WooCommerce
При длительной работе интернет-магазина на WooCommerce накапливаются товары и вариации, которые не продаются, устарели или неактивны. Это приводит к увеличению объёма базы данных, замедлению загрузки страниц и усложнению управления каталогом. Особенно критично, если в магазине тысячи товаров и вариантов.
Типичные признаки проблемы:
- В базе данных много товаров со статусом
draft,pendingилиprivate, которые не продаются. - Вариации товаров, которые неактивны и не отображаются на сайте, но занимают место.
- Отсутствие регулярной чистки устаревших позиций.
- Замедленная работа админки и фронтенда магазина.
Почему важно автоматизировать удаление неактивных товаров и вариаций
Ручное удаление занимает много времени и часто забывается. Автоматизация позволяет:
- Поддерживать базу данных в чистоте без лишней нагрузки.
- Повысить скорость загрузки страниц за счёт уменьшения объёма выборок.
- Избежать ошибок из-за старых данных.
Пошаговое решение: создание автоматического скрипта для удаления
1. Определяем критерии неактивности
Для товаров и вариаций под неактивными понимаем:
- Товары с датой последнего обновления более 180 дней назад и статусом
draftилиprivate. - Вариации, которые не продаются (статус
privateилиdraft).
2. Реализация функции удаления в functions.php или подключаемом файле плагина
function wpset_delete_inactive_products_and_variations() {
// Параметры даты - 180 дней назад
$date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
// Удаление неактивных товаров
$args_products = array(
'post_type' => 'product',
'post_status' => array('draft', 'private'),
'date_query' => array(
array(
'column' => 'post_modified',
'before' => $date_threshold,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$products = get_posts($args_products);
foreach ($products as $product_id) {
wp_delete_post($product_id, true); // Полное удаление
}
// Удаление вариаций
$args_variations = array(
'post_type' => 'product_variation',
'post_status' => array('draft', 'private'),
'posts_per_page' => -1,
'fields' => 'ids',
);
$variations = get_posts($args_variations);
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true);
}
}
// Запускаем функцию по крону или вручную
// add_action('wp_loaded', 'wpset_delete_inactive_products_and_variations');3. Автоматизация через WP-Cron
Для автоматического запуска скрипта добавим событие cron, которое будет срабатывать раз в сутки.
function wpset_schedule_inactive_products_cleanup() {
if (!wp_next_scheduled('wpset_daily_inactive_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpset_daily_inactive_cleanup');
}
}
add_action('wp', 'wpset_schedule_inactive_products_cleanup');
add_action('wpset_daily_inactive_cleanup', 'wpset_delete_inactive_products_and_variations');Проверка результата после внедрения
- Проверьте наличие удалённых товаров в админке WooCommerce — они должны исчезнуть.
- Выполните запрос к базе данных:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product' AND post_status IN ('draft', 'private') AND post_modified < DATE_SUB(NOW(), INTERVAL 180 DAY);— должен вернуть 0. - Проверьте логи сервера на предмет ошибок при запуске скрипта.
- Для проверки cron: запустите
do_action('wpset_daily_inactive_cleanup');вручную в файле или через консоль WP-CLI.
Частые ошибки и как их исправить
- Функция не запускается по расписанию. Проверьте, активен ли WP-Cron и нет ли конфликтов с плагинами, блокирующими cron.
- Удаляются нужные товары. Проверьте критерии выборки, возможно, нужно изменить статус или дату.
- Скрипт занимает слишком много времени. Разбейте выборку на партии (например, по 50 записей за раз) с помощью параметра
posts_per_page. - Потеря данных без возможности восстановления. Рекомендуется делать резервные копии перед запуском.
Практические советы по безопасности и производительности
- Резервное копирование: настройте автоматический бэкап базы перед запуском удаления.
- Логирование действий: добавьте запись в лог для каждого удалённого товара/вариации.
- Оптимизация запросов: используйте
fields => 'ids'для минимизации нагрузки на базу. - Тестирование на staging-сервере: перед внедрением в продакшен проверяйте скрипт в тестовой среде.
Сравнение вариантов удаления неактивных товаров
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Ручное удаление в админке | Простота, полный контроль | Время, риск пропуска | Подходит для маленьких магазинов |
| Плагины очистки (например, WP Sweep) | Удобство, интерфейс | Могут удалять лишнее, нагрузка | Использовать с осторожностью |
| Собственный скрипт на PHP + WP-Cron | Гибкость, автоматизация | Требует навыков, настройка | Лучший вариант для крупных магазинов |