Skip to content

Всё для WordPress, веб-разработки — и не только

🗑 Массовое удаление продуктов и атрибутов WooCommerce: SQL, WP-CLI и плагины

🗑 Массовое удаление продуктов и атрибутов WooCommerce: SQL, WP-CLI и плагины

Вы заходите в админку WooCommerce и видите: три тысячи товаров, половина, дубли из кривого импорта, атрибуты «Цвет 1», «Цвет 2», «Размер_copy_2023». Интерфейс «Товары → выбрать все → Удалить» уходит в таймаут на второй сотне. Знакомо? Массовая чистка каталога, задача, с которой сталкивается каждый, кто пробовал мигрировать магазин, сливать тестовую базу с боевой или перезапускать витрину после ребрендинга.

Проблема упирается в устройство WooCommerce: продукты рассыпаны по четырём таблицам, wp_posts, wp_postmeta, wp_term_relationships и wp_term_taxonomy, а атрибуты хранятся ещё в трёх. Просто кликнуть «Удалить всё» не выйдет, движок упадет раньше, чем дойдет до конца списка. Нужен инструмент, который бьёт в обход интерфейса, напрямую в базу или через CLI.

Ниже, три рабочих способа, от радикального SQL до безопасных плагинов. С бэкапом, с проверкой префиксов и с пониманием, что именно происходит в каждой таблице.

💡 Быстрый обзор:

  • Сделайте полный дамп базы, DELETE необратим, корзины нет
  • Проверьте префикс таблиц в wp-config.php и подставьте его вместо wp_
  • Выполните SQL-команды каскадно: атрибуты → продукты → осиротевшая постмета
  • Если есть SSH, WP-CLI справится одной командой и вызовет нужные хуки
  • Для продакшен-магазина без опыта SQL, плагины с кнопкой «Удалить» безопаснее

Меры предосторожности: бэкап и префикс

Любая SQL-команда, меняющая содержимое таблиц WordPress, необратима. DELETE не спрашивает подтверждения, не кладёт запись в корзину, строка исчезает мгновенно и навсегда. Правило номер один: сделайте полный бэкап базы до того, как запустите любой из запросов ниже.

Надёжнее всего, выгрузить дамп через phpMyAdmin: вкладка «Экспорт» → формат SQL → сжать gzip. Или через хостинг-панель (cPanel → Backup → Database). Для тех, кто работает из командной строки:

1mysqldump -u username -p database_name > backup_$(date +%Y%m%d).sql

Второй момент: все запросы ниже используют стандартный префикс wp_. Если при установке WordPress вы меняли префикс на wpx_, store_ или любой другой, замените wp_ во всех командах на свой. Реальный префикс лежит в wp-config.php, строка $table_prefix. Проверили? Теперь к делу.

Способ 1: SQL-команды в phpMyAdmin, полный контроль

Самый быстрый и радикальный метод. Подходит, когда нужно вычистить сотни или тысячи записей за один проход, а стандартный интерфейс WooCommerce падает по таймауту. Все запросы выполняются в phpMyAdmin на вкладке «SQL», по одному, в строгой последовательности.

Удаление атрибутов WooCommerce

Атрибуты живут сразу в трёх таблицах: wp_terms, wp_term_taxonomy и wp_term_relationships. От обычных категорий и тегов они отличаются префиксом pa_ в поле taxonomy, сокращение от «product attribute». Удалять нужно каскадно, начиная с термов и заканчивая связями:

1DELETE FROM wp_terms WHERE term_id IN
2(SELECT term_id FROM wp_term_taxonomy WHERE taxonomy LIKE 'pa_%');
3
4DELETE FROM wp_term_taxonomy WHERE taxonomy LIKE 'pa_%';
5
6DELETE FROM wp_term_relationships WHERE term_taxonomy_id NOT IN
7(SELECT term_taxonomy_id FROM wp_term_taxonomy);

Первый запрос удаляет названия атрибутов из wp_terms. Второй, их таксономические записи из wp_term_taxonomy. Третий подчищает осиротевшие связи «терм-объект» из wp_term_relationships, которые остались без родительской таксономии. Порядок важен: если удалить таксономию раньше термов, третий запрос зацепит лишнее.

Удаление продуктов WooCommerce

