tavis nörttimaailmassa

EksisONE - artikkeleita ja ohjeita nörttimaailmasta

WordPress ja kommenttien massapoisto (bulk delete)

WordPressissä on helppo luoda kaikkea mahdollista, jopa isoja määriä kerralla, mutta isojen määrien poistaminen kerralla onkin kertaluokkaa hankalampaa. Useimmiten moinen massapoisto taitaa tulla vastaan kommenttien poistamisessa botti-invaasion jälkeen. Verkkokaupoissa, kuten Woocommercen kohdalla, vastaava voisi olla vanhojen ale-kuponkien poistaminen. Joskus on jopa tarve poistaa iso määrä käyttäjiä, varsinkin jos muuttaa sivuston luonnetta. WordPressin oma poisto on tuskaa, mutta onneksi avuksi tulee WP CLI. Tai lisäosa, mutta moisessa ei ole seksikkyyttä, tyyliä eikä tehokkuutta.

Monet kokemattomammat WordPressin käyttäjät kiroavat sydämensä pohjasta mahdollisuutta käsitellä vain 2o kohdetta kerralla. Tuolta osin löytyy helpotusta. Sivujen oikeasta yläkulmasta löytyy (usemmiten) kohta näyttöasetukset. Kun sen klikkaa auki, niin pystyy valitsemaan mitä kohteita sivulla näytetään (kuten artikkelien muokkauksessa tai työpöydän ohjausnäkymässä) tai kuinka monta kohdetta esitetään jollain luettelosivulla.

 

Wordpressin ohjausnäkymässä voi muuttaa esitettävien kohteiden määrää

Valitettavasti siihen ei voi laittaa kuinka suurta määrää haluaa, vaan 999 on maksimi. Joskus sekin riittäisi. Ongelma on vain siinä, että moinen määrä toimii vain listauksessa, mutta jos yrität tehdä massana jotain, niin saat virheilmoituksen: Request-URI too long (tai vastaava, riippuen serveristä).

Wordpressin virheilmoitus liian pitkästä osoitteesta, esimerkiksi massamuokkauksissa

Tämä johtuu siitä, että poistettavien nimet liitetään komentoon, ja silloin rotlasta tulee liian pitkä. Useimmiten tuosta selviää, kun laittaa näytettäväksi määräksi esimerkiksi 200. Tosin, kun poistin massana Woocommercen alennuskoodeja, niin 200 oli liian paljon – 50 toimi, mutta silloin minulla oli poistossa tusinan verran sivuja ja se sai ärsyyntymään (kyllä, olin jakanut aika paljon alekoodeja – liian paljon).

Tuohon löytyi ratkaisu kahdella tapaa. Joko asentaa (yllätysyllätys) lisäosan tai käyttää maanmainiota WP CLI -laajennusta. Kumpi ratkaisu on järkevämpi riippuu hieman tarpeesta, jonkun verran halusta oppia ja huomattavan paljon siitä missä ja miten WordPress-asennus on. WP CLI:n asentaminen ei pääsääntöisesti onnistu webhotelleissa, vaan vaatii virtuaaliserverin (yksi huomattavan vahva syy siirtyä VPS:n käyttäjäksi esim. DigitalOceanille). Maailmalla yhä useampi websivujen hostaaja, varsinkin isommat, tarjoavat jo WP CLI:n palvelun mukana, mutta en tiedä Suomen nykytilannetta. Kommentteihin voi vinkata josko joku yritys on jo päättänyt alkaa palvelemaan asiakkaitaan – muutama vuosi sitten WP CLI ei ollut vaihtoehto kotimaan markkinoilla.

Jos asennat lisäosan, niin tämä on nopealle etsimisellä käytännössä ainoa vaihtoehto. Omaa kokemusta sen käytöstä ei ole, kunhan asensin. Se tekee samat poistot kommentin tilan mukaan mikä onnistuu WP CLI:lläkin ja jos haluaa poistaa per kirjoittaja, niin sitten joutuu ostamaan maksullisen version.

https://fi.wordpress.org/plugins/wp-bulk-delete/

Riippuen vainoharhasi asteesta, niin päätät itse jätätkö sen asumaan asennukseesi vai poistatko käytön jälkeeen. Itse poistaisin, koska se on tehty nimenomaan massapoistoihin, eikä moinen operaatio saa olla arkipäivää. En nauti ajatuksesta, että joudun luottamaan päivästä toiseen lisäosasta, jonka mahdollistaa kaiken poistamisen. Todennäköisesti lisäosa on koodattu hyvin ja moinen pelko on todellakin ainakin asteen paranoijan puolella, mutta pääsääntöisesti hyvää politiikka on aina poistaa kokonaan lisäosat, joita ei käytä. Asentaa moisen uudestaan sitten myöhemmin, jos tarvetta tulee.

