Bulk Delete Posts removes large numbers of posts at once based on flexible filters: by post type, status, date range, and (on Pro) custom post statuses. Deletions run in batches with a live progress bar so you can clean up tens of thousands of posts without server timeouts.
What this feature does
Cleaning up old content in WordPress can be painful. The native admin lets you delete 20 posts per page through a clunky bulk-edit dropdown. Bulk Delete Posts replaces that workflow with a guided form: pick what you want to delete, see a live preview of how many posts match, then run the deletion in safe, configurable batches.
Two safety features make it production-ready:
If you choose Permanently delete as the deletion method, posts skip the trash and are removed from the database immediately. Always take a database backup before running a large permanent delete.
How to enable it
- Open AdminEase › Posts. Click AdminEase in the WordPress admin menu, then switch to the Posts tab.
- Toggle Enable Bulk Delete Posts on. The settings panel expands to reveal the deletion-method, batch-size, and filter fields.
- Save settings to mount the tool. Saving registers the preview/batch AJAX endpoints. The dashboard reloads automatically and a Bulk Delete Posts panel appears below the settings.
Settings reference
| Setting | What it does | Default |
|---|---|---|
| Enable Bulk Delete Posts | Master switch. Off means the tool isn’t mounted and the AJAX endpoints don’t exist. | Off |
| Deletion Method | Whether matched posts are moved to the trash (recoverable) or permanently deleted (gone). | Move to trash |
| Batch Size | How many posts are deleted per request. Range: 10 to 100. Lower values are safer on slow hosts; higher values finish jobs quicker on fast hosts. | 20 |
| Select post type | Multi-select of all registered public post types. Required. | Empty |
| Select post status | Multi-select of post statuses (Published, Draft, Pending, Private, Trash, etc.). Pro adds custom public statuses registered by other plugins. | Empty |
| Select date range | Optional. Limit deletions to posts whose published date falls within this range. Leave empty to ignore date. | Empty |
Running a deletion
The tool sits below the settings panel on the Posts tab. The workflow is always: filter, preview, confirm, run.
- Pick your filters. Choose at least one post type and one post status. Optionally add a date range.
- Click Preview. AdminEase runs a count-only query and shows you exactly how many posts match. The preview also shows a sample of post titles so you can sanity-check the filter.
- Confirm and run. After reviewing the preview, click Delete. AdminEase processes the matched posts in batches, refreshing a progress bar as it goes. You can leave the tab open or come back later.
- Verify the result. Once finished, the panel reports how many posts were processed. If you chose Move to trash, you can recover anything you didn’t mean to delete from the standard WordPress trash.
What happens behind the scenes
The preview action calls adminease_bulk_delete_preview, which runs a single WP_Query with the configured filters and returns the count and a sample of post IDs and titles.
The actual deletion uses adminease_bulk_delete_batch repeatedly. Each call processes one batch of N posts (where N is your Batch Size) and returns progress info to the UI, which advances the bar and fires the next call.
Developers can hook two actions to run logic alongside deletions: adminease_bulk_delete_batch_start (fires before each batch with the post objects) and adminease_bulk_delete_batch_complete (fires after each batch with the count). The query args themselves are filterable via adminease_bulk_delete_preview_query_args for advanced custom filters.
Common workflows
Clean up old draft posts
Pick post type Posts, status Draft, and a date range from many years ago to a year ago. Preview, confirm, and trash. Use Move to trash so you can recover anything important.
Empty the trash for a single post type
Pick post type, status Trash, deletion method Permanently delete. AdminEase will permanently remove only trashed posts, much faster than WordPress’s built-in “Empty Trash” on huge tables.
Remove all posts from a custom post type before retiring it
Pick the custom post type, all its valid statuses, and run permanent delete. Especially useful before unregistering a CPT so you don’t leave orphaned database rows.
Troubleshooting
The preview returns “0 posts” but I’m sure there are matching posts
Most often a status mismatch. Many plugins register custom statuses (e.g. publish-only Search-Engine-friendly variants). Make sure the status of your target posts is in the Select post status picker. Pro automatically adds custom public statuses; on free, only built-in statuses appear.
The deletion stalls partway through
Lower your Batch Size. Some hosts (particularly cheap shared hosts) trip server-side rate-limits or kill long-running PHP processes. A batch size of 10 is the safest setting and rarely causes issues.
Deletions are very slow
Two factors: the size of your post tables and how many post-meta and term relationships each post has. WordPress runs cleanup queries on related rows for every deletion. If you’re deleting 50,000 posts, expect it to take many minutes; that’s a database-side limitation, not a plugin one.
I want to filter by category or custom field
The free version filters by post type, status, and date. Pro adds taxonomy and custom-field filters. As a workaround on free, use the adminease_bulk_delete_preview_query_args filter to add your own conditions to the query in a small mu-plugin.
