Sinds haar ‘geboorte’ kon je WordPress het best omschrijven als een eenvoudige code-base met een toefje object-georiënteerde PHP als haar meest abstracte systeem. In de afgelopen jaren is dit echter ten goede veranderd. Van unit testing tot CSS preprocessing en commandline-tools, er duiken steeds meer ontwikkelaarsvriendelijke hulpmiddelen op. In dit artikel bekijken we een van mijn persoonlijke favorieten: WP-CLI.

WP-CLI is een opensource project dat al sinds 2003 bestaat en voornamelijk wordt onderhouden door Daniel Bachhuber. Het primaire doel van WP-CLI is om de workflow van WordPress ontwikkelaars te versnellen.

Maar het project is inmiddels zoveel meer dan dat! Het is vandaag de dag zelfs een vereiste voor andere opensource projecten als Trellis en Bedrock. In januari 2017 verhuisde WP-CLI officieel naar WordPress.org en wordt nu ook onderhouden door Alain Schlesser.

WP-CLI v2 is uitgebracht op 8 augustus 2018. We zullen dan ook enkele wijzigingen en nieuwe features van deze versie behandelen in dit artikel. Voor klanten van Kinsta: WP-CLI v2.0.1 wordt standaard op al onze servers geïnstalleerd. Gebruik SSH om in te loggen op je server en je kan aan de slag gaan. SSH toegang is inbegrepen in al onze hostingpakketten (Kan je geen verbinding maken via SSH? Zo los je de SSH fout ‘Connection Refused’ op).

WP-CLI installeren

De minimale PHP vereiste voor WP-CLI v2.0.0 is verhoogd naar PHP 5.4. Hoewel dit zeker een goede zet is, raden we zelf aan om op zijn minst een ondersteunde versie van PHP te gebruiken, wat 7.2 of hoger betekent. PHP 7.2 is de standaard op alle Kinsta installaties, zowel om veiligheids- als prestatieredenen. Ook is het mogelijk om PHP 7.3 en PHP 7.4 te gebruiken.

Om te beginnen moet je WPI-CLI installeren – een heel eenvoudig proces. De stappen voor Linux en OSX vind je hieronder. Voer deze commando’s één voor één uit:

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp

Als er iets misgaat of als je Windows gebruikt, raadpleeg dan de basisinstructies of de alternatieve installatiemethoden.

Als je klaar bent, zou je het commando wp --info moeten kunnen opgeven en een antwoord moeten krijgen.

Als je WP-CLI op je server wil installeren, dan is het proces hetzelfde. Nogmaals: klanten van Kinsta hebben standaard WP-CLI al op hun server geïnstalleerd. Weet je niet zeker welke versie je momenteel gebruikt? Je kan altijd het commando wp cli version gebruiken om hierachter te komen.

WP-CLI: De basics

Toegang tot WordPress vanaf de command line biedt enorm veel mogelijkheden, maar met bash scripts kan je nóg meer resultaat behalen wat betreft controle en snelheid.

Met bash scripts kan je met één enkel commando een reeks commando’s uitvoeren. Je zou bijvoorbeeld bash install-and-setup.sh kunnen typen en het volgende resultaat krijgen:

  • WordPress downloaden
  • Creëren en invullen van wp-config.php
  • Database aanmaken
  • WordPress installeren
  • Installeren en activeren van alle benodigde plugins
  • Installeren en activeren thema
  • Downloaden en toevoegen van testcontent

Als ik een nieuwe testomgeving zou moeten creëeren voor een project, dan zouden dit de stappen zijn die ik onderneem. Normaal gesproken kost me dit in ieder geval 5 tot 10 minuten, helemaal als er een paar plugins bij betrokken zijn. Een enkel commando geven is natuurlijk een stuk sneller.

WP-CLI commando’s in het algemeen

Als je gewend bent om in de terminal te werken, dan zou het gebruik van WP-CLI niet veel voor moeten stellen. Commando’s beginnen altijd met wp, gevolgd door een commando en een subcommando. Hierachter komen de vereiste en optionele parameters. Al met al moet je dus denken aan iets als:

