Delete Duplicate Posts


Delete Duplicate Posts helps you declutter your WordPress site by removing duplicate posts along with their metadata. Whether you choose to run the cleanup process manually or set it to operate automatically on a schedule, our plugin ensures a thorough cleanup, improving your website’s loading speed and overall performance.

Try it out on our Free Test Site: Launch Demo

Why Choose Delete Duplicate Posts?

  • Comprehensive Cleanup: Not just posts or pages, but also any Custom Post Type you have enabled, along with all related metadata.
  • Space Efficiency: By eliminating unnecessary duplicates, it frees up space, facilitating better website performance.
  • Scalability: Designed for websites of all sizes, it efficiently manages and optimizes large-scale websites without causing timeouts.


  • Selective Deletion: Choose specific posts for deletion or use the select all option.
  • Deletion Modes: Supports both manual and automatic deletion processes.
  • Version Preference: Options to keep either the oldest or the newest version of a post.
  • Deletion Notifications: Receive status emails upon the deletion of posts.
  • Activity Log: An integrated log records all plugin activities for your review.

Experience its Efficiency

Our plugin’s unique approach to handling large datasets ensures that your website remains operational and improves progressively. By removing a few posts at a time, the plugin prevents site timeouts and enhances your website’s performance seamlessly.

For a cleaner, smoother, and more efficient WordPress site, Delete Duplicate Posts is the solution you need.

Learn more about the plugin and its features.

Eliminate duplicate posts, pages, and custom post types effortlessly with Delete Duplicate Posts, enhancing your website’s performance. Our WordPress plugin offers both manual and automatic cleanup options, ensuring a streamlined and efficient management of content duplicates.

How can I report security bugs?

You can report security bugs through the Patchstack Vulnerability Disclosure Program. The Patchstack team help validate, triage and handle any security vulnerabilities. Report a security vulnerability.


  • Duplicate posts were found.
  • Details in the log.
  • Settings


  1. Upload the delete-duplicate-posts folder to the /wp-content/plugins/ directory
  2. Activate the Delete Duplicate Posts plugin through the \’Plugins\’ menu in WordPress
  3. Use the plugin by going to Tools -> Delete Duplicate Posts


Should I take a backup before using this tool?

Yes! You should always take a backup before deleting posts or pages on your website.

What happens if it deletes something I do not want to delete?

You should restore the backup you took of your website before you ran this tool.


June 20, 2024 1 reply
Easy to use and it works perfectly in finding and deleting duplicate posts, pages, media attachments and also custom post types.
May 4, 2024
While it always retrieve errors even on litespeed and apache servers, it works. and seems to be the only plugin to delete duplicate posts.
February 18, 2024 1 reply
This plugin deleted 3800 duplicate posts that I accidentally created due to a bug in my script!
Read all 113 reviews

Contributors & Developers

“Delete Duplicate Posts” is open source software. The following people have contributed to this plugin.


“Delete Duplicate Posts” has been translated into 4 locales. Thank you to the translators for their contributions.

