Что такое неактивные вариации и почему их нужно удалять
В WooCommerce вариации товаров — это отдельные дочерние записи основного продукта, которые позволяют управлять разными модификациями (размер, цвет, материал и т.д.). Иногда вариации становятся неактивными — например, если они больше не доступны, сняты с продажи или устарели. Накопление таких вариаций приводит к засорению базы данных, замедлению админки и увеличению нагрузки на сайт.
Удаление неактивных вариаций — важная задача оптимизации WooCommerce, особенно в крупных магазинах с сотнями и тысячами товаров. В этой статье разберём, как автоматически находить и безопасно удалять такие вариации с помощью кода.
Диагностика: как понять, что вариаций слишком много и они неактивны
Для начала нужно определить, какие вариации считать неактивными. Обычно это вариации с:
- статусом
draftилиtrash, которые не отображаются на сайте; - отсутствием цены или с ценой 0 (если это не бесплатный товар);
- отсутствием запасов (если используется управление запасами);
- отсутствием атрибутов или с некорректными данными.
Проверить количество вариаций по статусам можно SQL-запросом к базе данных (через phpMyAdmin или WP CLI):
SELECT post_status, COUNT(*) as count FROM wp_posts WHERE post_type = 'product_variation' GROUP BY post_status;Если видите много вариаций в статусах draft или trash, это повод для очистки.
Пошаговое решение: код для автоматического удаления неактивных вариаций
Ниже пример функции, которую можно добавить в functions.php вашей темы или в отдельный плагин. Она удаляет вариации с заданным статусом и без цены.
function wpset_delete_inactive_variations() {
// Параметры для выборки вариаций
$args = [
'post_type' => 'product_variation',
'post_status' => ['draft', 'trash'],
'posts_per_page' => -1,
'fields' => 'ids',
];
$variations = get_posts($args);
if(empty($variations)) {
return 'Нет неактивных вариаций для удаления';
}
$deleted_count = 0;
foreach($variations as $variation_id) {
$price = get_post_meta($variation_id, '_price', true);
// Удаляем только если цена не установлена или 0
if(empty($price) || $price == 0) {
wp_delete_post($variation_id, true); // true - принудительное удаление
$deleted_count++;
}
}
return "Удалено вариаций: {$deleted_count}";
}
// Запуск функции вручную для теста
add_action('admin_init', function() {
if(current_user_can('administrator') && isset($_GET['delete_inactive_variations'])) {
$result = wpset_delete_inactive_variations();
echo '<div class="notice notice-success is-dismissible"><p>' . esc_html($result) . '</p></div>';
}
});Для вызова очистки достаточно зайти в админку с параметром ?delete_inactive_variations=1 в URL, например: https://ваш-сайт.ru/wp-admin/?delete_inactive_variations=1
Как проверить, что удаление сработало
- Повторно выполните SQL-запрос из раздела диагностики — количество вариаций в статусах
draftиtrashдолжно уменьшиться. - Проверьте в админке WooCommerce — в списке вариаций не должно отображаться удалённых позиций.
- Просмотрите страницу с сообщением об успешном удалении, если вызываете функцию вручную.
Частые ошибки при удалении вариаций и как их избежать
- Удаление активных вариаций: Убедитесь, что фильтр выбирает только вариации со статусом
draftилиtrash, иначе можете случайно стереть продающиеся товары. - Неудаление из-за кеша: После удаления почистите кеш сайта и браузера, чтобы увидеть обновления.
- Отсутствие резервной копии: Обязательно сделайте бэкап базы данных перед массовым удалением.
- Запуск на продакшене без теста: Проверьте код сначала на тестовом сайте.
Практические советы по безопасности и производительности
- Для регулярной автоматизации удалений используйте WP-Cron с таймером, чтобы не запускать всю выборку в пиковую нагрузку.
- Добавьте логирование удалённых вариаций в отдельный лог-файл для аудита.
- Используйте
wp_delete_post( $post_id, true )с параметромtrueдля полного удаления, а не перемещение в корзину, чтобы не накапливать мусор. - Ограничьте выборку небольшими порциями (
posts_per_page100 или 200), чтобы избежать превышения лимитов памяти.
Сравнение вариантов удаления неактивных вариаций
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление через админку | Просто, без кода | Медленно при большом количестве, риск пропуска | Для единичных случаев |
| Код в functions.php | Автоматизация, точный контроль | Требует базовых знаний PHP | Регулярная очистка и большие магазины |
| Плагины оптимизации WooCommerce | Готовые решения с интерфейсом | Могут быть платными, нагрузка | Если нужна комплексная оптимизация |