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.

Bekijk voorbeelden ↓
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

scriptbaar

Vier 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=8

Custom command · PHP

batched · resumable

Eigen 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.

Bekijk klantcases

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-merge

Push 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 1

System cron · WP-CLI jobs

heartbeat ok

Echte 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.

−6u/wk

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.

8 min

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.

120k

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.

0 broken

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.

40 → 1

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.

100%

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.

5 min

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.

0 lek

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.

−92%

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.

x10

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.

review-ready

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.

+27%

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

  1. 01

    Audit & inventarisatie

    Welk handmatig werk komt elke week terug? Welke deploys, migraties en cron-jobs zijn er nu en waar gaat het mis?

  2. 02

    Voorstel & scripts

    Concreet plan met de eerste set commands, deploy-pipeline en cron-overzicht — zonder vage uurschattingen.

  3. 03

    Bouw op staging

    Commands in Git, met --dry-run, tests en documentatie. Elke wijziging via PR en code-review.

  4. 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.

Bekijk klantcases
Maarten Soetens

Even sparren over jouw project?

Korte lijntjes, eerlijk advies, geen sales-praat. Ik denk vrijblijvend met je mee — gewoon Maarten zelf.

Geen automatisch antwoord — ik mail of bel je persoonlijk terug.