Translate “Delete Duplicate Posts” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.



  • More bugfixes
  • Update Freemius SDK


  • Bugfixes


  • Many bugfixes and codehardening.
  • Improvements to memory usage on some sites with missing MySQL setup.
  • Fix for missing function, ddp_fs_uninstall_cleanup() – thank you @dimalifragis for reporting this issue.


  • Warns you if there are no rows selected before clicking “Delete Selected”.


  • Bugfix buttons not showing up.
  • Bugfix cron not always working properly.
  • Updated Freemius SDK library.


  • NEW: Redesigned interface to reduce clutter.
  • Fix for when redirect entry was added.
  • Pro – NEW: Redirect management. See, search, select and delete redirects created by Delete Duplicate Posts.
  • Pro – Added warning – If “trash” post status is selected, the results will include already deleted posts.


  • Removed dependency for PHP 7.2 allowing for websites running older PHP to install.


  • Security update – Thank you Huynh Tien Si and Patchstack for reporting this bug.
    The vulnerability made it possible for a user on your site with contributor level access to delete posts. This has now been fixed by only allowing admins to use the plugin or even access the interface.
  • Code refactoring – The plugin now runs faster, loading via AJAX dataTables. This makes individual selection and navigation much easier.
  • New: “Why” – A small note next to each duplicate explains why a post is marked as duplicate.
  • Tested up to WP 6.4


  • Fix bug with ‘nav_menu_item’ getting removed, thank you Fahad.
  • Freemius SDK update to 2.5.10


  • Fix a bug
  • Verified notices are supposed to show every 180 days.
  • Updated 3rd party SDK Freemius to 2.5.8


  • Fix bug when creating new site under WordPress Multisite – thank you @artelis
  • Fix bug with redirects created not using the correct relative URL.


  • Update 3rd party SDK Freemius to 2.5.7
  • Tested up to WP 6.2


  • FIX: Error message on some installations with custom SDK installed. Updated 3rd party library Freemius. Happens rarely, but please upgrade.
  • Big thank you to Angelo for translating! 🙂


  • Improved: Posts will be deleted immediately or moved to trash if enabled in WordPress.
  • Updated Freemius SDK to latest version.
  • Updated review reminder interval.
  • Updated 3rd party libraries.
  • Tested up to WP 6.1.1


  • FIX: Limit amount of duplicates to find – reduces server load for large sites with many duplicates.
  • FIX: PHP notice about missing redirection database when loading the plugin page.


  • FIX: E-mails not getting sent – thank you @helenekh
  • Added debug information for email sending in the log.
  • Tested up to WP 6.0.3
  • Updated 3rd party libraries
  • Updated language files for translators


  • Add fixes to prevent menu items being deleted in some cases – “nav_menu_item”
  • Update Freemius library to v. 2.4.5


  • Code improvements so the plugin runs faster overall.
  • Updated language files.
  • NEW: (Pro only) – Feature: 301 redirects deleted duplicates.


  • FIX: Plugin would not show results if the limit was set to “No limit”.


  • Fix: Reworked JS code – fixing the list of duplicates not loading.
  • Improved loading time by fixing a few logic issues in the JavaScript code.
  • Added optional debug logging to help pinpoint bugs.
  • Updated language file for translations.
  • Cleaning up PHP code.
  • Trimmed CSS file.


  • Fix – Now you can choose how many duplicates to see in the interface.
  • Tested with WordPress 6.0.
  • Updated language file for translations.

