Skip to content

Kaikki WordPressistä, web-kehityksestä — ja paljon muuta

🗑 WooCommerce-tuotteiden ja -attribuuttien massapoisto: SQL, WP-CLI ja lisäosat

🗑 WooCommerce-tuotteiden ja -attribuuttien massapoisto: SQL, WP-CLI ja lisäosat

Avaat WooCommerce-hallintapaneelin ja näet kolme tuhatta tuotetta, joista puolet on kaksoiskappaleita epäonnistuneesta tuonnista, ja attribuutteina on "Color 1", "Color 2", "Size_copy_2023". "Tuotteet → valitse kaikki → Poista" -käyttöliittymä aikakatkaisee parin ensimmäisen sadan jälkeen. Kuulostaako tutulta? Massatuoteluettelon siivous on tehtävä, joka tulee vastaan aina, kun verkkokauppaa siirretään, staging-tietokantaa yhdistetään tuotantoon tai kauppapaikka avataan uudelleen brändiuudistuksen jälkeen.

Ongelma juontuu WooCommercen rakenteesta: tuotteet on hajautettu neljään tauluun (wp_posts, wp_postmeta, wp_term_relationships ja wp_term_taxonomy), ja attribuutit on tallennettu kolmeen muuhun. Et voi vain klikata "Poista kaikki"; moottori kaatuu ennen kuin se pääsee listan loppuun. Tarvitset työkalun, joka ohittaa käyttöliittymän ja iskee suoraan tietokantaan tai toimii komentorivin kautta.

Alla on kolme toimivaa tapaa, radikaalista SQL:stä turvallisiin lisäosiin. Varmuuskopion, etuliitetarkistusten ja sen ymmärryksen kera, mitä kussakin taulussa tarkalleen tapahtuu.

💡 Pikaohje:

  • Ota täydellinen tietokantavedos; DELETE on peruuttamaton, roskakoria ei ole
  • Tarkista taulun etuliite tiedostosta wp-config.php ja korvaa sillä wp_
  • Suorita SQL-komennot ketjutusjärjestyksessä: attribuutit → tuotteet → orvot postmeta-rivit
  • Jos sinulla on SSH-yhteys, WP-CLI hoitaa asian yhdellä komennolla ja käynnistää tarvittavat koukut
  • Tuotantokaupassa, jossa ei ole SQL-kokemusta, lisäosat, joissa on "Poista"-painike, ovat turvallisempia

Varotoimet: varmuuskopio ja etuliite

Mikä tahansa SQL-komento, joka muuttaa WordPress-taulujen sisältöä, on peruuttamaton. DELETE ei kysy vahvistusta, ei lähetä tietuetta roskakoriin; rivi katoaa välittömästi ja pysyvästi. Sääntö numero yksi: ota täydellinen tietokantavarmuuskopio ennen kuin suoritat mitään alla olevista kyselyistä.

Luotettavin tapa on viedä vedos phpMyAdminin kautta: "Vienti"-välilehti → SQL-muoto → pakkaa gzipillä. Tai hosting-paneelin kautta (cPanel → Backup → Database). Niille, jotka työskentelevät komentoriviltä:

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

Toinen seikka: kaikki alla olevat kyselyt käyttävät vakio-wp_-etuliitettä. Jos vaihdoit etuliitteen WordPress-asennuksen yhteydessä muotoon wpx_, store_ tai johonkin muuhun, korvaa wp_ jokaisessa komennossa omallasi. Todellinen etuliite löytyy tiedostosta wp-config.php, riviltä $table_prefix. Tarkistettu? Siirrytään nyt itse asiaan.

Tapa 1: SQL-komennot phpMyAdminissa, täysi hallinta

Nopein ja radikaalein tapa. Sopii parhaiten, kun sinun on pyyhittävä satoja tai tuhansia tietueita kerralla ja tavallinen WooCommerce-käyttöliittymä aikakatkaisee. Kaikki kyselyt suoritetaan phpMyAdminissa "SQL"-välilehdellä, yksi kerrallaan, tiukassa järjestyksessä.

