WooCommerce: как автоматически удалять пустые варианты товаров

Диагностика проблемы с пустыми вариантами в WooCommerce

В интернет-магазинах на WooCommerce часто возникают ситуации, когда после массового импорта или обновления товаров остаются пустые варианты (вариации) без набора атрибутов или с нулевым запасом, которые не должны отображаться покупателям. Это не только портит пользовательский опыт, но и может привести к ошибкам в работе магазина и увеличению нагрузки на базу данных.

Для диагностики проблемы выполните следующие шаги:

  • Откройте раздел Товары > Все товары в админке.
  • Выберите товар с вариациями и перейдите в Вариации.
  • Проверьте, есть ли пустые варианты без атрибутов или с количеством 0.
  • Используйте SQL-запрос для поиска пустых вариаций:
    SELECT p.ID, p.post_parent FROM wp_posts p
    WHERE p.post_type = 'product_variation'
    AND (p.post_excerpt = '' OR p.post_excerpt IS NULL);
    Замените префикс wp_ на ваш, если он отличается.

Пошаговое решение: автоматическое удаление пустых вариаций

Рекомендуется создать небольшой плагин или добавить код в файл functions.php вашей дочерней темы, который будет запускаться по расписанию через WP-Cron или вручную очищать пустые варианты.

Код для удаления пустых вариаций

function wc_delete_empty_variations() {
    global $wpdb;
    // Получаем ID вариаций без атрибутов и с нулевым запасом
    $variation_ids = $wpdb->get_col(
        "SELECT p.ID FROM {$wpdb->posts} p
         LEFT JOIN {$wpdb->postmeta} pm ON (p.ID = pm.post_id AND pm.meta_key = '_stock')
         WHERE p.post_type = 'product_variation'
         AND (pm.meta_value = '0' OR pm.meta_value IS NULL)
         AND p.post_excerpt = ''"
    );

    if (!empty($variation_ids)) {
        foreach ($variation_ids as $vid) {
            wp_delete_post($vid, true); // принудительное удаление без перемещения в корзину
        }
    }
}

// Запуск очистки вручную через админку
add_action('admin_post_wc_delete_empty_variations', 'wc_delete_empty_variations');

Добавление Cron-задачи для автоматизации

Чтобы периодически запускать удаление, добавим задачу в WP-Cron:

function wc_schedule_empty_variations_cleanup() {
    if (!wp_next_scheduled('wc_daily_empty_variations_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wc_daily_empty_variations_cleanup');
    }
}
add_action('wp', 'wc_schedule_empty_variations_cleanup');

add_action('wc_daily_empty_variations_cleanup', 'wc_delete_empty_variations');

Проверка результата после внедрения

  • Перейдите в раздел Товары > Все товары, выберите товар с вариациями и убедитесь, что пустые варианты исчезли.
  • Запустите вручную функцию, если добавили админский экшен, перейдя по URL https://ваш_сайт/wp-admin/admin-post.php?action=wc_delete_empty_variations (требуется авторизация администратора).
  • Используйте SQL-запрос из шага диагностики, чтобы убедиться, что пустых вариаций больше нет.
  • Проверьте работу магазина на фронтенде — пустые варианты не должны отображаться в форме выбора вариаций.

Частые ошибки и их исправление

  • Неправильный префикс таблиц в SQL-запросах — всегда используйте $wpdb->posts и $wpdb->postmeta, а не «wp_» напрямую.
  • Удаление не тех вариантов — перед массовым удалением сделайте резервную копию базы и протестируйте выборку через SQL.
  • Код не выполняется — убедитесь, что функция подключена и WP-Cron активен (проверьте через wp cron event list или плагины типа WP Crontrol).
  • Пустые варианты не удаляются — возможно, у вариаций заполнен post_excerpt или запас не равен нулю. Измените условие в SQL-запросе под ваши данные.

Практические советы по безопасности и производительности

  • Запускайте удаление в ночное время, чтобы избежать нагрузки в часы пик.
  • Ограничьте количество удаляемых вариаций за один запуск, если их очень много, чтобы не перегружать сервер:
function wc_delete_empty_variations_batch($batch_size = 50) {
    global $wpdb;
    $variation_ids = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT p.ID FROM {$wpdb->posts} p
             LEFT JOIN {$wpdb->postmeta} pm ON (p.ID = pm.post_id AND pm.meta_key = '_stock')
             WHERE p.post_type = 'product_variation'
             AND (pm.meta_value = '0' OR pm.meta_value IS NULL)
             AND p.post_excerpt = ''
             LIMIT %d",
             $batch_size
        )
    );

    if (!empty($variation_ids)) {
        foreach ($variation_ids as $vid) {
            wp_delete_post($vid, true);
        }
    }
}
  • Используйте WP Nonces или проверки прав доступа, если добавляете ручной запуск через HTTP-запросы.
  • Регулярно делайте резервные копии базы перед массовыми изменениями.

Сравнение вариантов удаления пустых вариаций

СпособПреимуществаНедостаткиКомпромисс
Ручное удаление через админку Простота, без кода Трудоемко при большом объеме Для единичных случаев
SQL-запросы в базе Быстрое удаление Риск ошибок, требует навыков SQL Использовать только с резервными копиями
Автоматизация через код и WP-Cron Полная автоматизация, можно настроить расписание Требует программирования и тестирования Оптимально для магазинов с большим количеством товаров
Как создать собственный REST API в WordPress
13.11.2025
Автоматическое создание копий постов в WordPress
01.04.2026
WooCommerce: как автоматически обновлять статус заказа после успешной оплаты
03.06.2026
Как создать автоматический импорт сообщений из Telegram в WordPress
05.04.2026
WooCommerce: автоматическая обработка возвратов с помощью хуков
12.07.2026