Yleistä WP CLI:stä

Teet mitä tahansa WP CLI:n kanssa, niin yksi käytäntö on hyvä opetella: tee aina ensin varmuuskopio tietokannasta. Siten saat palautettua systeemin, jos homma menee pieleen. WP CLI:llä varmuuskopiointi on niin helppoa, että sen tekemättä jättämiselle ei ole mitään perusteita.

Siirry aina ensin sivuston hakemistoon. Anna sen jälkeen:

wp db export tietokanta.sql

Voit nimetä tietokannan miten haluat.

Jos haluat palauttaa tietokannan, niin tällä se onnistuu:

wp db import tietokanta.sql

Kommenttien massapoisto

WP CLI on tehokas komentorivityökalu shellissä. Koska se on shellissä toimiva komentorivityökalu, niin tavalliselle käyttäjälle kynnys sen käyttöön on korkea. Pitäisi muistaa aina miten komento täytyy antaa. Yksi tapa on laittaa komentorimpsu aliaksena bashiin, mutta silloin sitä ei pääse muokkaamaan – sopii siis eräällä tavalla vakioasioille, kuten vaikka tietokannan kopioimiseen vakionimellä. Toinen tapa on Googlettaa tapaus kerrallaan. Minä käytän paljon Googlea (ja tätä sivustoa).

Kommenteillä on neljä tilaa, joiden mukaan kommentteja voi poistaa:

  • hold (tarkastettavana)
  • approve (hyväksytty)
  • spam (roskaposti)
  • trash (roskakorissa)

Jos komentaa

wp comment delete $(wp comment list --status=trash --format=ids) --force --quiet

niin poistaa kaikki roskiksessa olevat.

wp comment delete on varsinainen ”poistokomento”. Koska komennolle täytyy antaa poistettavan kommentin ID (tai ID:t) eikä niitä ryhmäpoistossa oikein voi antaa, niin täytyy antaa muuttuja $. Se määritellään suluissa olevalla toisella komennolla, jossa listataan roskokorissa olevat niiden ID:n mukaan. Lopussa oleva --force pakottaa poiston, ilman sitä menee roskakoriin, ja --quiet ei ilmoittele mitään. Jos haluat nähdä ruudulla, että poistot tosiaan tapahtuvat, niin älä anna --quiet vipua.

Kommentoijan mukaan poisto

Minulla oli yli 43000 kommenttia, joista osa oli ActionSchedulerin ja iso osa Woocommercen jäljiltä. Kyse oli sivustosta, josta oli siirretty verkkokauppa omalle alidomainilleen ja siitä jää kaikkea roskaa.

ActionScheduler on Woocommerceen rakennettu taustalla toimiva asioita jonoon laittava palvelu. Osa lisäosista käyttää sitä, ainakin WooCommerce Subscriptions ja WooCommerce Follow-Ups – minulla oli jälkimmäinen asennettuna. Kannattaa heti alkuun ymmärtää, että kaikki mitkä mieletään jossain tapaa julkaistuksi jutuiksi, ovat kaikki artikkeleita, postauksia. Niitä vain kutsutaan eri nimillä, kuten podcast jne muut kustomit, mutta ne ovat kuitenkin artikkeita. Kommentit ovat oma juttunsa, ja aivan kaikki ostoihin liittyvä viestiliikenne, vaikka maksunvälittäjän ja kaupan välillä tain tilauksen tilan muutokset, ovat aidosti kommentteja. Kun niitä käyttänyt, ja normaalista kommentointilistasta piilottanut lisäosa, tässä Woocommerce, poistetaan, niin ne tulevat näkyviin kommentteina. Jos verkkokauppa on ollut aktiivinen, niin lista voi olla tukahduttavan pitkä.

Halusin niistä eroon.

Kommenttien poisto per kirjoittaja niin, että listataan poistettavien ID:ksi comment_author ei toimi sellaisenaan. Se on nimittäin listauksen kenttää määrittelevä vipu, ei suodattava. Siihen tulee avuksi xargs, jota en osaa käyttää. Onneksi joku muu osaa. Mutta ymmärtääkseni se toimii juurikin päinvastoin kuin useimmiten käytetty muoto <wp komento joka halutaa $(wp komento joka listaa muuttujat) eli ensimmäinen wp-komento itseasiassa tekee muuttujat putkitusmerkin | jälkeen olevalle xargs jutulle.

