Почему важно удалять неактивные вариации в WooCommerce
В магазинах на WooCommerce со множеством товаров и вариаций часто возникают ситуации, когда часть вариаций становится неактуальной или неактивной. Это может привести к замедлению работы сайта, увеличению размера базы данных и усложнению навигации для пользователей. Автоматическое удаление таких вариаций помогает поддерживать базу данных в чистоте и повышает производительность магазина.
Как диагностировать наличие неактивных вариаций
Для начала нужно понять, сколько вариаций в вашем магазине помечены как неактивные (статус «черновик» или «отключено»). Для этого можно выполнить SQL-запрос напрямую в базе данных или через WP-CLI.
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'product_variation' AND post_status != 'publish';Если число неактивных вариаций велико (например, несколько тысяч), это повод задуматься об их удалении.
Диагностика через WP-CLI
Выполните команду:
wp post list --post_type=product_variation --field=ID --status=draft,pending,futureОна выведет список ID вариаций с неподходящим статусом.
Пошаговое решение: автоматическое удаление неактивных вариаций
Реализуем код в виде функции, которую можно добавить в functions.php темы или в собственный плагин. Скрипт удалит вариации с статусом «черновик» или «отключено», которые не обновлялись более 30 дней.
function wproot_delete_inactive_variations() {
global $wpdb;
$days = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID вариаций, которые не публикуются и не обновлялись более 30 дней
$variations = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'product_variation'
AND post_status != 'publish'
AND post_modified < %s",
$date_threshold
));
if (empty($variations)) {
return;
}
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true); // жесткое удаление
}
}
// Запускаем раз в сутки с помощью хука cron
add_action('wproot_daily_cleanup', 'wproot_delete_inactive_variations');
if (!wp_next_scheduled('wproot_daily_cleanup')) {
wp_schedule_event(time(), 'daily', 'wproot_daily_cleanup');
}Этот код:
- Ищет вариации с статусом не «publish» и датой изменения старше 30 дней.
- Удаляет их навсегда (без перемещения в корзину).
- Запускает процесс автоматически через ежедневный WP-Cron.
Как проверить, что удаление сработало
1. До запуска функции выполните SQL-запрос на подсчет неактивных вариаций (пример выше). Запомните число.
2. Запустите cron задачу вручную через WP-CLI:
wp cron event run wproot_daily_cleanup3. Выполните SQL-запрос повторно, число неактивных вариаций должно уменьшиться.
4. Проверьте в админке WooCommerce, что неактивные вариации исчезли.
Частые ошибки и как их исправить
- Удаляются нужные вариации — проверьте, что в функции фильтр на статус и дату корректный. Возможно, стоит увеличить порог дней или добавить дополнительные проверки.
- Функция не запускается по cron — проверьте, что WP-Cron активирован, и событие запланировано (через
wp cron event list). - Ошибки прав доступа — убедитесь, что пользователь, под которым запускается WP-CLI или веб-сервер, имеет права на удаление записей.
- Перемещение в корзину вместо удаления — используется
wp_delete_post($id, false), замените наtrueдля жесткого удаления.
Практические советы по безопасности и производительности
- Перед внедрением сделайте резервную копию базы данных.
- Тестируйте на staging-сайте с аналогичной базой.
- Для крупных магазинов с тысячами вариаций используйте пакетное удаление, чтобы не перегружать сервер:
foreach (array_chunk($variations, 100) as $chunk) {
foreach ($chunk as $variation_id) {
wp_delete_post($variation_id, true);
}
sleep(1); // пауза для снижения нагрузки
}- Добавьте логирование удалений в отдельный файл для аудита.
- Если используете кеширование, после удаления сбрасывайте кеш.
Сравнение вариантов удаления неактивных вариаций
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление через админку | Простота, контроль | Долго при большом объеме, риск пропуска | Небольшие магазины |
| SQL-запросы для удаления | Очень быстро | Риск ошибок при неправильном запросе, нет логики | Опытные админы, разовая чистка |
| Автоматизация через WP-Cron и PHP | Автоматизация, безопасность, гибкость | Нагрузка на сервер, требует тестирования | Большие магазины, регулярная чистка |