Bulk Find & Replace (WordPress)
wordpress_bulk_replaceApplies the SAME find/replace to MANY WordPress posts/pages in one call, with a mandatory dry-run. wordpress_update_post's replace works well but takes a single id, so fixing the same defect on 11 pages meant 11 calls; this does it once, and its confirm=false PREVIEW shows every page that would change and HOW MANY times before anything is written, so an unintended broad match is visible first. Choose the target pages either with ids=[...] (get them from wordpress_search_content) or with a search filter (search=..., search_in/regex/type/status like wordpress_search_content). replace=[{"find":"old","with":"new"}] — same schema and safety as wordpress_update_post: a missing "with" is refused, never treated as a delete. match="normalized" (top-level or per entry) treats invisible characters (non-breaking space, smart quotes, long dashes) as their plain equivalents. DESTRUCTIVE: confirm=false previews per-page counts and writes NOTHING; confirm=true applies. Elementor/Divi pages whose visible text is not in post_content are reported as skipped, not silently missed. The search filter fetches every post one by one (~1 s each), so on a large site one call stops scanning after about 100 seconds and returns what it found so far with partial=true and next_offset; call again with offset=next_offset (same other arguments) to continue. For big sites it is faster to run wordpress_search_content first and pass its ids here.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | ||
| type | No | ||
| match | No | ||
| regex | No | ||
| offset | No | ||
| search | No | ||
| status | No | publish | |
| confirm | No | ||
| replace | No | ||
| max_scan | No | ||
| site_url | No | ||
| search_in | No | content |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||