Skip to content

Wszystko o WordPressie, tworzeniu stron — i nie tylko

🗑 Masowe usuwanie produktów i atrybutów WooCommerce: SQL, WP-CLI i wtyczki

🗑 Masowe usuwanie produktów i atrybutów WooCommerce: SQL, WP-CLI i wtyczki

Wchodzą Państwo do panelu administracyjnego WooCommerce i widzą: trzy tysiące produktów, połowa to duplikaty z nieudanego importu, atrybuty „Kolor 1", „Kolor 2", „Rozmiar_copy_2023". Interfejs „Produkty → zaznacz wszystkie → Usuń" zawiesza się przy drugiej setce. Brzmi znajomo? Masowe czyszczenie katalogu to zadanie, z którym styka się każdy, kto próbował migrować sklep, scalać bazę testową z produkcyjną lub uruchamiać witrynę od nowa po rebrandingu.

Problem wynika ze struktury WooCommerce: produkty są rozrzucone po czterech tabelach, wp_posts, wp_postmeta, wp_term_relationships i wp_term_taxonomy, a atrybuty przechowywane są w kolejnych trzech. Samo kliknięcie „Usuń wszystko" nie zadziała, silnik przestanie odpowiadać, zanim dojdzie do końca listy. Potrzebne jest narzędzie, które omija interfejs i działa bezpośrednio na bazie danych lub przez CLI.

Poniżej trzy sprawdzone sposoby: od radykalnego SQL po bezpieczne wtyczki. Z kopią zapasową, weryfikacją prefiksów i zrozumieniem, co dokładnie dzieje się w każdej tabeli.

💡 Szybki przegląd:

  • Proszę wykonać pełny zrzut bazy danych, DELETE jest nieodwracalny, nie ma kosza
  • Proszę sprawdzić prefiks tabel w pliku wp-config.php i zastąpić nim wp_
  • Proszę wykonywać polecenia SQL kaskadowo: atrybuty → produkty → osierocone meta dane
  • Jeśli jest dostęp SSH, WP-CLI poradzi sobie jednym poleceniem i wywoła odpowiednie hooki
  • Dla sklepu produkcyjnego bez doświadczenia w SQL bezpieczniejsze są wtyczki z przyciskiem „Usuń"

Środki ostrożności: kopia zapasowa i prefiks

Każde polecenie SQL zmieniające zawartość tabel WordPress jest nieodwracalne. DELETE nie prosi o potwierdzenie, nie przenosi wpisu do kosza, wiersz znika natychmiast i na zawsze. Zasada numer jeden: proszę wykonać pełną kopię zapasową bazy danych przed uruchomieniem któregokolwiek z poniższych zapytań.

Najpewniejszym sposobem jest wyeksportowanie zrzutu przez phpMyAdmin: zakładka „Eksport" → format SQL → kompresja gzip. Lub przez panel hostingu (cPanel → Backup → Database). Dla osób pracujących z wiersza poleceń:

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

Druga kwestia: wszystkie poniższe zapytania używają standardowego prefiksu wp_. Jeśli podczas instalacji WordPress zmienili Państwo prefiks na wpx_, store_ lub inny, proszę zastąpić wp_ we wszystkich poleceniach własnym. Rzeczywisty prefiks znajduje się w pliku wp-config.php, w wierszu $table_prefix. Sprawdzili Państwo? Przejdźmy zatem do rzeczy.

Sposób 1: Polecenia SQL w phpMyAdmin, pełna kontrola

Najszybsza i najbardziej radykalna metoda. Sprawdza się, gdy trzeba wyczyścić setki lub tysiące wpisów za jednym razem, a standardowy interfejs WooCommerce przerywa pracę z powodu timeoutu. Wszystkie zapytania wykonuje się w phpMyAdmin w zakładce „SQL", pojedynczo, w ściśle określonej kolejności.

Usuwanie atrybutów WooCommerce

Atrybuty znajdują się jednocześnie w trzech tabelach: wp_terms, wp_term_taxonomy i wp_term_relationships. Od zwykłych kategorii i tagów odróżnia je prefiks pa_ w polu taxonomy, skrót od „product attribute". Należy usuwać kaskadowo, zaczynając od termów, a kończąc na powiązaniach:

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);

Pierwsze zapytanie usuwa nazwy atrybutów z wp_terms. Drugie, ich wpisy taksonomiczne z wp_term_taxonomy. Trzecie czyści osierocone powiązania „term-obiekt" z wp_term_relationships, które pozostały bez nadrzędnej taksonomii. Kolejność jest ważna: jeśli usuną Państwo taksonomię przed termami, trzecie zapytanie usunie zbyt wiele.

Usuwanie produktów WooCommerce

