> wp-cli-ops
WordPress operations with WP-CLI — search-replace, plugin/theme management, cron, cache, DB export/import, automation. Always-active rules when using wp commands.
curl "https://skillshub.wtf/alessioarzenton/claude-code-wp-toolkit/wp-cli-ops?format=md"WP-CLI and Operations
Skill for the safe and effective use of WP-CLI in day-to-day WordPress operations. Covers migrations, plugin/theme management, cron, cache, database, and automation patterns.
When to use
Apply this skill when the task involves:
wp search-replace(URL change, domain migration, protocol switch)- Database export/import (
wp db *) - Plugin and theme management (install, activate, update)
- Cron: list events, manual execution, debugging
- Cache and rewrite flush
- Automation scripts and
wp-cli.yml
Prerequisites
Before starting, verify:
- Environment: dev, staging, or production — and whether it is safe to run commands
- Targeting:
--path=<wordpress-root>to point to the correct installation - Constraints: acceptable downtime, DB write permissions, maintenance window
Procedure
0) Guardrails — confirm environment and blast radius
WP-CLI commands can be destructive. Before any write operation:
- Confirm the environment (dev/staging/prod)
- Verify targeting — does the path point to the right site?
- Back up before risky operations
# Verify where you are.
wp core version
wp option get siteurl
wp option get blogname
# Verify you are targeting the right site.
wp eval "echo get_home_url();"
Golden rule: if you are unsure about the environment, do not run write commands.
1) URL migration / search-replace
The safe sequence for changing URLs in the database:
# 1. Back up BEFORE anything.
wp db export backup-pre-migration.sql
# 2. Dry-run — see what would change without touching the DB.
wp search-replace 'https://vecchio-dominio.it' 'https://nuovo-dominio.it' --dry-run --report-changed-only
# 3. If the dry-run is ok, execute.
wp search-replace 'https://vecchio-dominio.it' 'https://nuovo-dominio.it' --report-changed-only
# 4. Flush cache and rewrite after migration.
wp cache flush
wp rewrite flush
Beware of serialized data: wp search-replace handles serialization automatically. Do not use manual SQL tools for search-replace — they break serialized data.
Useful flags:
| Flag | Usage |
|---|---|
--dry-run | Simulate without modifying (ALWAYS first) |
--report-changed-only | Show only tables with changes |
--all-tables | Include non-WordPress tables (custom plugins) |
--precise | Slower but handles complex serializations better |
--skip-columns=<col> | Exclude specific columns |
2) Plugin and theme management
# List plugins with status.
wp plugin list --format=table
# Install and activate.
wp plugin install advanced-custom-fields --activate
# Update all (dev/staging).
wp plugin update --all
wp theme update --all
# Deactivate a plugin.
wp plugin deactivate plugin-problematico
# Check status.
wp plugin status
In production: update one plugin at a time, verify after each one.
3) Database — export, import, query
# Full export (backup).
wp db export backup-$(date +%Y%m%d-%H%M%S).sql
# Export with gzip (smaller files).
wp db export - | gzip > backup.sql.gz
# Import.
wp db import backup.sql
# Direct queries (read-only for debugging).
wp db query "SELECT COUNT(*) FROM $(wp db prefix)posts WHERE post_type = 'bando' AND post_status = 'publish'"
# Database size.
wp db size --tables --format=table
Never run wp db reset in production without a verified backup.
4) Cron — diagnosis and debugging
# List all scheduled cron events.
wp cron event list --format=table
# Run a single event (for debugging).
wp cron event run mio_plugin_cron_event
# Count "due now" events (if too many, there is a problem).
wp cron event list --format=count --fields=hook --status=due
# Test: is the cron system working?
wp cron test
- If there are too many "due now" events: probably
DISABLE_WP_CRONis true but the system crontab is not configured - For heavy tasks: system crontab is better than
wp-cron.phpvia HTTP
5) Cache and rewrite
# Flush object cache.
wp cache flush
# Flush rewrite rules (after changing CPTs/taxonomies).
wp rewrite flush
# Regenerate rewrite rules and show them.
wp rewrite list --format=table
# Flush expired transients.
wp transient delete --expired
6) Automation — wp-cli.yml and scripts
Create a wp-cli.yml in the project root for shared defaults:
# wp-cli.yml
path: web/wp # For Bedrock
url: https://mio-sito.ddev.site
color: true
Automation script with logging and stop-on-error:
#!/bin/bash
set -euo pipefail
LOG_FILE="ops-$(date +%Y%m%d-%H%M%S).log"
log() {
echo "[$(date +%H:%M:%S)] $*" | tee -a "$LOG_FILE"
}
log "Starting operations..."
# Backup.
log "Backing up database..."
wp db export "backup-$(date +%Y%m%d).sql"
# Update plugins.
log "Updating plugins..."
wp plugin update --all 2>&1 | tee -a "$LOG_FILE"
# Flush cache.
log "Flushing cache..."
wp cache flush
wp rewrite flush
log "Operations completed."
Quick reference commands
# Quick site info.
wp core version && wp option get siteurl && wp plugin list --status=active --format=count
# Generate a test admin user (dev only).
wp user create admin-test admin@test.local --role=administrator --user_pass=test123
# Regenerate thumbnails.
wp media regenerate --yes
# Export content as WXR.
wp export --dir=.
# Verify core file integrity.
wp core verify-checksums
# Search for a string in the database.
wp db search "stringa-da-trovare" --format=table
Verification checklist
- Environment confirmed before write operations
- Backup performed before risky operations
-
--dry-runexecuted beforesearch-replace - Site URL correct after migration (
wp option get siteurl) - Plugins/themes in the expected state
- Cron working (
wp cron test) - Cache flushed where necessary
Common errors and solutions
| Problem | Likely cause | Solution |
|---|---|---|
| "This does not seem to be a WordPress installation" | Wrong --path, missing wp-config.php | Verify the path and that WP is installed |
| Search-replace breaks serialized data | Used manual SQL tool instead of wp search-replace | Restore backup, use wp search-replace with --precise |
| Command hits the wrong site | Missing or wrong --url (multisite) | Always specify --url in multisite environments |
| "Error: 'cache' is not a registered wp command" | WP-CLI too old or incomplete installation | Update WP-CLI: wp cli update |
| Cron not executing | DISABLE_WP_CRON true without system crontab | Configure crontab: */5 * * * * wp cron event run --due-now |
What NOT to do
- Do not run
wp db resetorwp db dropwithout a verified backup - Do not run
wp search-replacewithout--dry-runfirst - Do not update plugins in production without having tested in staging
- Do not assume
--pathis correct — always verify withwp option get siteurl - Do not use
wp-cron.phpvia HTTP for heavy tasks in production — use system crontab - Do not run
wp cache flushduring traffic spikes without reason
> related_skills --same-repo
> test-driven-development
Use when implementing any feature or bugfix, before writing implementation code
> systematic-debugging
Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes
> seo
Optimize for search engine visibility and ranking. Use when asked to "improve SEO", "optimize for search", "fix meta tags", "add structured data", "sitemap optimization", or "search engine optimization".
> performance
Optimize web performance for faster loading and better user experience. Use when asked to "speed up my site", "optimize performance", "reduce load time", "fix slow loading", "improve page speed", or "performance audit".