Проблема: почему стоит удалять неактивные вариации товаров?
В интернет-магазинах на WooCommerce с большим ассортиментом товаров часто появляются вариации, которые перестали использоваться — устаревшие цвета, размеры или опции. Эти вариации занимают место в базе данных, замедляют работу сайта и усложняют управление товарами.
Автоматическое удаление неактивных вариаций помогает поддерживать базу данных в чистоте, ускоряет загрузку страниц и снижает нагрузку на сервер.
Диагностика проблемы: как определить неактивные вариации?
Неактивные вариации — это вариации, которые:
- Не используются в заказах и не продаются;
- Имеют статус «черновик» или «не опубликованы»;
- Не отображаются на сайте;
- Их атрибуты не совпадают с текущими параметрами товара.
Для точной диагностики можно выполнить SQL-запрос к базе данных, чтобы найти вариации, у которых нет заказов и которые неактивны:
SELECT p.ID, p.post_title FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_name = p.post_title
WHERE p.post_type = 'product_variation'
AND p.post_status != 'publish'
AND oi.order_item_name IS NULL;Этот запрос покажет вариации, которые не опубликованы и не связаны с заказами.
Пошаговое решение: как автоматически удалить неактивные вариации через код
Лучший способ — добавить кастомный скрипт, который будет запускаться по крону или вручную, проверять вариации и удалять неактивные.
Шаг 1. Создать функцию для удаления неактивных вариаций
function delete_inactive_product_variations() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'post_status' => ['draft', 'pending', 'private'],
'fields' => 'ids',
];
$variations = get_posts($args);
if (empty($variations)) {
return 'No inactive variations found.';
}
$deleted = 0;
foreach ($variations as $variation_id) {
// Проверяем, есть ли заказы с этой вариацией
global $wpdb;
$order_count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->prefix}woocommerce_order_items oi
JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
WHERE oim.meta_key = '_variation_id' AND oim.meta_value = %d",
$variation_id
));
if (!$order_count) {
wp_delete_post($variation_id, true); // Полное удаление
$deleted++;
}
}
return "Deleted {$deleted} inactive variations.";
}Шаг 2. Запуск функции вручную или по крону
Для разового запуска добавьте в functions.php или плагин:
add_action('admin_init', function() {
if (isset($_GET['delete_inactive_variations'])) {
$result = delete_inactive_product_variations();
echo '<div class="notice notice-success is-dismissible"><p>' . esc_html($result) . '</p></div>';
}
});Затем вызовите в браузере https://site.ru/wp-admin/?delete_inactive_variations=1 (замените site.ru на ваш домен).
Для автоматизации можно добавить WP-Cron событие:
if (! wp_next_scheduled('delete_inactive_variations_event')) {
wp_schedule_event(time(), 'daily', 'delete_inactive_variations_event');
}
add_action('delete_inactive_variations_event', 'delete_inactive_product_variations');Проверка результата после внедрения
- Перейдите в раздел «Товары → Вариации» — проверьте, что неактивные вариации удалены.
- Выполните SQL-запрос из раздела диагностики — количество неактивных вариаций должно быть нулевым.
- Проверьте, что активные вариации и заказы с ними не затронуты.
Частые ошибки и как их исправить
- Удаляются активные вариации. Проверьте логику проверки заказов и статусов. Не удаляйте вариации с «publish» статусом.
- Функция не запускается по крону. Убедитесь, что на сайте работает WP-Cron (проверьте
wp-cron.php), либо настройте системный cron. - Удаление не происходит из-за прав. Проверьте, что скрипт запущен с правами администратора и имеет доступ к базе данных.
Практические советы по безопасности и производительности
- Перед массовым удалением сделайте резервную копию базы данных.
- Используйте
wp_delete_post(..., true)для полного удаления, чтобы не оставлять мусор в БД. - Ограничьте запуск функции только для админов, чтобы исключить случайный запуск.
- Если вариаций много, разбивайте удаление на партии, чтобы избежать таймаутов.
Сравнение вариантов удаления неактивных вариаций
| Вариант | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление в админке | Просто, не требует кода | Долго, ошибочно можно удалить нужные вариации | Малое количество вариаций |
| Кастомный код с проверкой заказов | Автоматизация, точечное удаление | Требует навыков, возможны ошибки при неправильной логике | Средние и крупные магазины |
| Плагины очистки WooCommerce | Удобный интерфейс, часто расширенные функции | Могут быть платными, не всегда гибкие | Для пользователей без навыков разработки |