Produkty i ich warianty to wpisy o typie product i product_variation w tabeli wp_posts. Samo usunięcie wierszy z wp_posts nie wystarczy: pozostaną meta dane w wp_postmeta (cena, SKU, ustawienia wysyłki) oraz powiązania z termami w wp_term_relationships (kategorie, tagi). Trzy zapytania, kaskadowo:

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');

Najpierw zrywamy powiązania produktu z taksonomiami, następnie usuwamy meta dane i dopiero wtedy sam wpis produktu. Jeśli zmienią Państwo kolejność i usuną wp_posts jako pierwsze, podzapytania SELECT ID FROM wp_posts w drugim i trzecim kroku zwrócą pusty zbiór, a meta dane i powiązania pozostaną martwym balastem w bazie.

Czyszczenie osieroconych meta danych postów

Po wszelkich manipulacjach związanych z usuwaniem wpisów przez SQL warto sprawdzić, czy w wp_postmeta nie pozostały wiersze odwołujące się do nieistniejących postów. Zdarza się to przy przerwaniu transakcji, nieudanym imporcie lub gdy posty były usuwane niekaskadowo:

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

Zapytanie znajduje wszystkie wiersze wp_postmeta, dla których nie ma nadrzędnego wpisu w wp_posts, i usuwa je. Jest bezpieczne, nie narusza żywych danych, dotyczy tylko śmieci.

Sposób 2: WP-CLI, szybko i bez phpMyAdmin

Jeśli mają Państwo dostęp do serwera przez SSH, WP-CLI radzi sobie z masowym usuwaniem elegancko, lepiej niż jakiekolwiek zapytania SQL. Jedno polecenie, a WooCommerce samodzielnie przechodzi przez powiązane tabele, nie pozostawiając osieroconych danych:

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

Flaga --per_page=-1 pobiera ID absolutnie wszystkich produktów, bez paginacji. --force pomija kosz i usuwa trwale. Jeśli produktów jest więcej niż 10 000, lepiej podzielić je na partie po 500, aby nie napotkać limitu pamięci:

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

Do usuwania atrybutów przez WP-CLI proszę użyć:

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

Główna przewaga WP-CLI nad czystym SQL: wywołuje on wewnętrzne haki WooCommerce, before_delete_post oraz after_delete_post. Dzięki temu wtyczki buforujące i wyszukiwarki (Elasticsearch, Redis, Relevanssi) mają szansę wyczyścić swoje indeksy. Zapytania SQL tego nie robią, więc po ich wykonaniu wyszukiwarka może przez jakiś czas zwracać już usunięte produkty.

Sposób 3: wtyczki, gdy nie chce się wchodzić do bazy

Dla tych, dla których wiersz poleceń i phpMyAdmin wydają się ryzykowne, rynek oferuje specjalistyczne wtyczki. Działają one na tych samych zapytaniach SQL, ale ukrywają je za przyciskiem.

Delete All Products for WooCommerce, bezpłatna wtyczka z oficjalnego repozytorium WordPress.org. Dodaje jeden przycisk w panelu administracyjnym. Klikasz → wybierasz „do kosza" lub „na stałe" → potwierdzasz. Minimum ruchów, zerowe ryzyko błędu w SQL. Minus: działa tylko na produktach, nie rusza atrybutów.

WooCommerce Store Toolkit (znany też jako Store Toolkit for WooCommerce), opcja poważniejsza. Czyści nie tylko produkty i atrybuty, ale też zamówienia, kupony, sesje, tranzyty, z filtrami po dacie i statusie. Nadaje się do pełnego generalnego sprzątania sklepu przed ponownym uruchomieniem.

Niezależnie od wybranej wtyczki, zasada tworzenia kopii zapasowej pozostaje niezmienna. Wtyczka wykonuje te same zapytania DELETE, po prostu nie widać ich bezpośrednio.

Porównanie metod: co i kiedy wybierać

Metoda

Szybkość

Bezpieczeństwo

Elastyczność

Dla kogo

SQL w phpMyAdmin

Natychmiastowa

Niskie, brak zabezpieczenia przed błędem

Pełna kontrola nad tabelami

Deweloperzy, administratorzy serwerów

WP-CLI

Szybko, sekundy

Wysokie, haki i kaskada

Wygodne flagi i paginacja

Deweloperzy, DevOps

Wtyczki

Wolno, setki na minutę

Maksymalne, interfejs

Ograniczona funkcjonalnością wtyczki

Właściciele sklepów

Jeśli ma Pan/Pani jeden produkt lub kilkanaście, interfejs WooCommerce „Produkty → wybierz → Usuń" poradzi sobie. Setki i tysiące: SQL lub WP-CLI. Produkcyjny sklep, w którym nie ma prawa do błędu: wtyczka lub WP-CLI.

Ważne ograniczenia: co NIE jest usuwane