= 4.7.6
* New: Free demo – Test how the plugin works, just click and in a few seconds your unique demo site is online. Thank you 🙂


  • Security tightening.


  • 2021/10/27
  • Fix bug with Composer dependencies for PHP less than 7.3


  • 2021/10/15
  • Fix problem with deleting old log entries in database.


  • 2021/09/30
  • Fix problem with log database not being created automatically.
  • Added button in sidebar to recreate missing database tables.


  • 2021/07/21
  • Security Hardening


  • 2021/07/11
  • FIX: Duplicates not always properly detected, thank you for the reporters to help fix this bug 🙂
  • NEW: Improved and faster lookup of duplicates.
  • NEW: See number of posts per post type.
  • NEW: See peak memory usage in the log.
  • NEW: See combined count by post_status in the log.
  • NEW: If there is a problem looking up duplicates in the database (shared servers have limited resources), the problem will be shown in the log.
  • Updated language files.
  • Tested up to WP 5.8


  • 2021/04/14
  • Updated 3rd party libraries for PHP 8
  • Tested up to WP 5.7
  • Minor bugfixes


  • 2020/01/12
  • Hotfix – “The plugin generated 15 characters of unexpected output during activation” – Thanks Fabio.


  • 2020/01/12
  • Beta feature: Limit amount of duplicates to find. On big sites with many duplicates the plugin can time out. This feature allows you to limit the amount of results. This feature is only available for free while being tested. Thank you Fabio.
  • Minor text or layout fixes.


  • 2021/01/11
  • New: Manually select which duplicates to delete (or use the automatic)
  • Fix: WordPress 5.6 jQuery compatibility.
  • Fix: Not allowing to disable final post status if only one left. Thank you @nd62.
  • Work on improving PHP 8 compatibility.
  • Updated 3rd party libraries to latest version. Freemius v. 2.4.1


  • 2020/11/30
  • Fix bug with email not sending. Thank you Fatih.


  • 2020/11/09
  • Introducing Multisite compatibility
  • Updated 3rd party Freemius library to v. 2.4.1
  • Tested with WordPress 5.5.3


  • 2020/08/06
  • Code cleanup
  • Tested with WordPress 5.5
  • Updated SDK Freemius to


  • 2020/07/06
  • Fix – automatically deactivate free version if pro version is activated – Thank you Jordi.
  • Fix – Missing link to privacy data.
  • Fix – Not correctly identifying original post when comparing with post meta values – Thank you Reinhard.
  • New – more details how long a process took is now stored in the log.


  • 2020/06/08
  • Code cleanup and security hardening.

  • 2020/05/08
  • Removes some debug code, whoopsie.


  • 2020/05/07
  • Plugin now looks for duplicates in posts and pages per default, no need to set it after activating plugin.
  • Fix: “Error deleting post” showing even if the post was deleted. Thank you Murray 🙂
  • The log is now updated when list of duplicates is updated.


  • 2020/05/04
  • Fixing activation bugs – Thank you @locutus45 and @paul1427
  • Fixing code not working with PHP 5.6
  • Fixed missing translation strings – Thank you Canny for translating to Korean! 😀
  • Added automatic reload when manually deleting duplicates.


  • 2020/05/03
  • Fixing bug in install routines


  • 2020/05/02
  • Tested up to WP 5.4.1
  • Pro: Choose different post stati to look for; publish, draft, scheduled, pending, private and any other custom post status.
  • Code improvement, works faster.


  • 2020/04/25
  • Rewrote plugin to better handle big sites with lots of duplicate content.
  • Fixed automatic deletion (cron job) not working properly on some sites.
  • Security fixes and hardening throughout the plugin.
  • Log is now AJAX based to help load on big sites.
  • Duplicate list now loads via AJAX to help with load on big sites.
  • Added inline help – Helpscout
  • Updated Freemius 3rd party SDK to 2.3.2
  • Added option to upgrade to Pro version.
  • Updated language files.
  • Removed option to run every minute – Sorry, but not a good idea for many websites and hosting companies do not like it either.


  • Direct link to support forum
  • Fixed missing file in 3rd party SDK.


  • Fix – the limitation on how many posts were deleted per batch did not always work, it does not.
  • PHP notices removed from the log thank you @brianbrown

  • Security fix

  • Added two more intervals, every minute and every 5 minutes.
  • Updated 3rd party script Freemius

  • Fixed bugs introduced with updating to WordPress 4.9.1 – Thank you to all who reported the problem.

  • Fixed esc_sql() for WordPress 4.8.3

  • Fix missing 3rd party scripts.


  • Optimized delete routines – Thank you Claire and Vaclav 🙂 Up to 20-30% faster deleting.
  • Added timing functions so you can see how long it takes to delete in the log.
  • Permanently delete posts and pages – no longer goes to trash.
  • Fix – The log is now shown with latest events at top.
  • Updated 3rd party scripts – Freemius update to


  • Updated Freemius SDK.
  • Fixing problem with keeping latest or oldests posts.


  • Fixed PHP Notification – Logs were not automatically cleaned.


  • Fixed missing icon
  • Listed freemius as contributer


  • Fixing PHP Warning if no post types selected


  • Fixed a mistake in Freemius configuration :-/


  • Added language .pot file
  • Improved Danish translation
  • Added Fremius for more usage details – Opt-in


  • Fix PHP notices
  • Clean up code comments
  • Logo now in Retina


  • Fixes which kinds of posts that can be cleaned- Thanks Mark –
  • Option up from max 250 posts to 500 – Thanks Mark.
  • Improved visual style in the table listing.


  • Fixes problem with cron job not working properly.
  • New: Choose interval for automated cron job to run.
  • Adds 3 cron interval 10 min, 15 min and 30 minutes to WordPress.
  • Minor PHP Notice fix.
  • Code cleaning up


  • Added log notes for cron jobs and manual cleaning.
  • Added missing screenshots, banners and icons.


  • Big rewrite, long overdue, many bugs fixed
  • NEW: Choose between post types.
  • Optional cron job now runs every hour, not every half hour.
  • The log was broken, it has now been fixed.
  • Removed unused and old code.
  • Improved plugin layout.


  • Fix for deleting any dupes but posts – ie. not menu items :-/
  • Fix for PHP warnings.
  • Fix for old user capabilities code.


  • Code refactoring and updates – Basically rewrote most of the plugin.
  • Removed link in footer.
  • Removed dashboard widget.
  • Internationalization – Now plugin can be translated
  • Danish language file added.


  • Bugfixes


  • Bugfix: Problem with the link-donation logic. Hereby fixed.


  • Bugfix: Could not access the settings page from the Plugins page.
  • Ads are no longer optional. Sorry about that 🙂
  • Changes to the amount of duplicates you can delete using CRON.


  • Bugfix : A minor speed improvement.


  • Bugfix : Minor logic error fixed.


  • Bugfix : Now actually deletes duplicate posts when clicking the button manually.. Doh…


  • Design interface updated
  • New automatic CRON feature as per many user requests
  • Optional: E-mail notifications


  • Fixes problem with dashboard widget. Thanks to Derek for pinpointing the error.


  • Ensures all post meta for the deleted blogposts are also removed…


  • Uses internal delete function, which also cleans up leftover meta-data. Takes a lot more time to complete however and might time out on some hosts.


  • First release