wp command subcommand requiredparam --optionalparam --optionalparam2=value

Laten we een thema installeren om te zien hoe je dit kan doen met een commando:

wp theme install twentyseventeen --activate

Hiermee installeer en activeer je het Twenty Seventeen thema op je WordPress installatie.

Let op: WP-CLI werkt met de WordPress installatie waarin je je momenteel bevindt met de terminal. Als je van directory wisselt en naar een andere WordPress installatie gaat, dan werk je dus met die.

Nuttige voorbeelden

Dat was WP-CLI in een notendop! Hoewel er een aantal geavanceerdere dingen zijn die je kan doen, die we zometeen gaan behandelen, weet je nu genoeg om aan de slag te gaan en de dingen te doen die je wil doen. Ik raad aan om de lijst met commando’s te bekijken en er een aantal uit te proberen. Hieronder kijken we naar een aantal nuttige commando’s om vervolgens verder te gaan met hoe je WP-CLI met SSH gebruikt en hoe je bash scripts kan benutten.

WordPress installeren

Ik gebruik WP-CLI veel om testomgevingen op te zetten. De eerste stap daarvan is het opzetten van een kale site. Hier volgt een lijst met commando’s die ik uitvoer:

wp core download
wp core config --dbname=mydbname --dbuser=mydbuser --dbpass=mydbpass --dbhost=localhost --dbprefix=whebfubwef_ --extra-php <<PHP
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
PHP
wp db create
wp core install --url=http://siteurl.com --title=SiteTitle --admin_user=username --admin_password=mypassword [email protected]

Dit is toch supercool? Met het eerste commando download ik de meest recente versie van WordPress. Het tweede commando stelt het configuratiebestand in met de databasetoegang en wat extra PHP aan het einde. De extra constants zorgen ervoor dat de debuggingopties aanstaan voor het testen. We hebben een gedetailleerde handleiding geschreven voor als je meer wil leren over debugging in WordPress.

Het derde commando maakt de database aan (WP-CLI gebruikt hiervoor de databasetoegangsgegevens van het config bestand) en ten slotte installeren we WordPress met behulp van een aantal parameters.

WordPress kern opnieuw installeren

Ook kan je met WP-CLI de WordPress kern opnieuw installeren. Met het volgende commando kan je de WordPress core downloaden zonder de standaardthema’s en plugins.

wp core download --skip-content --force

WordPress URL wijzigen

Er zijn veel scenario’s te bedenken waarin je je WordPress URL zou willen wijzigen. Misschien verander je van domein, verhuis je naar een subdomein, stap je van www over naar niet-www, verplaats je wat bestanden of migreer je van HTTP naar HTTPS. Hoe het ook zij, hiervoor kan je makkelijk het commando wp option update gebruiken. Hieronder staat een voorbeeld:

wp option update home 'http://example.com'
wp option update siteurl 'http://example.com'

Lijst van huidige plugins met details

Om een lijst te krijgen van de huidige plugins op je site, kan je het volgende commando gebruiken. In dit voorbeeld zijn op onze site de plugins Yoast SEO en Schema geïnstalleerd. Ook retourneert het commando de status (active/deactivated), of er een update beschikbaar is en de huidige versie.

wp plugin list
WP-CLI plugin lijst
WP-CLI plugin lijst

Meerdere plugins installeren

Om meerdere plugins te installeren, kan je parameters “stapelen”. Dit is een voorbeeld waarmee 3 plugins worden gedownload en geactiveerd.

wp plugin install advanced-custom-fields jetpack ninja-forms --activate

Let op dat de namen van de plugins afkomstig zijn van hun naam in de repository. De makkelijkste manier om achter deze namen te komen is om hun pagina’s te bezoeken en de URL te bekijken of door wp plugin search searchterm te gebruiken. Hiermee krijg je een lijst te zien in de terminal.

WordPress plugin repository URL
WordPress plugin repository URL

Indien nodig kan je ook oudere versies van de WordPress plugins installeren met behulp van het --version attribute.