Продукты и их вариации, это записи с типом product и product_variation в таблице wp_posts. Но просто стереть строки из wp_posts недостаточно: останутся метаданные в wp_postmeta (цена, артикул, настройки доставки) и связи с термами в wp_term_relationships (категории, теги). Три запроса, каскад:

1DELETE FROM wp_term_relationships WHERE object_id IN
2(SELECT ID FROM wp_posts WHERE post_type IN ('product','product_variation'));
3
4DELETE FROM wp_postmeta WHERE post_id IN
5(SELECT ID FROM wp_posts WHERE post_type IN ('product','product_variation'));
6
7DELETE FROM wp_posts WHERE post_type IN ('product','product_variation');

Сначала рвём связи продукта с таксономиями, затем удаляем метаданные и только потом, саму запись продукта. Если переставить порядок и грохнуть wp_posts первым, подзапросы SELECT ID FROM wp_posts во втором и третьем шагах вернут пустой набор, метаданные и связи останутся мёртвым грузом в базе.

Очистка осиротевшей постметы

После любых манипуляций с удалением записей через SQL стоит проверить, не осталось ли в wp_postmeta строк, ссылающихся на несуществующие посты. Такое бывает при обрыве транзакции, кривом импорте или если удаляли посты не каскадно:

1DELETE pm
2FROM wp_postmeta pm
3LEFT JOIN wp_posts wp ON wp.ID = pm.post_id
4WHERE wp.ID IS NULL;

Запрос находит все строки wp_postmeta, для которых нет родительской записи в wp_posts, и удаляет их. Безопасен, живые данные не трогает, цепляет только мусор.

Способ 2: WP-CLI, быстро и без phpMyAdmin

Если есть доступ к серверу по SSH, WP-CLI справляется с массовым удалением элегантнее любых SQL-запросов. Одна команда, и WooCommerce сам проходит по связанным таблицам, не оставляя осиротевших данных:

1wp wc product delete $(wp wc product list --field=ID --per_page=-1) --force

Флаг --per_page=-1 выгружает ID вообще всех продуктов, без пагинации. --force пропускает корзину и удаляет навсегда. Если продуктов больше 10 000, лучше разбить на порции по 500, чтобы не упереться в лимит памяти:

1wp wc product list --field=ID --per_page=500 --page=1 | xargs wp wc product delete --force

Для удаления атрибутов через WP-CLI используйте:

1wp wc product_attribute list --field=id --per_page=-1 | xargs -I{} wp wc product_attribute delete {} --force

Главный плюс WP-CLI перед голым SQL: он вызывает внутренние хуки WooCommerce, before_delete_post и after_delete_post. Это даёт плагинам кеширования и поиска (Elasticsearch, Redis, Relevanssi) шанс подчистить свои индексы. SQL-запросы этого не делают, после них поиск может какое-то время возвращать уже удалённые товары.

Способ 3: плагины, когда не хочется лезть в базу

Тем, кому командная строка и phpMyAdmin кажутся рискованными, рынок предлагает специализированные плагины. Работают поверх тех же SQL-запросов, но прячут их за кнопкой.

Delete All Products for WooCommerce, бесплатный плагин из официального репозитория WordPress.org. Добавляет в админку одну кнопку. Нажал → выбрал «в корзину» или «навсегда» → подтвердил. Минимум движений, нулевой риск опечатки в SQL. Минус: работает только с продуктами, атрибуты не трогает.

WooCommerce Store Toolkit (он же Store Toolkit for WooCommerce), вариант посерьёзнее. Чистит не только продукты и атрибуты, но и заказы, купоны, сессии, транзиенты, с фильтрами по дате и статусу. Подходит для полной генеральной уборки магазина перед перезапуском.

Какой бы плагин вы ни выбрали, правило бэкапа никто не отменял. Плагин выполняет те же DELETE-запросы, просто вы не видите их в лицо.

Сравнение методов: что и когда выбирать

Метод

Скорость

Безопасность

Гибкость

Для кого

SQL в phpMyAdmin

Мгновенно

Низкая - нет защиты от ошибки

Полный контроль над таблицами

Разработчики, админы серверов

WP-CLI

Быстро, секунды

Высокая - хуки и каскад

Удобные флаги и пагинация

Разработчики, DevOps

Плагины

Медленно, сотни в минуту

Максимальная - интерфейс

Ограничена функционалом плагина

Владельцы магазинов

