Диагностика проблемы с неиспользуемыми вариациями в WooCommerce
Магазины на WooCommerce часто сталкиваются с тем, что после продажи вариаций товаров остаются в базе без активности. Эти «мертвые» вариации накапливаются и приводят к замедлению работы сайта и усложнению управления каталогом. Проблема особенно заметна при большом количестве товаров с вариациями (цвет, размер и т.п.), когда многие варианты больше не актуальны.
Как понять, что вариации неиспользуемые? Основные признаки:
- Вариации не продаются длительное время (например, более 6 месяцев);
- Отсутствуют заказы с этими вариациями;
- В пользовательских фильтрах и страницах товара вариации не отображаются;
- Администратор магазина не планирует пополнять эти вариации или обновлять их.
Пошаговое решение: автоматическое удаление неиспользуемых вариаций через код
1. Создаем функцию для поиска неиспользуемых вариаций
Основной критерий — вариации, у которых нет связанных заказов и которые были созданы или обновлены более 6 месяцев назад. Используем WP_Query и прямые запросы к базе для проверки заказов.
function get_unused_variations( $months = 6 ) {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$months} months"));
// Получаем ID вариаций товаров (post_type = 'product_variation') старше даты
$args = [
'post_type' => 'product_variation',
'post_status' => 'publish',
'date_query' => [
['before' => $date_threshold],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$variations = get_posts( $args );
$unused_variations = [];
foreach ( $variations as $var_id ) {
// Проверяем, есть ли заказы с данной вариацией
$order_items = $wpdb->get_var( $wpdb->prepare(
"SELECT COUNT(oi.order_item_id) FROM {$wpdb->prefix}woocommerce_order_items oi
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
WHERE oi.order_item_type = 'line_item' AND oim.meta_key = '_variation_id' AND oim.meta_value = %d",
$var_id
));
if ( !$order_items ) {
$unused_variations[] = $var_id;
}
}
return $unused_variations;
}2. Функция удаления найденных вариаций
Для удаления используем стандартную функцию wp_delete_post с параметром true для полного удаления без перемещения в корзину.
function delete_unused_variations( $variation_ids ) {
foreach ( $variation_ids as $var_id ) {
wp_delete_post( $var_id, true );
}
}3. Запускаем процесс очистки по расписанию (WP-Cron)
Чтобы автоматизировать, регистрируем ежемесячное задание, которое вызывает удаление неиспользуемых вариаций.
add_action( 'wp_loaded', function() {
if ( ! wp_next_scheduled( 'delete_unused_variations_cron' ) ) {
wp_schedule_event( time(), 'monthly', 'delete_unused_variations_cron' );
}
});
add_action( 'delete_unused_variations_cron', function() {
$unused = get_unused_variations(6); // 6 месяцев
if ( ! empty( $unused ) ) {
delete_unused_variations( $unused );
}
});Проверка результата после внедрения
- Запустите функцию вручную через WP-CLI или временно добавьте вызов в
functions.phpи проверьте, что вариации удалились. - Посмотрите в админке WooCommerce — количество вариаций уменьшилось.
- Проверьте журнал заказов — не должно быть удалено вариаций с заказами.
- Мониторьте скорость загрузки страниц с товарами до и после очистки.
Частые ошибки и как их исправить
- Удаление вариаций с активными заказами: может случиться, если запрос к базе не учитывает все статусы заказов. Решение — убедиться, что проверка заказов учитывает только завершённые и оплаченные заказы.
- Не срабатывает WP-Cron: часто из-за отсутствия посещений сайта или блокировок. Для надежности используйте системный cron или запускайте вручную.
- Удаление не тех вариаций: проверьте логику даты и условия выборки, убедитесь, что дата обновления вариации корректно отображает актуальность.
- Проблемы с производительностью запроса: при большом количестве вариаций запросы могут быть медленными. Оптимизируйте через индексы в базе и ограничение выборки по частям.
Практические советы по безопасности и производительности
- Перед автоматическим удалением создавайте резервные копии базы данных.
- Добавьте логирование удаляемых вариаций для возможности отката.
- Разбейте процесс удаления на партии по 50-100 вариаций, чтобы избежать таймаутов.
- Используйте транзакции базы данных при массовом удалении для целостности данных.
- Для запуска WP-Cron используйте альтернативные методы, например, системный cron на сервере.
Сравнение вариантов удаления неиспользуемых вариаций
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление через админку | Простой контроль | Трудоемко при большом количестве | Малые магазины, редкие очистки |
| Автоматическое удаление через WP-Cron + код | Автоматизация, масштабируемость | Нужна внимательная настройка и тестирование | Средние и крупные магазины с большим каталогом |
| Плагины очистки WooCommerce | Готовые решения, UI | Иногда избыточны, влияют на производительность | Для тех, кто не хочет программировать |