WooCommerce-attribuuttien poistaminen

Attribuutit sijaitsevat kolmessa taulussa samanaikaisesti: wp_terms, wp_term_taxonomy ja wp_term_relationships. Ne eroavat tavallisista kategorioista ja avainsanoista pa_-etuliitteen perusteella taxonomy-kentässä, joka on lyhenne sanoista "product attribute". Sinun on poistettava ne ketjussa, aloittaen termeistä ja päättäen suhteisiin:

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

Ensimmäinen kysely poistaa attribuuttien nimet taulusta wp_terms. Toinen poistaa niiden taksonomiatietueet taulusta wp_term_taxonomy. Kolmas siivoaa orvot "termi-objekti"-suhteet taulusta wp_term_relationships, jotka jäivät ilman ylätaksonomiaa. Järjestyksellä on väliä: jos poistat taksonomian ennen termejä, kolmas kysely nappaa liikaa.

WooCommerce-tuotteiden poistaminen

Tuotteet ja niiden variaatiot ovat tietueita, joiden tyyppi on product ja product_variation taulussa wp_posts. Pelkkä rivien pyyhkiminen taulusta wp_posts ei kuitenkaan riitä: metadata jää tauluun wp_postmeta (hinta, SKU, toimitusasetukset) ja termisuhteet jäävät tauluun wp_term_relationships (kategoriat, avainsanat). Kolme kyselyä, ketjutettuna:

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

Ensin katkaisemme tuotteen suhteet taksonomioihin, sitten poistamme metadatan ja vasta sen jälkeen itse tuotetietueen. Jos käännät järjestyksen ja poistat wp_posts-taulun ensin, toisen ja kolmannen vaiheen alikyselyt SELECT ID FROM wp_posts palauttavat tyhjän joukon, ja metadata ja suhteet jäävät kuolleena painona tietokantaan.

Orpojen postmeta-rivien siivoaminen

Kaikkien SQL-poistotoimien jälkeen kannattaa tarkistaa, sisältääkö wp_postmeta rivejä, jotka viittaavat olemattomiin kirjoituksiin. Näin käy keskeytyneiden transaktioiden, rikkinäisten tuontien yhteydessä tai kun kirjoituksia on poistettu ilman ketjutusta:

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

Kysely etsii kaikki wp_postmeta-rivit, joilla ei ole ylätietuetta taulussa wp_posts, ja poistaa ne. Se on turvallinen: se ei koske elävään dataan, ainoastaan roskaan.

Tapa 2: WP-CLI, nopea ja ilman phpMyAdminia

Jos sinulla on SSH-yhteys palvelimelle, WP-CLI hoitaa massapoiston tyylikkäämmin kuin mitkään SQL-kyselyt. Yksi komento, ja WooCommerce käy läpi liittyvät taulut itse, jättämättä orpoa dataa jälkeensä:

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

--per_page=-1-lippu vie kaikkien tuotteiden ID:t ilman sivutusta. --force ohittaa roskakorin ja poistaa pysyvästi. Jos sinulla on yli 10 000 tuotetta, on parempi jakaa 500:n eriin muistirajojen ylittymisen välttämiseksi:

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

Poistaaksesi attribuutit WP-CLI:n kautta, käytä:

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

WP-CLI:n tärkein etu suoraan SQL:ään verrattuna on, että se laukaisee WooCommercen sisäiset koukut, before_delete_post ja after_delete_post. Tämä antaa välimuisti- ja hakuliitännäisille (Elasticsearch, Redis, Relevanssi) mahdollisuuden siivota omat indeksinsä. SQL-kyselyt eivät tee tätä; niiden jälkeen haku saattaa vielä jonkin aikaa palauttaa jo poistettuja tuotteita.

Tapa 3: liitännäiset, kun et halua koskea tietokantaan