Esimerkissä poistan ActionScheduleriin liittyvät kommentit:

wp comment list --field=ID --'post_author'='ActionScheduler' | xargs wp comment delete --force --allow-root

Lisäksi täytyy poistaa myös niihin liittyvät postaukset:

wp post list --field=ID --post_type=scheduled-action | xargs wp post delete --force

Ja jos niitä on poistettu tai peruttu, niin nekin on siivottava:

wp post list --field=ID --post_type=scheduled-action --post_status=trash | xargs wp post delete --force
wp post list --field=ID --post_type=scheduled-action --post_status=cancel | xargs wp post delete --force

WooCommerce

WooCommercen kommentteina näkyvä viestitys (tilamuutokset, maksunvälitys jne) on kirjoittajanimellä WooCommerce. Kun sen vaihtaa post_author kohtaan, niin pitäisi hävitä siihen liittyvä liikenne. Paitsi että ei häviä, häviää aivan kaikki kommentit. Yksikään netistä löytämäni komentorotla ei toiminut. Joko ne eivät toimineen ollenkaan tai poistivat aivan kaiken.

Minulla oli niitä kaikkiaan 43 000 ja ne, sekä muutakin WooCommerceen liittyvää roskaa, joita en löytänyt, hidasti backendiä aivan tolkuttomasti

Tapeltuani asian kanssa riittävän pitkään, antauduin ja valitsin helpoimman tien – joka kannattaisi valita muutenkin.

Ennenkuin poistat WooCommercen, niin avaa wp-config.php ja lisää sinne tämä:

define ( 'WC_REMOVE_ALL_DATA', true);

Poista nyt WooCommerce kokonaan lisäosista. Se raksuttaa hetken ja kun on valmis, niin voit poistaa wp-config.php -tiedostosta ylläolevan.

Lopputuloksena kaikki kommenteissa näkyneet tuotteisiin ja tilauksiin liittyneet viestit ovat kadonneet. Ja kaupan päälle taustan hallinta nopeutui.

Poisto tietokannasta

wp comment delete poistaa eräällä tavalla kuin käyttäjä suoraan hallinnasta. Tarkoittaa sitä, että jos poistettavia kommentteja on kymmeniä tuhansia, niin se vie hiemaan aikaa. Ei sentään tunneista puhuta, mutta muutama minuutti kuluu varmasti. Jos haluaa urakan hoidettavan silmänräpäyksellisen nopeasti, niin käsitellään suoraan tietokantaa. WP CLI mahdollistaa senkin.

Anna komento:

wp db query 'DELETE FROM wp_comments WHERE comment_approved = "spam"'

niin poistat kaikki roskapostiksi merkityt kommentit.

Koska wp comment delete toimii kuin käyttäjä, niin WordPress myös käyttäytyy sen edellyttämällä tavalla ja kommentteja poistettaessa se poistaa myös kommentteihin liittyvät metatiedot, kuten vaikka Akismetin merkinnät. Kun poisto tehdään wp db query komennolla suoraan tietokantaan, niin moista ei tehdä. Metatiedot joudutaan siten siivoamaan käsin.

Tämä poistaa kommenttien metatiedoista Akismetin merkinnät:

wp db query 'DELETE FROM wp_commentmeta WHERE meta_key LIKE "%akismet%"'

Jos et tyhjennä metatietoja, niin toki sivusto toimii, mutta tietokanta alkaa kasvamaan. Jossain vaiheessa siitä voi tulla niin suuri, että se alkaa hidastamaan.

Itse olen hieman arka käsittelemään tietokantaa WP CLI:llä ja se johtunee vain pelonsekaisesta kunnioituksesta komentorivien kryptisyyttä ja tehokkuuta kohtaan. Tai sitten olen vain liian piintynyt Windows-käyttäjä ja haluan graafisuutta. Siksi kajoan tietokantaan mieluummin phpMyAdmin tai Adminer -ohjelmilla.

Kaikki kommentit häviävät näin:

phpmyadmin ja kommenttikenttien tyhjentäminen

 

Valitse kentät wp_commentmeta ja wp_comment sekä sen jälkeen valitse Empty tyhjentääksesi ne. Aikaa kuuluu noin sekunti. Jos olet wp-config.php -tiedostossa antanut jonkun muun prefiksin tietokantaan, niin wp_ korvaantuu sillä.

Entä jos haluatkin poistaa vain kommenttispämmin tietokantaa näpelöimällä? Onnea matkaan, sillä minulla ei ole hajuakaan miten se tehtäisiin. Olen aivan surkea sql-komentojen kanssa.