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:

Always preview firstYou see the exact match count before any deletion runs. No surprise data loss.
Batched processingDeletions are chunked, so even 100,000-post jobs finish without timing out PHP or hitting memory limits.
Permanent deletions can’t be undone

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

  1. Open AdminEase › Posts. Click AdminEase in the WordPress admin menu, then switch to the Posts tab.
  2. Toggle Enable Bulk Delete Posts on. The settings panel expands to reveal the deletion-method, batch-size, and filter fields.
  3. 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.

Bulk Delete Posts UI with filters and progress bar
Filter selectors above; live progress bar with batch counter below.
  1. Pick your filters. Choose at least one post type and one post status. Optionally add a date range.
  2. 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.
  3. 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.
  4. 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

AJAX, batching, and developer hooks

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.