wp plugin install wordpress-seo --version=4.8 --activate

Nog cooler is dat je plugins kan installeren van externe bestanden en niet alleen de repository. Dit is is handig als je zelf een plugin ontwikkelt of een premium plugin gebruikt. Met de volgende opdracht worden twee plugins van de repository en één van een Amazon S3 server geïnstalleerd.

wp plugin install advanced-custom-fields jetpack https://d1qas1txbec8n.cloudfront.net/wp-content/uploads/2015/06/23073607/myplugin.zip --activate

Meerdere plugins deactiveren

Om een enkele plugin te deactiveren, kan je het volgende commando uitvoeren.

wp plugin deactivate wordpress-seo

Om alle plugins tegelijkertijd te deactiveren kan je het volgende commando gebruiken.

wp plugin deactivate --all
Alle plugins deactiveren in WP-CLI
Alle plugins deactiveren in WP-CLI

Deze bovenstaande opdracht kan van pas komen om compatibiliteitsproblemen op te lossen of als je gewoon alle plugins in één keer wil deactiveren. Je kan ze vervolgens al testende de plugins één voor één weer activeren.

Plugins updaten

Ook kan je handmatig WordPress plugins updaten. Zie onderstaand voorbeeld:

wp plugin update wordpress-seo
Handmatig WordPress plugins updaten met WP-CLI
Handmatig WordPress plugins updaten met WP-CLI

Database zoeken en vervangen

Het migreren van een site door de database te copy/pasten wordt bemoeilijkt door het feit dat de database serialized arrays bevat. Als je alle instanties van http://testsite.com door http://livewebsite.com moet vervangen, dan kloppen de serialized arrays niet meer, omdat het aantal strings niet overeenkomt.

Het commando search-replace zorgt allereerst dat de array niet meer serialized is, vervolgens voert het een zoek-en-vervangopdracht uit om daarna de array weer als serialized in te stellen. Je kan dit doen met een eenvoudig commando:

wp search-replace oldstring newstring

Met aanvullende parameters kan je nog veel meer doen. Je kan bijvoorbeeld met --dry-run een preview krijgen van wat je gaat vervangen.

Import en export

Er zijn twee manieren om content te exporteren met WP-CLI. Je kan een XML bestand maken, zoals de WordPress exporttool doet, of je kan de “raw” database exporteren/importeren. Voor mijn dagelijkse routine vind ik de tweede optie een stuk fijner; het komt goed van pas bij het synchroniseren van sites.

wp db export is alles wat je nodig hebt om een SQL bestand te maken en wp db import file.sql is alles wat je nodig hebt om het te importeren. Het werkt erg fijn, maar zorg wel dat je niet iets overschrijft wat je nodig hebt. Het importeren leegt in feite de bestaande database om in plaats daarvan het opgegeven SQL bestand te gebruiken.

Gebruikers toevoegen, bijwerken, verwijderen

Je kunt gebruikers toevoegen, bijwerken en verwijderen met WP-CLI.

# List user IDs
$ wp user list --field=ID
1

