BatchPilot lets you delete, duplicate and edit WordPress content in bulk, and it shows you what will change before anything does. You preview each batch before it runs, and the History screen keeps a record so you can undo it or run it again. It works on posts, pages and other post types, and Pro adds users, comments, taxonomy terms, media, WooCommerce and scheduled runs. I built it for site owners who’d rather have one plugin than separate bulk-delete, bulk-edit and duplicate-post plugins.
Download BatchPilot free on WordPress.org or get BatchPilot Pro free on GitHub.
What the Free Plugin Does
- Delete, duplicate and bulk edit posts, pages and any post type you enable in Settings
- Thirteen filters to narrow a batch: specific IDs, post type, status, author, modified and published dates, taxonomy term, has comments, has featured image, post parent and has children
- A live preview with the matched count and sample rows before anything runs
- Undo for every operation except a permanent delete, from a History screen that also lets you re-run any past batch
- Duplicate keeps meta, taxonomies and the featured image, and can copy child posts too
- Bulk edit changes status, author, publish dates, taxonomy terms, password, comment status or menu order
- Rewrite & Republish: edit a draft copy of a live post, then publish it over the original without changing the original’s ID or URL
- Single-post Duplicate and Copy to a new draft links in the post list and the editor
- Large batches run in the background through Action Scheduler
- Per-operation capabilities, plus WP-CLI commands, a REST API and WordPress Abilities API support
What Pro Adds
BatchPilot Pro takes bulk editing past posts and pages to users, comments, terms, media and WooCommerce, and it runs your regular cleanups on a schedule:
- Targets for users, comments, taxonomy terms and media, plus WooCommerce products and orders when WooCommerce is active
- Delete operations for users (with the option to reassign their content), comments, terms and WooCommerce orders, with undo
- Find and replace across post and page titles, content and excerpts, with optional regex
- Schedules: recurring runs of any target and operation, managed from BatchPilot > Schedules, the REST API or WP-CLI
- Email and webhook notifications after each scheduled run
- A one-click preset for deleting users with no role
Get BatchPilot Pro from GitHub. It’s free while it’s in early access. It needs the free plugin active, and updates show up on the WordPress Updates screen.
Installation
Install the free plugin
- In WordPress, go to Plugins > Add New, search for BatchPilot and click Install Now, then Activate. You can also download it from WordPress.org and upload it.
- Open BatchPilot > Operations in the admin sidebar.
The free plugin needs WordPress 6.9 or later and PHP 7.4 or later.
Install BatchPilot Pro
- Install and activate the free BatchPilot plugin first. Pro builds on it.
- Download
batchpilot-pro.zipfrom the latest release on GitHub. - Go to Plugins > Add New > Upload Plugin, choose the zip and click Install Now, then Activate.
- A new Schedules item appears under BatchPilot, and the Operations builder lists the extra targets and operations.
Pro needs the same WordPress 6.9 and PHP 7.4 as the free plugin. New Pro versions show up on the WordPress Updates screen like any other plugin.
Documentation
Where the screens are
BatchPilot adds a top-level menu to wp-admin with four screens: Dashboard, Operations, History and Settings. Pro adds a fifth, Schedules. The Dashboard shows quick actions, a weekly summary, an environment check (Action Scheduler, Abilities API, WooCommerce HPOS, database tables, WP-Cron), common cleanups and your recent operations.
Build a batch
You build every batch on BatchPilot > Operations in four steps: pick a target, add filters, choose an operation, then preview and execute. The steps open in order, so filters and operations stay greyed out until you pick a target.
Pick a target
The target is the kind of content you’re working on. The free plugin gives you Posts and Pages. Other post types show up once you tick them under Post types in BatchPilot > Settings, or when a plugin registers them. Pro adds Users, Comments, Taxonomy terms and Media, and WooCommerce products and orders when WooCommerce is active.
Add filters
Click Add filter and choose from the list. Each filter you add becomes a row, and all filters must match (AND). For posts and pages the options are:
- Specific IDs
- Post type
- Status: Published, Draft, Pending, Private, Scheduled or Trash, and you can pick several
- Author
- Modified before and Modified after
- Published before and Published after
- Taxonomy term
- Has comments
- Has featured image
- Post parent
- Has children
If you add no filters, the batch matches every item of that target. BatchPilot warns you when that happens.
Choose an operation
The operations available depend on the target. For posts and pages you get Delete, Duplicate, Bulk edit, the two Rewrite & Republish operations, and Find and replace when Pro is active. Each card is tagged undoable when BatchPilot can reverse it. Picking an operation opens its parameters underneath.
Delete content
Delete has one parameter, Permanently delete (skip trash). It’s off by default, so matched items go to the Trash and can be restored from History. Turn it on and items are removed immediately and can’t be undone. BatchPilot > Settings has a Permanent delete by default switch if you want the other default.
Duplicate content
Duplicate copies each matched item with its meta, taxonomies and featured image. The parameters are:
- Status of duplicates, a draft by default
- Author of duplicates, which keeps the original author when left empty
- Title suffix,
(Copy)by default - Also duplicate child posts, which copies hierarchical children along with each post
Bulk edit content
Bulk edit applies the same change to every matched item. Fill in only the fields you want to change. The rest stay as they are.
- Set status to
- Reassign author to
- Shift publish dates by (days), where a negative number pulls dates back
- Add taxonomy terms, which keeps the terms already there
- Remove taxonomy terms
- Set password, where an empty value clears an existing password
- Comments, open or closed
- Menu order
Preview and run a batch
Step 4 previews the batch as you build it. It shows how many items match and a sample of them with ID, title, status and date, and it refreshes whenever you change a filter or parameter. When the preview looks right, click the run button, which is labeled with the count, such as Delete 5 items.
Deletes get extra guards. If the batch has no filters, or matches 100 or more items, you have to tick a confirmation box before the button works. The preview is tied to a signed token that expires after five minutes, so if you leave the screen open too long you’ll be asked to preview again, which stops a stale preview from running against changed content.
Batches that match more items than the async threshold (100 by default) are queued and run in the background. You’ll see a message pointing you to History.
Check history and undo a batch
BatchPilot > History lists every batch with when it ran, the operation, the target, the item count, the status (Queued, Running, Completed or Failed) and who ran it. Runs started by a schedule or WP-CLI show CLI in the User column.
- Details shows the filters, parameters and affected IDs for that batch.
- Undo restores the state BatchPilot saved before the batch ran. Trashed items come back, edited fields return to their old values and duplicates are removed.
- Re-run opens the Operations builder with the same target, filters, operation and parameters filled in, so you can adjust and run it again.
The Dashboard also lists your most recent operations with an Undo button. A user can undo their own batches, and administrators can undo anyone’s.
Start a batch from the post list
On any post list, tick some items and open the Bulk actions menu. BatchPilot adds three entries: BatchPilot: Delete, BatchPilot: Duplicate and BatchPilot: Bulk edit. Choosing one and clicking Apply opens the Operations builder with those items filled in as a Specific IDs filter. Each row also has a Bulk duplicate link that does the same for a single item.
Duplicate a single post
Hover over a post or page in the list and click Duplicate, or click Copy to a new draft in the editor’s Publish box. You get a draft copy right away. Which post types and which user roles see these links is set in BatchPilot > Settings. Administrators always can, and a user also needs permission to edit the post they’re copying.
Rewrite and republish a live post
Rewrite & Republish lets you rework a published post without touching the live version. Click Rewrite & Republish on a published or private post, from the list or the editor. BatchPilot creates a draft copy, flagged in the list as Rewrite copy, while the original shows Rewrite in progress. Edit the copy as long as you like, then publish or schedule it. Publishing replaces the original’s content, and the original keeps its ID and URL. A revision of the original is saved, and you can undo the change from History. If you want the copy again later, the list shows Edit rewrite on the original.
Use presets for common cleanups
The Dashboard has a Common cleanups section with ready-made batches. Click one and the builder opens with the filters filled in:
- Trash drafts older than 90 days
- Trash auto-drafts
- Delete users with no role on this site (Pro)
Change the settings
BatchPilot > Settings controls how batches behave.
- Async threshold: batches matching at least this many items run in the background. Lower it on slow or shared hosting.
- Batch size: how many items are processed per chunk, from 1 to 500.
- Permanent delete by default: skips the Trash for Delete. Undo isn’t available for those batches.
- Post types and Roles: who gets the Duplicate, Copy to a new draft and Rewrite & Republish actions.
- Retention window: how many days BatchPilot keeps operation records and undo snapshots before a daily cleanup removes them.
Control who can use it
BatchPilot registers a capability for each kind of operation: batchpilot_delete, batchpilot_edit, batchpilot_duplicate, batchpilot_move and batchpilot_schedule. Administrators get all of them. You can grant any of them to another role or a single user with a role editor or a few lines of code.
Work with users, comments, terms, media and WooCommerce (Pro)
With Pro active, the target list grows and each new target has its own filters:
- Users: Specific user IDs, Role, Registered before, Registered after and Has no role on this site. The operation is Delete users, with an optional Reassign content to user. Leave it empty and the users’ posts are deleted with them.
- Comments: Specific comment IDs, Status (Approved, Pending, Spam or Trash), Post (ID), Posted before, Posted after and Type (Comment, Pingback or Trackback). The operation is Delete comments, with a Permanently delete (skip trash) switch.
- Taxonomy terms: Specific term IDs, Taxonomy, Parent term (ID) and Has at least one post. The operation is Delete terms.
- Media: Specific attachment IDs, MIME type (Image, Video, Audio or Application), Uploaded before, Uploaded after and Unattached only. The operations are the same Delete and Bulk edit you use on posts.
- WooCommerce products (only when WooCommerce is active): Specific product IDs, Status, Product type (Simple, Variable, Grouped or External / Affiliate), Stock status, On sale right now, Modified before and Modified after. Operations are Delete, Duplicate and Bulk edit.
- WooCommerce orders (only when WooCommerce is active): Specific order IDs, Status, Customer (user ID), Created before and Created after. The operation is Delete orders, with a Permanently delete (skip trash) switch.
Undo works for all of these except permanent deletes. Undoing a user delete recreates each account with its role, meta and password hash, but under a new user ID, and it doesn’t bring back posts that were deleted along with the user. Undoing a term delete recreates the term but doesn’t reattach it to posts.
Find and replace text in bulk (Pro)
With Pro active, posts and pages get a Find and replace operation. Set the target and filters, choose Find and replace, then fill in:
- Find: the text to look for
- Replace with: the replacement, where an empty value deletes the match
- Fields to search: any of
post_title,post_contentandpost_excerpt, withpost_contentas the default - Treat search as regex: a PCRE pattern without delimiters
- Case-sensitive: off by default
The preview lists the posts that match the filters, and the run is recorded in History with undo.
Schedule recurring batches (Pro)
BatchPilot > Schedules (Pro) runs any target and operation on a repeating interval. Click New schedule and fill in:
- Name
- Target, then any filters
- Operation and its parameters
- Recurrence: Hourly, Daily, Weekly or Monthly (30 days)
- Notifications, optional: an email address, a webhook URL, or both
The first run is queued about 30 seconds after you create the schedule and fires when WP-Cron or Action Scheduler next runs, then it repeats at the interval you chose. The schedule list shows each schedule’s last and next run, an Enabled switch, and Run now and Delete buttons. Turning a schedule off keeps it but stops its runs.
Scheduled runs don’t ask for a preview. They run the filters you saved against whatever matches at that moment, and each run appears in History under CLI, where you can undo it. Use a narrow filter, and keep the Trash option on for deletes.
The email goes out through wp_mail after each run. The webhook receives a JSON POST with the event name batchpilot.schedule.completed, the schedule name and ID, the operation ID, the target and operation, the processed, succeeded and failed counts, and the site URL.
Use WP-CLI
The free plugin adds a wp batchpilot command group:
wp batchpilot deletewith--post-type,--status,--older-than(for example90d),--permanent,--dry-runand--yeswp batchpilot duplicatewith--ids,--target-status,--title-suffixand--reassign-authorwp batchpilot editwith--set-status,--reassign-author,--shift-dates,--comment-statusand--menu-orderwp batchpilot rewriteandwp batchpilot republishwp batchpilot history,wp batchpilot undo <id>andwp batchpilot doctor
Pro adds wp batchpilot schedule with create, list, get, run, delete, enable and disable. Add --dry-run to the delete, duplicate and edit commands to preview first.
wp batchpilot delete --status=draft --older-than=90d --dry-run
Use the REST API and Abilities API
The REST routes live under /wp-json/batchpilot/v1/: catalog, preview, execute, operations, operations/{id}/undo, settings and doctor. Pro adds schedules. Every route checks the same capabilities as the admin screens, and execute needs the token returned by preview.
If the WordPress Abilities API is available, BatchPilot registers each target and operation pair as an ability in the batchpilot category, with IDs such as batchpilot/post-delete. AI agents and other clients can then query the catalog, preview, run and undo batches. The Settings screen points to Application Passwords for giving an agent scoped access.
FAQ
Can I undo a delete?
Yes, as long as it went to the Trash. Trashed items, edits and duplicates all store a snapshot of the earlier state, and Undo on the History screen reverses them. A permanent delete can’t be undone, which is why it’s off by default and has to be turned on for each batch.
How long can I undo a batch?
For as long as BatchPilot keeps the history, which is 30 days by default. Change it with the Retention window setting. Operations older than that, and their undo snapshots, are removed by a daily cleanup.
What stops me deleting the wrong things?
Every batch you run from the builder is previewed with a count and sample rows first. A batch with no filters, or one that matches 100 or more items, needs an extra confirmation before it runs. The preview token expires after five minutes, so a stale preview can’t run.
Will it handle a large site?
Batches over the async threshold run in the background through Action Scheduler, in chunks of 50 items by default. If WooCommerce is installed, BatchPilot uses its bundled copy of Action Scheduler. If the Dashboard shows a problem with Action Scheduler or WP-Cron, fix that first, because background batches depend on both.
Does it work with WooCommerce?
Yes, with Pro. Pro adds WooCommerce product and order targets when WooCommerce is active. The Dashboard’s environment check also reports whether HPOS is on.
What happens to my data if I uninstall it?
By default, uninstalling leaves your operation history in place, so reinstalling picks up where you left off. To remove everything, turn on “Delete all BatchPilot data when uninstalling” under BatchPilot > Settings > Uninstall before you delete the plugin. That removes history, undo snapshots, schedules, settings and capabilities.
BatchPilot is one of the WordPress plugins I build. For the companies and projects behind them, see my projects page.
