Почему нужно удалять неактивные вариации товаров в WooCommerce
На больших WooCommerce-магазинах с вариативными товарами часто накапливается множество вариаций, которые больше не используются или неактивны. Они замусоривают базу данных, замедляют загрузку страниц и усложняют администрирование. Удаление таких вариаций вручную занимает много времени и неэффективно.
Автоматизация очистки базы от неактивных вариаций поможет поддерживать магазин в порядке и улучшит производительность без использования сторонних плагинов.
Диагностика: как определить неактивные вариации товаров
В WooCommerce вариации — это дочерние записи типа product_variation с метаполем _stock_status. Вариация считается неактивной, если:
- статус товара —
draft,pendingилиtrash; - наличие
_stock_statusравноoutofstockи товар давно не покупался; - время последнего изменения вариации превышает определённый порог (например, 180 дней).
Для диагностики можно выполнить SQL-запрос, чтобы вывести список вариаций, которые неактивны и потенциально подлежат удалению:
SELECT p.ID, p.post_title, p.post_status, pm.meta_value AS stock_status, p.post_modified FROM wp_posts p INNER JOIN wp_postmeta pm ON p.ID = pm.post_id WHERE p.post_type = 'product_variation' AND pm.meta_key = '_stock_status' AND (p.post_status IN ('draft', 'pending', 'trash') OR pm.meta_value = 'outofstock') ORDER BY p.post_modified ASC LIMIT 100;Этот запрос покажет первые 100 вариаций с указанными статусами и состоянием склада. Если в списке много записей, стоит автоматизировать их удаление.
Пошаговое решение: автоматическое удаление неактивных вариаций через код
1. Создание функции удаления вариаций старше 180 дней
Добавьте следующий код в functions.php вашей темы или в кастомный плагин:
function wc_delete_inactive_variations() {
global $wpdb;
$days = 180; // Порог в днях
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID вариаций, которые неактивны и старше порога
$variation_ids = $wpdb->get_col(
$wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
WHERE p.post_type = 'product_variation'
AND pm.meta_key = '_stock_status'
AND (p.post_status IN ('draft', 'pending', 'trash') OR pm.meta_value = 'outofstock')
AND p.post_modified < %s",
$date_threshold
)
);
if (!empty($variation_ids)) {
foreach ($variation_ids as $variation_id) {
wp_delete_post($variation_id, true); // принудительное удаление без перемещения в корзину
}
}
}2. Запуск функции через WP-Cron раз в неделю
Чтобы регулярно очищать базу, создайте событие WP-Cron:
if (!wp_next_scheduled('wc_delete_inactive_variations_weekly')) {
wp_schedule_event(time(), 'weekly', 'wc_delete_inactive_variations_weekly');
}
add_action('wc_delete_inactive_variations_weekly', 'wc_delete_inactive_variations');3. Ручной запуск для проверки
Для проверки можно вызвать функцию вручную в админке, например, через панель WP-CLI или подключив временно вызов функции в functions.php:
// wc_delete_inactive_variations(); // раскомментировать для теста и удалить послеПроверка результата после внедрения
- Запустите функцию вручную и проверьте количество удалённых вариаций в административной части WooCommerce.
- Проверьте, что количество вариаций в базе уменьшилось (через SQL-запрос или в админке).
- Убедитесь, что активные и недавно используемые вариации остались на месте.
- Проверьте логи ошибок и работоспособность сайта после автоматического запуска cron.
Частые ошибки и как их исправить
- Функция ничего не удаляет: Проверьте правильность условий выборки и наличие вариаций, соответствующих критериям. Попробуйте вывести
$variation_idsдля отладки. - Удаляются нужные вариации: Проверьте корректность даты и статуса. Возможно, стоит увеличить порог в днях или добавить дополнительные проверки.
- WP-Cron не срабатывает: Убедитесь, что на сайте регулярно посещают, либо настройте системный cron для запуска WP-Cron.
- Ошибки при удалении: Проверьте права пользователя, под которым выполняется скрипт, и возможность удаления постов.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($id, true)с параметромtrue, чтобы избежать накопления «корзины» и полностью удалить вариацию. - Ограничьте количество удаляемых записей за один запуск, чтобы избежать таймаутов. Например, добавьте
LIMIT 50в SQL-запрос и повторяйте вызов cron, пока есть что удалять. - Перед массовым удалением сделайте резервную копию базы.
- Проверяйте совместимость с другими плагинами, которые могут зависеть от вариаций.
- Для больших магазинов рассмотрите возможность выполнения удаления в несколько этапов с помощью AJAX или WP-CLI для минимизации нагрузки.
Сравнение вариантов удаления неактивных вариаций
| Метод | Плагин | Код | Компромисс |
|---|---|---|---|
| Удаление вручную | — | — | Очень трудозатратно, риск пропуска |
| Плагин очистки WooCommerce | Да (например, WP Optimize) | — | Удобно, но нагрузка и зависимости |
| Автоматизация через кастомный код | Нет | Да, гибко и без лишних плагинов | Требует навыков разработки и тестирования |