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

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

В WooCommerce часто возникают ситуации, когда у товаров с вариациями остаются пустые или неактивные варианты, которые не имеют цены или остатков. Это приводит к путанице в админке, увеличению нагрузки на базу данных и ухудшению пользовательского опыта на фронтенде. Чтобы убедиться, что у вас есть такие варианты, выполните следующие шаги:

  • Перейдите в раздел Товары → Все товары в админке WordPress.
  • Откройте товар с вариациями и перейдите во вкладку Вариации.
  • Проверьте варианты, у которых отсутствует цена или количество на складе равно нулю.
  • Проверьте в базе данных, есть ли такие варианты с помощью SQL-запроса (через phpMyAdmin или WP CLI):
SELECT ID, post_title FROM wp_posts WHERE post_parent = <ID_товара> AND post_type = 'product_variation';

Если среди них есть варианты без цены или с нулевым количеством, то их стоит очистить автоматически, чтобы не держать в базе ненужные данные.

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

1. Создаём функцию для удаления пустых вариантов

Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:

function wpid_delete_empty_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'post_status'    => ['publish', 'private'],
    ];
    $variations = get_posts($args);

    foreach ($variations as $variation) {
        $variation_id = $variation->ID;
        $price = get_post_meta($variation_id, '_price', true);
        $stock = get_post_meta($variation_id, '_stock', true);

        // Проверяем: пустая цена и/или нет в наличии
        if (($price === '' || $price === false) || ($stock === '' || intval($stock) <= 0)) {
            wp_delete_post($variation_id, true);
        }
    }
}

2. Запускаем очистку вручную через админку

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

add_action('admin_menu', function() {
    add_submenu_page(
        'woocommerce',
        'Очистка пустых вариантов',
        'Очистка пустых вариантов',
        'manage_woocommerce',
        'wpid-clean-empty-variations',
        'wpid_render_clean_variations_page'
    );
});

function wpid_render_clean_variations_page() {
    if (isset($_POST['wpid_clean_variations_nonce']) && wp_verify_nonce($_POST['wpid_clean_variations_nonce'], 'wpid_clean_variations_action')) {
        wpid_delete_empty_variations();
        echo '<div class="updated notice"><p>Пустые варианты удалены.</p></div>';
    }
    echo '<h1>Очистка пустых вариантов WooCommerce</h1>';
    echo '<form method="post">';
    wp_nonce_field('wpid_clean_variations_action', 'wpid_clean_variations_nonce');
    echo '<input type="submit" class="button button-primary" value="Удалить пустые варианты" />';
    echo '</form>';
}

3. Автоматизация очистки с помощью WP Cron

Чтобы не запускать вручную, можно добавить планировщик задач:

if (!wp_next_scheduled('wpid_daily_clean_empty_variations')) {
    wp_schedule_event(time(), 'daily', 'wpid_daily_clean_empty_variations');
}

add_action('wpid_daily_clean_empty_variations', 'wpid_delete_empty_variations');

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

  • После запуска функции вручную или по расписанию проверьте раздел «Вариации» у товаров — пустых вариантов не должно остаться.
  • Проверьте базу данных, выполнив SQL-запрос из раздела диагностики, чтобы убедиться, что пустые варианты удалены.
  • Проверьте фронтенд: в карточках товаров не должно отображаться пустых или неактивных вариантов.
  • В админке WooCommerce → Отчёты → Товары убедитесь, что статистика и фильтры работают корректно без пустых данных.

Частые ошибки и способы их устранения

  • Ошибка: Пустые варианты не удаляются.
    Причина: Неправильные ключи метаданных (_price, _stock) или вариации имеют нестандартный статус.
    Решение: Проверьте в базе мета-ключи, используйте WP CLI для диагностики, скорректируйте фильтр статусов в коде.
  • Ошибка: Удаляются нужные варианты.
    Причина: Логика проверки слишком жёсткая (например, удаление при нулевом остатке, хотя товар может быть под заказ).
    Решение: Добавьте дополнительные условия, например проверку мета-поля _manage_stock или статуса варианта.
  • Ошибка: Скрипт тормозит сайт при большом количестве вариантов.
    Причина: Обработка всех вариантов за один запрос.
    Решение: Реализуйте пакетную обработку с лимитом в 100-200 записей за раз.

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

  • Используйте wp_delete_post($variation_id, true) для полного удаления с метаданными, а не Trash, чтобы не засорять базу.
  • Добавьте nonce и проверку прав доступа для ручного запуска функции, чтобы избежать несанкционированного удаления.
  • При планировании задачи через WP Cron учитывайте, что при слабом трафике cron может не срабатывать — можно настроить системный cron или использовать сторонние сервисы.
  • Для больших магазинов с тысячами вариантов лучше выполнять очистку по частям с использованием offset и limit, чтобы не превышать лимиты памяти и времени выполнения скрипта.

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

Метод Плюсы Минусы Рекомендации
Ручной запуск через админку Простой контроль, подходит для разовых очисток Неудобно для регулярного обслуживания Использовать при редких проверках
WP Cron (ежедневно) Автоматизация, регулярный контроль состояния Может не сработать при низком трафике Настроить системный cron, если важна точность
Ручное удаление через SQL Быстро и мощно Риск повредить базу, требует знаний SQL Использовать только для опытных администраторов
Как удалить удалённых пользователей WordPress без возможности восстановления
06.12.2025
Как настроить автоматическое удаление старых комментариев в WordPress
05.04.2026
WooCommerce: как автоматически удалять заказы по статусу после оплаты
21.06.2026
WooCommerce: как автоматически удалять заказы по статусу после оплаты
31.05.2026
Как удалить неиспользуемые типы записей в WooCommerce из базы данных
18.06.2026