# Create a new user.
$ wp user create john [email protected] --role=author
Success: Created user 3.
Password: HOh897%*(&^R8

# Update an existing user.
$ wp user update 123 --display_name=Beth --user_pass=bethpass
Success: Updated user 123.

# Delete user 123 and reassign posts to user 443
$ wp user delete 123 --reassign=443
Success: Removed user 123 from http://example.com

Rollen en bevoegdheden beheren

Je kan met WP-CLI gemakkelijk rollen beheren met het commando wp role. Dit is een vrij handige functie. Je kan bijvoorbeeld testen hoe je plugin werkt met custom rollen, zonder dat je de rollen aan hoeft te maken binnen je plugin.

wp role create organizer Organizer
wp cap list 'editor' | xargs wp cap add 'organizer'
wp cap add 'organizer' 'manage-events'

De bovenstaande commando’s creëren een nieuwe rol (Organisator), voegen alle bevoegdheden van de Editor rol toe en voegen vervolgens een nieuwe bevoegdheid toe: evenementen beheren. Met de juiste commando’s kun je WP-CLI gebruiken om je WordPress wachtwoord te wijzigen.

Testdata genereren

Ik ben fan van faker-achtige functies – functies die dummycontent toevoegen aan je site en die je kan gebruiken voor tests. WP-CLI heeft er een paar ingebouwd. Hier zijn een aantal functies waarmee je gebruikers, terms en posts kan genereren.

wp user generate --count=5 --role=editor
wp user generate --count=10 --role=author
wp term generate --count=12
wp post generate --count=50

WP-Cron events beheren

Ook kan je WP-Cron events en/of WordPress Cron jobs beheren in WP-CLI. Het volgende commando geeft je bijvoorbeeld de huidige lijst met cron events.

wp cron event list
wp-cron event list
wp-cron event list

Transients verwijderen

Je kan zelfs een of alle transients verwijderen en wissen. Dit doe je met het volgende commando.

wp transient delete --all

Als je multisite gebruikt, is een iets ingewikkelder commando vereist. Standaard controleert het commando alleen de tabel wp_options. Het controleert niet wp_1_options, wp_2_options, etc.

wp transient delete --all --network && wp site list --field=url | xargs -n1 -I % wp --url=% transient delete --all

De wp_options tabel opschonen

De wp_options tabel is een veelvoorkomende boosdoener die zorgt voor langzame query-tijden op je site dankzij de autoloaded data die wordt achtergelaten door plugins en thema’s. Bekijk dit geweldige artikel van WP Bullet over hoe je WP-CLI kan gebruiken om je wp_options tabel kan opschonen.

WordPress revisies verwijderen

Op grote sites kan het aantal WordPress revisies al snel oplopen tot duizenden rijen in je database die niet nodig zijn. Met WP-CLI kan je berichtrevisies verwijderen. Dit is een voorbeeld van het commando:

$ wp post delete $(wp post list --post_type='revision' --format=ids)
WordPress revisies verwijderen met WP-CLI
WordPress revisies verwijderen met WP-CLI

Controle over onderhoudsmodus

Vanaf WP-CLI v.2.2.0 is het ook mogelijk om de onderhoudsmodus te beheren op je WordPress site. Voorbeeld:

wp maintenance-mode activate
wp maintenance-mode deactivate
wp maintenance-mode status

Data indexeren met Elasticsearch

Elasticsearch is een open-source full-text zoekmachine. Het wordt gebruikt om data te indexeren en deze data ongelooflijk snel te doorzoeken. Elasticsearch wordt door Kinsta aangeboden als add-on. Je kan via SSH indexeren door gebruik te maken van ElasticPress WP-CLI commando’s. Voorbeeld:

wp elasticpress index [--setup] [--network-wide] [--posts-per-page] [--nobulk] [--offset] [--show-bulk-errors] [--post-type]

Werken met meertalige sites

WP-CLI 2.0.0 bevat een nieuwe reeks commando van wp i18n voor degenen onder jullie die werken met meertalige sites. Je kan hiermee bijvoorbeeld een POT bestand maken voor een WordPress plugin of thema.

wp i18n make-pot <source> [<destination>] [--slug=<slug>] [--domain=<domain>] [--ignore-domain] [--merge[=<file>]] [--exclude=<paths>] [--skip-js]

Bekijk i18n commando documentatie.

WP-CLI gebruiken met WooCommerce

Werk je met e-commerce sites? 🛒 We raden aan om de verbazingwekkende WP-CLI WooCommerce ontwikkelingsgids van Robot Ninja te checken voor snelle en makkelijke commando’s die je kan gebruiken. Je kan met WP-CLi bijvoorbeeld lijsten maken van klanten, bestellingen en zelfs in bulk producten maken.

WP-CLI op afstand gebruiken

Een van de coolste dingen die je kan doen met WP-CLI is je remote WordPress installaties beheren. Dit is voor elke websitebeheerder een droom die uitkomt.

Om WP-CLI-opdrachten zonder problemen via SSH op een remote server uit te voeren, had je eerder de wp-cli-ssh addon commando nodig. Maar vanaf v.0.24.0 maakt dit nu deel uit van WP-CLI zelf! 👏

Belangrijk: Je moet WP-CLI hebben geïnstalleerd, zowel op de computer waarop je het commando uitvoert, als op je server.

Remote servers configureren

Je kan de servers globaal of lokaal configureren. Gebruik het bestand config.yml om ze wereldwijd te configureren. Ook kan je de bestanden wp-cli.yml of wp-cli.local.yml gebruiken in je huidige werkmap.

De configuratie de servers werkt ongeveer als volgt. Plak dit in een van de genoemde bestanden:

ssh:

  staging:
    cmd: ssh %pseudotty% [email protected] %cmd%
    url: http://myseite.com
    path: /www/path/to/site/root

Zodra dit allemaal is gebeurd, kan je het volgende commando typen om WordPress op je externe site te updaten:

wp ssh core update --host=staging

Als je veel sites bezit of beheert, dan is dit natuurlijk fantastisch! Het script vraagt om een wachtwoord, maar als je RSA sleutels gebruikt om in te loggen, kan je ook dat opgeven. Bekijk dit artikel om dat in te stellen.

Bash scripts gebruiken

Bash scripts besparen je nog meer tijd door taken te automatiseren. Weet je nog hoeveel opdrachten je moest typen om WordPress te installeren? Je kan dat doen met een enkel bash script. Maak in een map een install.sh bestand aan. Plak dezelfde code die we eerder hadden en sla het op.

wp core download
wp core config --dbname=mydbname --dbuser=mydbuser --dbpass=mydbpass --dbhost=localhost --dbprefix=whebfubwef_ --extra-php <<PHP
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
PHP
wp db create
wp core install --url=http://siteurl.com --title=SiteTitle --admin_user=username --admin_password=mypassword [email protected]

Het enige wat je hoeft te doen is bash install.sh typen en alles wordt voor je gedaan, zonder enige tussenkomst. Als je veel sites beheert, dan kan je al je omgevingen instellen en aanmaken en een bash script als deze volgen:

wp ssh core update --host=clientA
wp ssh core update --host=clientB
wp ssh core update --host=clientC
wp ssh core update --host=clientD

Wanneer er een nieuwe WordPress versie uitkomt, kan dit je veel tijd besparen! Je kan in principe doen wat je wil met WP-CLI. Je kan zelfs regelmatig thema’s en plugins bijwerken om een aantal klantensites tegelijk.

Samenvatting

WP-CLI is een droom die uitkomt voor ontwikkelaars en websitebeheerders. Als ontwikkelaars kunnen we in een handomdraai testsites maken, testcontent toevoegen en allerlei soorten import/export magie uitvoeren. Sitebeheerders kunnen met enkele opdrachten site-updates en andere taken voor meerdere sites tegelijkertijd afhandelen. Bekijk ook zeker de release notes van WP-CLI v2!

Als je WP-CLI nog niet hebt geprobeerd, raad ik je zeker aan om het eens te proberen. Er zijn al een heleboel community commando’s als WP-CLI-SSH die nog meer geweldige functies toevoegen! Als je tegen problemen aanloopt, bekijk dan de WP-CLI documentatie over veelvoorkomende problemen.

Vergeet niet dat Kinsta’s architectuur, die op Google Cloud is gebaseerd, WP-CLI out-of-the-box ondersteunt. Als je de modernste WordPress hostingarchitectuur wil proberen en toegang wil krijgen tot prachtige tools als WP-CLI, probeer dan onze managed WordPress hosting.

Daniel Pataki

Hi, my name is Daniel, I'm the CTO here at Kinsta. You may know me from Smashing Magazine, WPMU Dev, Tuts+ and other WordPress/Development magazines. Aside from WordPress and PHP I spend most of my time around Node, React, GraphQL and other technologies in the Javascript space.

When not working on making the best hosting solution in the Universe I collect board games, play table football in the office, travel or play guitar and sing in a pretty bad band.