Что значит «неактивные вариации товаров» в WooCommerce
В WooCommerce вариации товаров — это отдельные подтовары с уникальными атрибутами (цвет, размер и т. п.). Под неактивными вариациями понимаются варианты, которые не доступны для покупки, например, со статусом "выключено" или с нулевым запасом, если магазин настроен не показывать отсутствующие позиции.
Автоматическое удаление таких вариаций помогает держать каталог в порядке, уменьшает нагрузку на базу и упрощает администрирование.
Диагностика проблемы: как определить, что есть неактивные вариации
- Проверить наличие вариаций с
post_status = 'private' или 'draft', которые не видны покупателям. - Проверить запасы вариаций: если запас равен 0 и параметр "скрывать отсутствующие товары" включен, такие вариации считаются неактивными.
- Использовать SQL-запросы для подсчёта количества вариаций с нулевым запасом и статусом публикации.
Пошаговое решение: скрипт автоматического удаления неактивных вариаций
Реализуем удаление вариаций товаров, которые не опубликованы (post_status != 'publish') или имеют запас 0.
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
function wpcodes_delete_inactive_variations() {
// Получаем все вариации с post_parent - ID товара
$args = [
'post_type' => 'product_variation',
'post_status' => ['private', 'draft', 'pending'],
'numberposts' => -1
];
$variations = get_posts($args);
foreach ($variations as $variation) {
wp_delete_post($variation->ID, true); // Полное удаление
}
// Удаляем вариации с запасом 0 и статусом publish
$args_stock = [
'post_type' => 'product_variation',
'post_status' => 'publish',
'numberposts' => -1
];
$variations_stock = get_posts($args_stock);
foreach ($variations_stock as $variation) {
$stock = get_post_meta($variation->ID, '_stock', true);
$manage_stock = get_post_meta($variation->ID, '_manage_stock', true);
if ($manage_stock === 'yes' && intval($stock) <= 0) {
wp_delete_post($variation->ID, true);
}
}
}
// Запускаем функцию по крону или вручную
add_action('init', 'wpcodes_delete_inactive_variations');Если хотите запускать удаление регулярно, создайте WP-Cron задачу:
if (! wp_next_scheduled('wpcodes_delete_variations_event')) {
wp_schedule_event(time(), 'daily', 'wpcodes_delete_variations_event');
}
add_action('wpcodes_delete_variations_event', 'wpcodes_delete_inactive_variations');Проверка результата после внедрения
- В админке WooCommerce перейдите в список вариаций товаров и проверьте, что неактивные вариации удалились.
- Выполните SQL-запрос в базе:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation' AND post_status IN ('private', 'draft', 'pending');— результат должен быть 0. - Проверьте, что товары с нулевым запасом и управлением складом не имеют вариаций в каталоге.
Частые ошибки и как их исправить
- Удаление активных вариаций по ошибке: проверьте логику условия удаления, убедитесь, что статус и запас проверяются корректно.
- Функция не запускается по крону: проверьте, что WP-Cron включён, и событие запланировано. Можно вручную вызвать функцию для теста.
- Удаление не завершилось полностью: убедитесь в правах пользователя, под которым запускается скрипт, и что нет конфликтов с плагинами безопасности.
Практические советы по безопасности и производительности
- Всегда делайте бэкап базы перед массовым удалением данных.
- Запускайте скрипт в непиковое время, чтобы избежать нагрузки.
- Добавьте логирование действий удаления — запись ID удалённых вариаций в файл или базу.
- При большом количестве вариаций используйте пакетную обработку, чтобы не превышать лимиты памяти и времени выполнения.
Сравнение способов удаления неактивных вариаций
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Простота, визуальный контроль | Трудоёмко при большом каталоге |
| Код в functions.php + WP-Cron | Автоматизация, гибкость, без плагинов | Требует навыков программирования, риск ошибок |
| Плагины для очистки WooCommerce | Простота, GUI | Могут влиять на производительность, лишний код |