Диагностика проблемы с накоплением старого контента и вариаций в WooCommerce
В магазинах на WooCommerce со временем накапливаются устаревшие или неактивные товары, а также лишние вариации, которые замедляют работу сайта и усложняют управление каталогом. Основные симптомы:
- Замедление загрузки страниц каталога и админки;
- Большой объем базы данных и бэкапов;
- Ошибки в отображении товаров из-за конфликтующих вариаций;
- Проблемы с SEO из-за большого числа неактивных страниц;
- Ручное удаление занимает много времени и рискованно.
Как автоматически удалять старые товары и вариации в WooCommerce — пошаговое решение
1. Определяем критерии «старого» контента
В большинстве случаев под «старым» понимаются товары без продаж или без обновлений более 6–12 месяцев, а вариации — неиспользуемые или с пустыми атрибутами.
2. Создаем WP-Cron задачу для автоматизации удаления
Добавим в functions.php тему или в отдельный плагин следующий код, чтобы запускать очистку еженедельно:
if ( ! wp_next_scheduled( 'wc_auto_delete_old_products' ) ) {
wp_schedule_event( time(), 'weekly', 'wc_auto_delete_old_products' );
}
add_action( 'wc_auto_delete_old_products', 'wc_delete_old_products_and_variations' );
function wc_delete_old_products_and_variations() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'date_query' => [
'before' => date( 'Y-m-d', strtotime( '-6 months' ) ),
],
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '=',
],
],
'fields' => 'ids',
];
$old_products = get_posts( $args );
foreach ( $old_products as $product_id ) {
wp_delete_post( $product_id, true );
}
}
Этот код удалит товары, которые не обновлялись более 6 месяцев и находятся в статусе "нет в наличии".
3. Удаление старых вариаций товаров
Для вариаций добавим отдельную функцию, которая удалит вариации без атрибутов или с пустыми значениями:
function wc_delete_old_variations() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_variation_description',
'value' => '',
'compare' => '=',
],
],
'fields' => 'ids',
];
$variations = get_posts( $args );
foreach ( $variations as $variation_id ) {
wp_delete_post( $variation_id, true );
}
}
add_action( 'wc_auto_delete_old_products', 'wc_delete_old_variations' );
Проверка результата после внедрения автоматического удаления
Чтобы убедиться, что удаление работает корректно:
- Выполните вручную задачу WP-Cron через WP-CLI или плагин WP Crontrol:
wp cron event run wc_auto_delete_old_products - Проверьте, что в админке WooCommerce пропали старые товары и вариации;
- Просмотрите логи сервера и базы данных на предмет ошибок удаления;
- Проверьте скорость загрузки страниц каталога и админки до и после;
- Резервное копирование перед тестами обязательно!
Частые ошибки и как их исправить
- Удаляются нужные товары: Проверьте параметры
date_queryиmeta_query— они должны точно отражать логику выбора. Лучше сначала логировать ID на удаление.
Решение: заменитеwp_delete_postна логирование в файл или опцию и проверьте список. - Задача WP-Cron не запускается: Убедитесь, что на сервере работает WP-Cron, или настройте системный Cron для вызова
wp-cron.php.
Решение: используйте плагин WP Crontrol для диагностики и запуска событий. - Не удаляются вариации: Возможно, мета-ключ
_variation_descriptionне подходит для вашей темы или плагинов.
Решение: используйте отладчик мета-данных, чтобы подобрать правильный ключ и условия.
Практические советы по безопасности и производительности
- Перед удалением данных делайте резервные копии базы и файлов.
- При большом объеме товаров используйте пакетное удаление с лимитом и паузами, чтобы избежать таймаутов.
- Для мониторинга используйте логирование ID удаляемых товаров в отдельный файл.
- Если у вас есть плагин Clearfy Pro от WPShop, используйте его инструменты для удаления дублей и оптимизации базы, чтобы дополнительно очистить WooCommerce.
- Оптимизируйте запросы с помощью индексов в базе и минимизируйте мета-запросы.
Сравнение подходов: плагин vs. кастомный код
| Критерий | Плагин | Кастомный код | Компромисс |
|---|---|---|---|
| Простота внедрения | Высокая — готовые настройки | Средняя — требует знаний PHP и WP API | Использовать готовый код из статьи и адаптировать |
| Гибкость | Ограничена функционалом плагина | Полная — можно задать любые условия | Комбинировать код и плагины для расширения |
| Производительность | Может нагружать сайт дополнительными запросами | Оптимизируемые запросы и Cron-задачи | Оптимизировать код и настроить Cron |
| Безопасность | Зависит от качества плагина | Контроль над удалением и логированием | Добавлять логи и резервные копии |