Niille, jotka pitävät komentoriviä ja phpMyAdminia liian riskialttiina, markkinoilla on tarjolla erikoisliitännäisiä. Ne toimivat samojen SQL-kyselyjen päällä, mutta piilottavat ne napin taakse.

Delete All Products for WooCommerce on ilmainen liitännäinen virallisesta WordPress.org-hakemistosta. Se lisää hallintapaneeliin yhden napin. Klikkaa → valitse "siirrä roskakoriin" tai "pysyvästi" → vahvista. Minimimäärä vaiheita, nolla riskiä SQL-kirjoitusvirheelle. Huono puoli: se toimii vain tuotteilla, ei koske attribuutteihin.

WooCommerce Store Toolkit (tunnetaan myös nimellä Store Toolkit for WooCommerce) on vakavampi vaihtoehto. Se siivoaa tuotteiden ja attribuuttien lisäksi myös tilaukset, kupongit, istunnot ja transientit, ja siinä on suodattimet päivämäärän ja tilan mukaan. Sopii kaupan täydelliseen syväpuhdistukseen ennen uudelleenjulkaisua.

Riippumatta siitä, minkä liitännäisen valitset, varmuuskopiointisääntö pätee yhä. Liitännäinen ajaa samat DELETE-kyselyt; sinä et vain näe niitä.

Menetelmien vertailu: mitä valita ja milloin

Menetelmä

Nopeus

Turvallisuus

Joustavuus

Tarkoitettu

SQL phpMyAdminissa

Välitön

Matala, ei suojaa virheiltä

Täysi hallinta tauluista

Kehittäjät, palvelimen ylläpitäjät

WP-CLI

Nopea, sekunteja

Korkea, koukut ja ketjutus

Kätevät liput ja sivutus

Kehittäjät, DevOps

Liitännäiset

Hidas, satoja minuutissa

Maksimaalinen, käyttöliittymäpohjainen

Rajoitettu liitännäisen toimintoihin

Kaupan omistajat

Jos sinulla on yksi tuote tai tusina, WooCommercen käyttöliittymän "Tuotteet → valitse → Poista" hoitaa homman. Sadat tai tuhannet vaativat SQL:ää tai WP-CLI:tä. Tuotannossa oleva live-kauppa, jossa virheille ei ole tilaa, vaatii liitännäisen tai WP-CLI:n.

Tärkeät rajoitukset: mitä ei poisteta

Tuotteiden ja attribuuttien massapoisto SQL:llä ei koske mediatiedostoja. WordPressin mediakirjastoon ladatut tuotekuvat (tietueet, joissa post_type = 'attachment') säilyvät paikoillaan sekä tiedostojärjestelmässä että tietokannassa. Jos rakennat katalogia alusta alkaen uudelleen ja haluat vapauttaa tilaa palvelimellasi, mediatiedostot on siivottava erikseen: kohdasta "Media → valitse → Poista pysyvästi" tai WP-CLI:llä:

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

SQL-komennot eivät myöskään päivitä WooCommercen laskureita (tuotemääriä kategorioittain), jotka on välimuistitettu wp_termmeta- ja wp_options-tauluihin transientteina _wc_term_counts_-etuliitteellä. Massapoiston jälkeen hallintapaneeli saattaa näyttää tilapäisesti virheellisiä tuotemääriä kategorioittain. Tämä korjataan uudelleenlaskennalla:

1wp wc tool run recount_terms

Tai Recount Terms -lisäosan avulla repositoriosta.

Video näyttää vaihe vaiheelta, miten WooCommerce-attribuutteja poistetaan SQL-komennoilla phpMyAdminissa: tauluissa liikkuminen ja tulosten tarkistaminen jokaisen kyselyn jälkeen.

⁉️🤔 Usein kysytyt kysymykset

Onko tuotteiden poistaminen SQL:llä turvallista live-kaupassa?