Masowe usuwanie produktów i atrybutów przez SQL nie rusza plików multimedialnych. Obrazy produktów przesłane do biblioteki WordPress (wpisy z post_type = 'attachment') pozostają na swoim miejscu, zarówno w systemie plików, jak i w bazie danych. Jeśli tworzy Pan/Pani katalog od nowa i chce zwolnić miejsce na hostingu, pliki multimedialne trzeba wyczyścić osobno: przez „Multimedia → wybierz → Usuń na stałe" lub WP-CLI:

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

Polecenia SQL nie aktualizują również liczników WooCommerce (liczby produktów w kategorii), które są buforowane w wp_termmeta i wp_options, tranzyty z prefiksem _wc_term_counts_. Po masowym usunięciu w panelu administracyjnym może tymczasowo wyświetlać się nieprawidłowa liczba produktów w kategorii. Naprawia się to przez ponowne przeliczenie:

1wp wc tool run recount_terms

Lub za pomocą wtyczki o tej samej nazwie Recount Terms z repozytorium.

Na wideo: szczegółowe omówienie krok po kroku poleceń SQL do usuwania atrybutów WooCommerce w phpMyAdmin, nawigacja po tabelach i weryfikacja wyniku po każdym zapytaniu.

⁉️🤔 Często zadawane pytania

Czy bezpiecznie jest usuwać produkty przez SQL na działającym sklepie?

Na sklepie produkcyjnym bezpośredni SQL do masowego usuwania to ryzykowna praktyka. Jeden błąd w nazwie tabeli lub warunku WHERE może naruszyć zamówienia, użytkowników lub ustawienia. Jeśli sklep działa i zarabia, proszę używać WP-CLI lub wtyczek, które nie pozwolą strzelić sobie w stopę. SQL proszę zostawić dla środowisk deweloperskich, stagingu i sytuacji, gdy interfejs panelu administracyjnego już się nie ładuje.

Dlaczego po usunięciu przez SQL produkty nadal są widoczne w wyszukiwarce na stronie?

Wtyczki wyszukiwania, Relevanssi, Elasticsearch, SearchWP, przechowują własny indeks, który nie jest aktualizowany podczas bezpośrednich manipulacji w wp_posts z pominięciem WordPress API. Po czyszczeniu przez SQL należy przebudować indeks wyszukiwania w ustawieniach wtyczki lub przez WP-CLI: na przykład wp relevanssi index --reindex.

Jak usunąć produkty tylko z określonej kategorii, a nie wszystkie hurtem?

Należy dodać filtr po term_taxonomy_id żądanej kategorii. Schemat: pobrać term_id kategorii → znaleźć term_taxonomy_id w wp_term_taxonomy → odfiltrować object_id w wp_term_relationships przed usunięciem z wp_posts. W praktyce prościej jest użyć WP-CLI: wp wc product list --category=slug-kategorii --field=ID | xargs wp wc product delete --force.

Czy można przywrócić produkty po usunięciu przez SQL?

Tylko z kopii zapasowej. W przeciwieństwie do usuwania przez kosz WordPress (Move to Trash), polecenie SQL DELETE usuwa wiersze fizycznie i bezpowrotnie. Właśnie dlatego zasada „najpierw kopia zapasowa" jest powtarzana w każdej sekcji tego artykułu. Dwie minuty na zrzut bazy zaoszczędzą godziny na odtwarzanie.

Czym różni się usuwanie atrybutów od usuwania wariantów?

Warianty to podtyp produktów (product_variation). Są one usuwane tymi samymi poleceniami SQL co zwykłe produkty: warunek post_type IN ('product','product_variation') w drugim bloku „Sposobu 1" już obejmuje warianty. Atrybuty (pa_цвет, pa_размер) to taksonomie, są one usuwane osobno, pierwszym blokiem poleceń SQL. Kolejność jest prawidłowa: najpierw produkty (wraz z wariantami), potem atrybuty. W odwrotnej kolejności warianty stracą powiązanie z atrybutami, ale same rekordy wariantów pozostaną w bazie.

Co stosować w 2026 roku: podsumowanie

Polecenia SQL, WP-CLI i wtyczki to trzy narzędzia o różnym stopniu ryzyka do jednego zadania. Wybór sprowadza się do prostej matrycy:

  • Jest SSH i doświadczenie w wierszu poleceń → WP-CLI (wp wc product delete). Bezpiecznie, szybko, z hookami.
  • Nie ma SSH, ale jest phpMyAdmin i rozumie Pan/Pani schemat tabel → SQL. Pełna kontrola, natychmiastowy rezultat. Ale najpierw kopia zapasowa.
  • Nie chce Pan/Pani ryzykować → Delete All Products lub Store Toolkit. Wolniej, za to przycisk zamiast zapytania SQL.

W każdym scenariuszu kopia zapasowa bazy danych to działanie numer jeden. Proszę bez niej nie zaczynać.

🔗 Delete All Products for WooCommerce, bezpłatnie na WordPress.org🔗 WooCommerce Store Toolkit, rozszerzone czyszczenie sklepu