
🗑 Массовое удаление продуктов и атрибутов 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). Для тех, кто работает из командной строки:
1 mysqldump -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». Удалять нужно каскадно, начиная с термов и заканчивая связями:
1 DELETE FROM wp_terms WHERE term_id IN 2 (SELECT term_id FROM wp_term_taxonomy WHERE taxonomy LIKE 'pa_%'); 3 4 DELETE FROM wp_term_taxonomy WHERE taxonomy LIKE 'pa_%'; 5 6 DELETE 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 (категории, теги). Три запроса, каскад:
1 DELETE FROM wp_term_relationships WHERE object_id IN 2 (SELECT ID FROM wp_posts WHERE post_type IN ('product','product_variation')); 3 4 DELETE FROM wp_postmeta WHERE post_id IN 5 (SELECT ID FROM wp_posts WHERE post_type IN ('product','product_variation')); 6 7 DELETE FROM wp_posts WHERE post_type IN ('product','product_variation');
Сначала рвём связи продукта с таксономиями, затем удаляем метаданные и только потом, саму запись продукта. Если переставить порядок и грохнуть wp_posts первым, подзапросы SELECT ID FROM wp_posts во втором и третьем шагах вернут пустой набор, метаданные и связи останутся мёртвым грузом в базе.
Очистка осиротевшей постметы
После любых манипуляций с удалением записей через SQL стоит проверить, не осталось ли в wp_postmeta строк, ссылающихся на несуществующие посты. Такое бывает при обрыве транзакции, кривом импорте или если удаляли посты не каскадно:
1 DELETE pm 2 FROM wp_postmeta pm 3 LEFT JOIN wp_posts wp ON wp.ID = pm.post_id 4 WHERE wp.ID IS NULL;
Запрос находит все строки wp_postmeta, для которых нет родительской записи в wp_posts, и удаляет их. Безопасен, живые данные не трогает, цепляет только мусор.
Способ 2: WP-CLI, быстро и без phpMyAdmin
Если есть доступ к серверу по SSH, WP-CLI справляется с массовым удалением элегантнее любых SQL-запросов. Одна команда, и WooCommerce сам проходит по связанным таблицам, не оставляя осиротевших данных:
1 wp wc product delete $(wp wc product list --field=ID --per_page=-1) --force
Флаг --per_page=-1 выгружает ID вообще всех продуктов, без пагинации. --force пропускает корзину и удаляет навсегда. Если продуктов больше 10 000, лучше разбить на порции по 500, чтобы не упереться в лимит памяти:
1 wp wc product list --field=ID --per_page=500 --page=1 | xargs wp wc product delete --force
Для удаления атрибутов через WP-CLI используйте:
1 wp 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:
1 wp 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_. После массового удаления в админке может временно отображаться неверное число товаров в категории. Исправляется пересчётом:
1 wp 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, расширенная очистка магазина