Tuotantokaupassa raa'an SQL:n käyttö massapoistoon on riskialtis käytäntö. Yksi kirjoitusvirhe taulun nimessä tai WHERE-ehdossa voi vaikuttaa tilauksiin, käyttäjiin tai asetuksiin. Jos kauppa on toiminnassa ja tuottaa liikevaihtoa, käytä WP-CLI:tä tai lisäosia, jotka eivät anna sinun ampua itseäsi jalkaan. Säästä SQL kehitysympäristöihin, stagingiin ja tilanteisiin, joissa hallintaliittymä ei enää lataudu.

Miksi tuotteet näkyvät yhä sivuston haussa SQL-poiston jälkeen?

Hakulisäosat (Relevanssi, Elasticsearch, SearchWP) ylläpitävät omaa indeksiään, jota ei päivitetä, kun wp_posts-taulua käsitellään suoraan WordPressin API:n ohi. SQL-siivouksen jälkeen sinun on rakennettava hakuindeksi uudelleen lisäosan asetuksissa tai WP-CLI:llä: esimerkiksi wp relevanssi index --reindex.

Miten poistan tuotteet vain tietystä kategoriasta, en kaikkia?

Lisää suodatin halutun kategorian term_taxonomy_id:n perusteella. Lähestymistapa: hae kategorian term_id → etsi term_taxonomy_id taulusta wp_term_taxonomy → suodata object_id taulussa wp_term_relationships ennen poistamista wp_posts-taulusta. Käytännössä on helpompaa käyttää WP-CLI:tä: wp wc product list --category=slug-kategorii --field=ID | xargs wp wc product delete --force.

Voiko tuotteita palauttaa SQL-poiston jälkeen?

Vain varmuuskopiosta. Toisin kuin poisto WordPressin roskakorin kautta (Siirrä roskakoriin), SQL:n DELETE-komento poistaa rivit fyysisesti ja peruuttamattomasti. Juuri tästä syystä "varmuuskopioi ensin" -sääntö toistetaan tämän artikkelin jokaisessa osiossa. Kaksi minuuttia dumpin ottamiseen säästää tunteja palauttamisessa.

Mitä eroa on attribuuttien poistamisella ja variaatioiden poistamisella?

Variaatiot ovat tuotteiden alatyyppi (product_variation). Ne poistetaan samoilla SQL-komennoilla kuin yksinkertaiset tuotteet: ehto post_type IN ('product','product_variation') "Menetelmän 1" toisessa lohkossa sisältää jo variaatiot. Attribuutit (pa_color, pa_size) ovat taksonomioita; ne poistetaan erikseen, ensimmäisellä SQL-komentolohkolla. Oikea järjestys on: ensin tuotteet (mukaan lukien variaatiot), sitten attribuutit. Jos teet päinvastoin, variaatiot menettävät attribuuttisidoksensa, mutta variaatiotietueet itse jäävät tietokantaan.

Mitä käyttää vuonna 2026: lopputulos

SQL-komennot, WP-CLI ja lisäosat ovat kolme eri riskitason työkalua yhteen tehtävään. Valinta tiivistyy yksinkertaiseen matriisiin:

  • Sinulla on SSH ja komentorivikokemusta → WP-CLI (wp wc product delete). Turvallinen, nopea, koukuilla.
  • Ei SSH:ta, mutta sinulla on phpMyAdmin ja ymmärrät tauluskeeman → SQL. Täysi hallinta, välittömät tulokset. Mutta varmuuskopioi ensin.
  • Et halua minkäänlaista riskiä → Delete All Products tai Store Toolkit. Hitaampi, mutta nappi SQL-kyselyn sijaan.

Kaikissa skenaarioissa tietokannan varmuuskopiointi on toimenpide numero yksi. Älä aloita ilman sitä.

🔗 Delete All Products for WooCommerce, ilmainen WordPress.orgissa🔗 WooCommerce Store Toolkit, edistynyt kaupan siivous