Если у вас один продукт или десяток, интерфейс WooCommerce «Товары → выбрать → Удалить» справится. Сотни и тысячи, SQL или WP-CLI. Боевой продакшен-магазин, где нет права на ошибку, плагин или WP-CLI.

Важные ограничения: что НЕ удаляется

Массовое удаление продуктов и атрибутов через SQL не трогает медиафайлы. Картинки товаров, загруженные в библиотеку WordPress (записи с post_type = 'attachment'), остаются на месте, и в файловой системе, и в базе. Если вы пересоздаёте каталог с нуля и хотите освободить место на хостинге, медиафайлы придётся чистить отдельно: через «Медиафайлы → выбрать → Удалить навсегда» или WP-CLI:

1wp post delete $(wp post list --post_type=attachment --field=ID --per_page=-1) --force

SQL-команды также не обновляют счётчики WooCommerce (product counts by category), которые кешируются в wp_termmeta и wp_options, транзиенты с префиксом _wc_term_counts_. После массового удаления в админке может временно отображаться неверное число товаров в категории. Исправляется пересчётом:

1wp wc tool run recount_terms

Или через одноимённый плагин Recount Terms из репозитория.

На видео, пошаговый разбор SQL-команд для удаления атрибутов WooCommerce в phpMyAdmin: навигация по таблицам и проверка результата после каждого запроса.

⁉️🤔 Частые вопросы

Безопасно ли удалять продукты через SQL на работающем магазине?

На production-магазине прямой SQL для массового удаления, рискованная практика. Одна опечатка в названии таблицы или условии WHERE может задеть заказы, пользователей или настройки. Если магазин живой и приносит деньги, используйте WP-CLI или плагины, которые не дадут выстрелить себе в ногу. SQL оставьте для dev-окружений, стейджинга и ситуаций, когда интерфейс админки уже не грузится.

Почему после SQL-удаления продукты всё ещё видны в поиске на сайте?

Поисковые плагины, Relevanssi, Elasticsearch, SearchWP, хранят собственный индекс, который не обновляется при прямых манипуляциях с wp_posts в обход WordPress API. После чистки через SQL нужно перестроить индекс поиска в настройках плагина или через WP-CLI: например, wp relevanssi index --reindex.

Как удалить продукты только определённой категории, а не все подряд?

Добавьте фильтр по term_taxonomy_id нужной категории. Схема: получить term_id категории → найти term_taxonomy_id в wp_term_taxonomy → отфильтровать object_id в wp_term_relationships перед удалением из wp_posts. На практике проще использовать WP-CLI: wp wc product list --category=slug-kategorii --field=ID | xargs wp wc product delete --force.

Можно ли восстановить продукты после SQL-удаления?

Только из бэкапа. В отличие от удаления через корзину WordPress (Move to Trash), SQL-команда DELETE стирает строки физически и безвозвратно. Именно поэтому правило «сначала бэкап» повторяется в каждом разделе этой статьи. Две минуты на дамп сэкономят часы на восстановление.

Чем отличается удаление атрибутов от удаления вариаций?

Вариации, это подтип продуктов (product_variation). Они удаляются теми же SQL-командами, что и простые продукты: условие post_type IN ('product','product_variation') во втором блоке «Способа 1» уже включает вариации. Атрибуты (pa_цвет, pa_размер), это таксономии, они удаляются отдельно, первым блоком SQL-команд. Порядок корректный: сначала продукты (включая вариации), потом атрибуты. Если наоборот, вариации потеряют привязку к атрибутам, но сами записи вариаций останутся в базе.

Что ставить в 2026 году: итоговый расклад

SQL-команды, WP-CLI и плагины, три инструмента разной степени опасности для одной задачи. Выбор сводится к простой матрице:

  • Есть SSH и опыт командной строки → WP-CLI (wp wc product delete). Безопасно, быстро, с хуками.
  • Нет SSH, но есть phpMyAdmin и вы понимаете схему таблиц → SQL. Полный контроль, мгновенный результат. Но сначала бэкап.
  • Не хотите риска → Delete All Products или Store Toolkit. Медленнее, зато кнопка вместо SQL-запроса.

В любом сценарии бэкап базы данных, действие номер один. Без него не начинайте.

🔗 Delete All Products for WooCommerce, бесплатно на WordPress.org🔗 WooCommerce Store Toolkit, расширенная очистка магазина