WP-CLI · automatisering · deploys · multisite · CI/CD
WP-CLI specialist
Stop met klikken in wp-admin. Eén commando vervangt een uur handwerk — voor deploys, migraties, search-replace, bulk-acties en multisite-beheer. Herhaalbaar, scriptbaar en in Git.
- 25+ jr
- Web-ervaring
- 100+
- Custom commands
- Multisite
- Network-wide
- CI/CD
- Geïntegreerd
Waarom een WP-CLI specialist
WP-CLI installeren kan iedereen — er waarde uit halen is een vak
wp plugin update --all leren typen kost vijf minuten. Een betrouwbare deploy-pipeline, een idempotente migratie van 80.000 records, een netwerk-brede roll-out met rapport per subsite of een cron-architectuur die ook 's nachts draait — daar zit het echte werk. Daar voeg ik waarde toe.
Uren naar seconden
Handmatige acties in wp-admin die elke week terugkomen — bulk updates, exports, herstelacties — worden één scriptregel die je 's nachts laat draaien of in een CI-pipeline triggert.
Herhaalbaar en idempotent
Elke migratie en elke deploy verloopt exact hetzelfde op staging, acceptatie en productie. Geen 'het werkte toch op staging?'-discussies meer.
Veiliger dan handmatig klikken
Geen muisslip in de productie-admin, geen vergeten search-replace bij een domein-migratie, geen handmatige SQL-queries. Alles loopt via getest WP-CLI met logging en exit-codes.
Onder versiebeheer
Commands en scripts staan in Git naast de rest van de codebase. Code-review, changelog en rollback — net als applicatie-code.
Inhakend op WordPress hooks
Custom WP-CLI commands draaien met volledige WordPress-context: alle hooks, filters, plug-ins en thema's beschikbaar — geen losgekoppelde scripts die data corrumperen.
Schaalbaar over multisite
Eén commando over 40 of 400 subsites met --url of wp site list | xargs. Voorraadupdates, theme-switches en plug-in-rollouts in één run.
Welk handwerk wil jij als eerste kwijt? Ik denk graag mee — gewoon Maarten zelf.
Hoe het eruit ziet
Van shell-one-liners tot eigen commands met flags
WP-CLI is krachtig out-of-the-box en nog krachtiger met eigen commands. Hieronder een paar real-world snippets en de opbouw van een custom command in PHP.
WP-CLI · shell
scriptbaarVier veelvoorkomende klussen — elk één regel, herhaalbaar en logbaar.
# Domein-migratie op productie — serialised-safe
wp search-replace 'https://oud.nl' 'https://nieuw.nl' \
--all-tables --precise --recurse-objects \
--skip-columns=guid --report-changed-only --dry-run
# Bulk-prijsherberekening WooCommerce, in batches met progress
wp acme:prices:recalc --batch=500 --resume
# Multisite plug-in roll-out (40 subsites in één run)
wp site list --field=url | xargs -I {} -P 4 \
wp --url={} plugin activate acme-leadrouter
# Deploy-finish: cache & sitemap warm
wp cache flush && wp transient delete --all
wp acme:warmup --top=200 --concurrency=8Custom command · PHP
batched · resumableEigen command met flags, progress-bar, --dry-run en --resume.
<?php
namespace Acme\Cli;
use WP_CLI;
use WP_CLI\Utils;
/**
* Herberekent productprijzen in batches.
*
* ## OPTIONS
* [--batch=<n>] Aantal per batch. default: 500
* [--resume] Hervat na een eerdere afbreking.
* [--dry-run] Toon wat er zou gebeuren, schrijf niets.
*/
class Prices_Command {
public function recalc( $args, $assoc ): void {
$batch = (int) ( $assoc['batch'] ?? 500 );
$dry = isset( $assoc['dry-run'] );
$offset = isset( $assoc['resume'] ) ? (int) get_option( 'acme_recalc_offset', 0 ) : 0;
$total = wc_get_products( [ 'limit' => -1, 'return' => 'ids' ] );
$bar = Utils\make_progress_bar( 'Recalc', count( $total ) );
foreach ( array_chunk( $total, $batch ) as $chunk ) {
foreach ( $chunk as $id ) { $this->process( $id, $dry ); $bar->tick(); }
$offset += count( $chunk );
update_option( 'acme_recalc_offset', $offset, false );
wp_cache_flush();
}
$bar->finish();
WP_CLI::success( "Klaar — {$offset} producten verwerkt." );
}
}
WP_CLI::add_command( 'acme prices', Prices_Command::class );Specifieke actie waar je een command voor wil? Ik denk graag mee — gewoon Maarten zelf.
Herkenbaar?
WordPress-pijn die WP-CLI oplost
Bijna elk WP-CLI-traject begint met één van deze klachten. Goede kans dat jij er ook minstens één herkent.
Elke deploy is handwerk
Pijn: Bij elke release iemand die FTP'ert, wp-admin in duikt, plug-ins activeert, een search-replace voor de URL doet en de cache leegt. Foutgevoelig en pas 's avonds te doen.
Aanpak: Eén deploy-script met WP-CLI: code uitrollen, database-migraties via wp eval-file, search-replace, cache flush, healthcheck — in een minuut, herhaalbaar.
Database search-replace gaat fout
Pijn: Bij een domein-migratie wordt de URL met phpMyAdmin overal vervangen — behalve in de serialised data. Resultaat: gebroken widgets, kapotte Gutenberg-blokken en menu's die niet werken.
Aanpak: wp search-replace begrijpt serialised PHP. Eén commando met --dry-run, daarna de echte run, met log van alle wijzigingen per tabel.
Bulk-acties via een knop in wp-admin
Pijn: 10.000 producten herberekenen, prijzen herstellen, categorieën herorganiseren — via de admin UI duurt het uren, time-out na time-out, browser-tab open laten en hopen.
Aanpak: Custom WP-CLI command met batches, progress-bar en --resume. Draait stabiel op de server zonder browser, met geheugen onder controle.
Cron-taken die niet draaien
Pijn: WP-Cron triggert op pageviews. Op een rustige nacht draait je 'cron'-import niet, of pas om 9:00 als er weer bezoek is — terwijl de feed om 02:00 actueel moet zijn.
Aanpak: WP-Cron uitschakelen, system cron + wp cron event run gericht inplannen. Heartbeat-monitoring, exit-codes en alerts als een job faalt.
Multisite-beheer kost een hele dag
Pijn: Plug-in updaten op 40 subsites, een instelling wijzigen, een feature flag aanzetten — handmatig per site in het netwerk-dashboard.
Aanpak: wp site list --field=url | xargs -I{} wp --url={} ... — alle subsites in één run, met overslag-logic voor sites die uitgesloten moeten worden.
Lokale dev-omgeving opzetten duurt een halve dag
Pijn: Nieuwe developer in het team: database-dump downloaden, importeren, URL search-replace, gebruikers anonimiseren, uploads syncen, dev-plug-ins activeren — allemaal handmatig.
Aanpak: Eén wp dev:bootstrap script dat alles doet: dump pullen, importeren, anonimiseren, search-replace naar .test, dev-tools activeren. Onboarding in 5 minuten.
WP-CLI inzetten of bestaande scripts professionaliseren?
Eén ervaren WordPress-developer voor WP-CLI, automatisering en deploys.
Een gesprek over wat je nu handmatig doet, welke deploys haperen en hoe een WP-CLI-aanpak eruit zou zien — concreet, geen sales-trechter.
Onder de motorkap
Deploy-pipeline en cron-architectuur die altijd draait
WP-CLI komt pas écht tot z'n recht in CI/CD en system-cron. Hieronder een typische deploy-pipeline en cron-tabel die je kunt hergebruiken.
CI/CD · GitHub Actions
deploy-on-mergePush naar main → WP-CLI doet de zware stappen — voorspelbaar en gelogd.
# .github/workflows/deploy.yml — auszug
jobs:
deploy:
steps:
- uses: actions/checkout@v4
- name: Sync code
run: rsync -az --delete ./ web@prod:/var/www/site
- name: Composer install (no-dev)
run: ssh web@prod "cd /var/www/site && composer install --no-dev -o"
- name: Database migrate
run: ssh web@prod "wp --path=/var/www/site eval-file bin/migrate.php"
- name: Search-replace env URLs
run: ssh web@prod "wp --path=/var/www/site search-replace
'{{STAGING_URL}}' '{{PROD_URL}}' --all-tables --skip-columns=guid"
- name: Cache flush + warmup
run: ssh web@prod "wp cache flush && wp acme:warmup --top=200"
- name: Healthcheck
run: ssh web@prod "wp acme:health --strict" || exit 1System cron · WP-CLI jobs
heartbeat okEchte cron in plaats van WP-Cron — draait ook 's nachts zonder bezoek.
- */15 * * * *wp acme:stock:sync --quietsync
- 0 2 * * *wp acme:feed:rebuildrebuild
- 5 3 * * *wp transient delete --expiredcleanup
- 0 4 * * 1wp acme:secrets:rotatesecurity
- 30 4 * * *wp acme:reports:export --to=s3report
- */5 * * * *wp cron event run --due-nowcron
Nu nog releases via FTP en WP-Cron? Ik denk graag mee — gewoon Maarten zelf.
Wat het oplevert
Voorbeelden van WP-CLI-trajecten
WP-CLI hoort iets op te leveren — minder handwerk, betrouwbaardere deploys, snellere migraties, geen paniek meer bij grote operaties. Dit zijn voorbeelden als inspiratie voor wat in jouw situatie kan.
Voorraad-sync via WP-CLI cron
ERP-export elke 15 minuten via een custom wp acme:stock:sync command. Vervangt een wankele WP-Cron-import die 1 op de 5 keer niet draaide. Magazijn vertrouwt nu de voorraad in de shop.
Deploy-pipeline in GitHub Actions
Push naar main → build, rsync, wp db migrate, wp search-replace, wp cache flush, wp acme:warmup. Van 'release-avond' naar deploy-on-merge in 8 minuten.
Bulk-prijsherberekening WooCommerce
120.000 producten, nieuwe BTW-regels: custom wp acme:prices:recalc met batches van 500, progress-bar en --resume. Draaide in 14 minuten op productie zonder downtime.
Domeinmigratie zonder kapotte content
wp search-replace met --dry-run audit, daarna live run over 18 tabellen incl. ACF, Gutenberg en menu's. Geen handmatig fix-werk achteraf — vorige migratie kostte 3 dagen, deze 20 minuten.
Multisite plug-in roll-out
Custom command dat over 40 regio-sites een plug-in activeert, settings seedt en een healthcheck draait — met rapport per site. Eerder een dag werk, nu één commit.
Betrouwbare cron via system cron
WP-Cron uitgezet, alle scheduled events via system cron + wp cron event run. Heartbeat naar uptime-monitor. 100% draai-betrouwbaarheid waar het eerst 70% was.
Dev-bootstrap voor nieuwe collega's
Eén script: prod-dump pullen, anonimiseren, importeren, search-replace, dev-plug-ins aan. Nieuwe developer is in 5 minuten productief in plaats van een halve dag.
Geautomatiseerde security-rotatie
Custom wp acme:secrets:rotate dat API-keys, salts en service-accounts roteert en wp-config.php-fragmenten herschrijft. Maandelijks geautomatiseerd in plaats van vergeten.
Reporting export voor management
Custom command exporteert orders, conversies en SKU-performance naar S3 als CSV — wekelijks via cron. Vervangt handmatige exports en plug-in-rapportages die uren kostten.
Content-import van legacy CMS
Migratie van 80.000 artikelen met afbeeldingen, taxonomieën en redirects via wp acme:import. Idempotent, herstartbaar, met audit-trail per item.
WP-CLI fixtures in pull requests
Elke PR krijgt een review-omgeving die via WP-CLI fixtures een schone state krijgt — productdata, gebruikers, settings. Reviewers zien feature in 2 klikken.
SEO-redirect-import op grote schaal
12.000 redirects vanuit CSV via custom wp acme:redirects:import. Voorkomt 404's na re-platforming en hield organisch verkeer in stand (+27% i.p.v. dip).
Welk voorbeeld lijkt het meest op jouw situatie? Ik denk graag mee — gewoon Maarten zelf.
Wat ik bouw
WP-CLI-onderdelen die regelmatig terugkomen
Custom WP-CLI commands
Eigen commands in PHP onder WP_CLI::add_command — met flags, args, --format, --porcelain en help-tekst.
Deploy-scripts
Bash, GitHub Actions of GitLab CI — code uitrollen, migraties draaien, cache flushen, healthcheck.
Database-migraties
Schema-wijzigingen via wp eval-file met up/down, gelogd en herhaalbaar.
Search-replace op maat
URL-migraties, table-prefix changes, multisite-domain swaps — serialised-safe.
Multisite-automatisering
Network-wide updates, per-site settings, site-creation en archive-flows.
Cron-jobs (echt) automatiseren
WP-Cron vervangen door system cron + wp cron event run met monitoring.
Bulk import/export
CSV/JSON/XML in en uit, met batches, progress-bar en --resume.
CI/CD integratie
WP-CLI in GitHub Actions, GitLab CI of Bitbucket Pipelines voor preview-omgevingen.
Hosting-integratie
Hooks voor Kinsta, WP Engine, Cloudways, SiteGround — caches, backups en restores.
Maintenance-commands
wp acme:health, wp acme:cleanup, wp acme:secrets:rotate — onderhoud als code.
Fixtures & seeders
Reproduceerbare test-data voor staging en review-omgevingen.
Performance-commands
Object-cache flush, transient cleanup, image-regenerate, sitemap-warmup.
Specifiek onderdeel in je hoofd? Ik denk graag mee — gewoon Maarten zelf.
Koppelingen
Tools waar WP-CLI dagelijks mee samenwerkt
GitHub Actions / GitLab CI / Bitbucket
WP-CLI in deploy- en review-pipelines.
Kinsta / WP Engine / Cloudways
Provider-hooks voor cache en backups.
Cloudflare / Bunny / Fastly
Edge-cache purge na deploy of content-update.
Sentry / Bugsnag / Slack
Foutmeldingen en run-rapporten in je werkstroom.
AWS S3 / R2 / Backblaze B2
Backups en exports naar object-storage.
Exact / AFAS / SnelStart
Voorraad- en orderdata-sync via WP-CLI cron.
Algolia / Meilisearch / Elastic
Index-rebuilds en delta-updates via commands.
HubSpot / Mailchimp / ActiveCampaign
Contact-sync vanuit WordPress via WP-CLI batches.
Uptime Robot / Better Stack / Healthchecks.io
Heartbeat-monitoring van scheduled commands.
Andere tool? Vraag het even. Ik denk graag mee — gewoon Maarten zelf.
Hoe het werkt
Een WP-CLI-traject in 4 stappen
- 01
Audit & inventarisatie
Welk handmatig werk komt elke week terug? Welke deploys, migraties en cron-jobs zijn er nu en waar gaat het mis?
- 02
Voorstel & scripts
Concreet plan met de eerste set commands, deploy-pipeline en cron-overzicht — zonder vage uurschattingen.
- 03
Bouw op staging
Commands in Git, met --dry-run, tests en documentatie. Elke wijziging via PR en code-review.
- 04
Live & overdracht
Pipeline in productie, monitoring aan, korte handleiding voor je team en onderhouds-afspraak.
Klaar om de eerste stap te zetten? Ik denk graag mee — gewoon Maarten zelf.
Veelgestelde vragen
Wat is WP-CLI en waarom heb ik het nodig?
WP-CLI is de officiële command-line interface voor WordPress. Alles wat je in wp-admin kunt klikken — en veel meer — kan via één commando vanaf de server. Onmisbaar zodra je serieus deploys, migraties, multisite-beheer of bulk-acties wilt automatiseren.
Wanneer loont een custom WP-CLI command?
Zodra een handmatige actie meer dan twee keer per maand terugkomt, langer dan 10 minuten kost, of foutgevoelig is. Bulk-prijsupdates, content-imports, multisite-rollouts, deploy-stappen en herstelacties zijn typische kandidaten.
Vervangt WP-CLI cron de gewone WP-Cron?
Ja, en dat zou eigenlijk standaard moeten zijn op een serieuze site. WP-Cron triggert op pageviews — onbetrouwbaar. Zet WP-Cron uit (DISABLE_WP_CRON), plan jobs via system cron met wp cron event run, en monitor met heartbeats. Resultaat: 100% draai-betrouwbaarheid.
Werkt WP-CLI ook op multisite?
Heel goed. Met --url=https://sub.example.com draai je een commando tegen één subsite. Met wp site list --field=url | xargs over alle subsites tegelijk. Multisite-beheer (plug-in roll-outs, settings-sync, audits) wordt daarmee schaalbaar.
Hoe pas je WP-CLI toe in een deploy-pipeline?
In GitHub Actions of GitLab CI draait WP-CLI als stap: code uitrollen, wp db migrate, wp search-replace voor environment-URL's, wp cache flush en een wp acme:healthcheck. Faalt een stap → exit-code != 0 → pipeline faalt en rolt terug.
Wat is het verschil met phpMyAdmin search-replace?
WP-CLI's wp search-replace begrijpt serialised PHP-data (widgets, ACF-velden, Gutenberg-blokken, menu's). phpMyAdmin doet domme string-replace en breekt daarmee serialised arrays. Voor URL-migraties is alleen WP-CLI veilig.
Kun je WP-CLI commands testen?
Ja. Custom commands schrijf ik in PHP-klassen die los te unit-testen zijn. Voor end-to-end gebruik ik wp-cli/scaffold-package-command + bats/PHPUnit op een wegwerp-database. Elke command krijgt --dry-run waar het kan.
Werkt WP-CLI met WooCommerce?
Volledig. WooCommerce heeft eigen WP-CLI commands (wp wc), plus alle WordPress-commands. Custom commands kunnen producten, bestellingen, klanten en voorraad raken — ideaal voor migraties, prijsherberekeningen en periodieke exports.
Hoe zit het met geheugen en time-outs op grote operaties?
Commands draaien op de CLI-PHP-config (vaak hoger memory_limit, geen max_execution_time). Bovendien gebruik ik batches, generators en wp_cache_flush() tussendoor om geheugen onder controle te houden. 100k+ items zonder zorgen.
Kan ik later zelf commands toevoegen?
Ja. De commands zitten als plug-in of in een aparte src/ map met PSR-4 autoload. README en code-comments waar het ertoe doet. Andere PHP-developers kunnen er gewoon in werken.
Werk je ook white-label voor bureaus?
Regelmatig. Voor agencies bouw ik de WP-CLI-laag onder een grote site of multisite-netwerk — code in jullie of mijn repo, demo's per sprint, communicatie via jullie project-lead.
Wat als WP-CLI niet beschikbaar is op mijn hosting?
Bij serieuze WordPress-hosting (Kinsta, WP Engine, Cloudways, SiteGround, Hostnet, etc.) staat het standaard aan. Bij shared hosting zonder SSH adviseer ik vaak een migratie — het scheelt op termijn meer dan het kost.
WP-CLI inzetten of bestaande scripts professionaliseren?
Eén ervaren WordPress-developer voor WP-CLI, automatisering en deploys.
Een gesprek over wat je nu handmatig doet, welke deploys haperen en hoe een WP-CLI-aanpak eruit zou zien — concreet, geen sales-trechter.
