WooCommerce: как массово удалить варианты товаров без продаж

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

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

Как определить вариации без продаж

Чтобы удалить варианты, сначала нужно их найти. Способов несколько, но самый надежный — проверить таблицу wp_woocommerce_order_items и wp_woocommerce_order_itemmeta, где хранятся данные о заказах.

Вот пример SQL-запроса для поиска ID вариаций, которые НЕ встречаются в заказах:

SELECT p.ID FROM wp_posts p
WHERE p.post_type = 'product_variation'
AND p.ID NOT IN (
  SELECT DISTINCT meta.meta_value
  FROM wp_woocommerce_order_itemmeta meta
  WHERE meta.meta_key = '_variation_id'
);

Этот запрос вернёт ID вариаций без продаж.

Пошаговое решение для массового удаления вариаций без заказов

1. Создайте резервную копию базы

Перед удалением — обязательно сделайте бэкап базы данных.

2. Получите список ID вариаций без продаж

Можно использовать приведённый выше SQL-запрос в phpMyAdmin или через WP CLI.

3. Удалите вариации через WP CLI

Чтобы не рисковать, удаляйте вариации через WP CLI, используя следующий скрипт:

ids=(1234 2345 3456) # замените на реальные ID
for id in "${ids[@]}"; do
  wp post delete $id --force
  echo "Удалён вариант товара с ID $id"
done

Если WP CLI использовать неудобно, можно написать PHP-скрипт для удаления.

4. PHP-скрипт для удаления вариаций без заказов

function delete_unsold_variations() {
  global $wpdb;
  $unsold_ids = $wpdb->get_col("SELECT p.ID FROM {$wpdb->posts} p
    WHERE p.post_type = 'product_variation'
    AND p.ID NOT IN (
      SELECT DISTINCT meta.meta_value
      FROM {$wpdb->prefix}woocommerce_order_itemmeta meta
      WHERE meta.meta_key = '_variation_id'
    )");

  foreach ($unsold_ids as $variation_id) {
    wp_delete_post($variation_id, true); // true для полного удаления
  }
  return count($unsold_ids);
}

add_action('admin_init', function() {
  if (current_user_can('manage_woocommerce') && isset($_GET['delete_unsold_variations'])) {
    $deleted = delete_unsold_variations();
    wp_die("Удалено вариаций без продаж: $deleted");
  }
});

Добавьте этот код в functions.php или отдельный плагин, затем вызовите URL https://ваш-сайт.ru/wp-admin/?delete_unsold_variations=1 под админом.

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

  1. Запустите SQL-запрос из первого раздела — он должен вернуть пустой список.
  2. Проверьте в админке WooCommerce список вариаций — удалённые отсутствуют.
  3. Убедитесь, что заказы не затронуты, и данные о продажах корректны.

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

  • Удаление нужных вариаций: Если вариация была в заказе, но не отображается, проверьте правильность meta_key (должно быть _variation_id).
  • Проблемы с производительностью при большом количестве вариаций: Разбивайте удаление на партии по 100–200 объектов.
  • Ошибка доступа к базе: Убедитесь, что пользователь базы данных имеет права SELECT для таблиц WooCommerce.
  • Не удаляются вариации через WP CLI: Проверьте, что WP CLI запущен в корне WordPress и что используемый пользователь имеет права на удаление.

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

  • Всегда делайте бэкап перед массовыми операциями с базой.
  • Ограничьте выполнение массовых удалений по времени и количеству, чтобы избежать таймаутов.
  • Используйте транзакции базы данных, если делаете сложные операции через PHP (через $wpdb->query('START TRANSACTION') и т.п.).
  • После удаления вариаций запустите очистку кэша и оптимизацию таблиц базы для освобождения места.
  • Если у вас много заказов, подумайте о создании индексов для полей meta_key и meta_value в woocommerce_order_itemmeta для ускорения запросов.

Сравнение способов удаления вариаций без продаж

МетодПлюсыМинусы
SQL-запрос + ручное удалениеПростота, не требует кодаРучной процесс, риск ошибки при удалении
WP CLI скриптАвтоматизация, быстрое выполнениеТребует доступа к серверу и знаний WP CLI
PHP-скрипт с wp_delete_post()Можно интегрировать в админку, безопаснееМожет быть медленнее, требует корректного кода

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как создать автоматический импорт постов в WordPress из RSS канала
04.03.2026
Оптимизация базы данных WordPress без потери данных: практические методы
15.12.2025
Как создать автоматическое сохранение через AJAX в WordPress
02.12.2025
WooCommerce: как добавить поле срока годности в корзину и оформить заказ
06.06.2026
Как создать автоматический подбор тегов в WordPress с примерами кода
23.03.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее