{"id":270120,"date":"2026-01-07T16:15:04","date_gmt":"2026-01-07T16:15:04","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/rt-delete-duplicate-products-for-woocommerce\/"},"modified":"2026-05-13T14:49:29","modified_gmt":"2026-05-13T14:49:29","slug":"rt-delete-duplicate-products-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/it.wordpress.org\/plugins\/rt-delete-duplicate-products-for-woocommerce\/","author":23301688,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"3.0.0","stable_tag":"trunk","tested":"6.9.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"RT Delete Duplicate Products for WooCommerce","header_author":"","header_description":"Identify and delete duplicate WooCommerce products efficiently with a modern React-based admin interface.","assets_banners_color":"877cad","last_updated":"2026-05-13 14:49:29","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":20,"downloads":367,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":[],"upgrade_notice":{"3.0.0":"<p>Major update with a fully rewritten architecture, new detection methods (SKU and Both), variable product support, and a rebuilt React interface. No configuration migration is required. Back up your database and test on a staging site before upgrading in production.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3531094,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3531094,"resolution":"772x250","location":"assets","locale":"","width":1544,"height":500}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":[],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3531094,"resolution":"1","location":"assets","locale":"","width":1737,"height":781}},"screenshots":{"1":"<strong>Detection Settings<\/strong> \u2014 Choose between Title, SKU, or Both detection methods and initiate a scan.","2":"<strong>Grouped Duplicates List<\/strong> \u2014 All duplicate groups with full product details: name, SKU, price, stock status, creation date, and action links.","3":"<strong>Product Selection<\/strong> \u2014 Select individual products or entire duplicate groups for bulk deletion.","4":"<strong>Confirmation Dialog<\/strong> \u2014 A safety modal that requires confirmation before permanently deleting selected products.","5":"<strong>Deletion Summary<\/strong> \u2014 Success report showing how many products were deleted and how many (if any) encountered errors."}},"plugin_section":[],"plugin_tags":[262801,262800,236386,286,262802],"plugin_category":[45],"plugin_contributors":[],"plugin_business_model":[],"class_list":["post-270120","plugin","type-plugin","status-publish","hentry","plugin_tags-clean-up-products","plugin_tags-delete-duplicates","plugin_tags-duplicate-products","plugin_tags-woocommerce","plugin_tags-woocommerce-cleanup","plugin_category-ecommerce","plugin_committers-raintech357"],"banners":{"banner":"https:\/\/ps.w.org\/rt-delete-duplicate-products-for-woocommerce\/assets\/banner-772x250.png?rev=3531094","banner_2x":"https:\/\/ps.w.org\/rt-delete-duplicate-products-for-woocommerce\/assets\/banner-1544x500.png?rev=3531094","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/rt-delete-duplicate-products-for-woocommerce_877cad.svg","icon_2x":false,"generated":true},"screenshots":[{"src":"https:\/\/ps.w.org\/rt-delete-duplicate-products-for-woocommerce\/assets\/screenshot-1.png?rev=3531094","caption":"<strong>Detection Settings<\/strong> \u2014 Choose between Title, SKU, or Both detection methods and initiate a scan."}],"raw_content":"<!--section=description-->\n<p><strong>RT Delete Duplicate Products for WooCommerce<\/strong> is a fast, safe, and easy-to-use store cleanup tool that scans your WooCommerce catalogue for duplicate products and lets you permanently remove them in bulk \u2014 all from a modern React-powered admin interface inside your WooCommerce dashboard.<\/p>\n\n<p>Duplicate products accumulate through CSV imports, API syncs, migration scripts, and copy-paste mistakes. Left uncleaned, they damage your store's SEO rankings, confuse customers, and inflate your database. This plugin makes the cleanup process visual, controlled, and irreversible only when you say so.<\/p>\n\n<h4>Why Duplicate Products Hurt Your Store<\/h4>\n\n<ul>\n<li>Duplicate product URLs compete against each other in search engines, splitting ranking authority and suppressing both listings.<\/li>\n<li>Customers landing on duplicated product pages see inconsistent pricing, stock levels, or descriptions \u2014 eroding trust.<\/li>\n<li>Orphaned product meta, variation records, and postmeta rows from duplicates bloat your database and slow down admin queries.<\/li>\n<\/ul>\n\n<h4>Key Features<\/h4>\n\n<p><strong>Three Detection Methods<\/strong>\nScan your entire product catalogue for duplicates using the method that fits your situation:<\/p>\n\n<ul>\n<li><strong>By Title<\/strong> \u2014 finds all published products and product variations sharing an identical name.<\/li>\n<li><strong>By SKU<\/strong> \u2014 queries the <code>_sku<\/code> postmeta field and surfaces every product or variation sharing the same SKU. Empty SKUs are excluded automatically.<\/li>\n<li><strong>By Both (Title + SKU)<\/strong> \u2014 runs both scans simultaneously, merges results into a single deduplicated list, so you see every duplicate regardless of how it was created.<\/li>\n<\/ul>\n\n<p><strong>Grouped Duplicate View<\/strong>\nResults are displayed as grouped sets \u2014 every duplicate group shows all products that share the same title or SKU together. For each product in a group you can see: product name, SKU, price, stock status, creation date, a direct edit link, and a frontend permalink. All the information you need to decide what to keep and what to delete \u2014 without leaving the page.<\/p>\n\n<p><strong>Bulk Selection and Deletion<\/strong>\nSelect individual products or an entire duplicate group in one click. Delete across multiple groups at once. The plugin reports exactly how many products were deleted and how many (if any) failed, so you always know the outcome.<\/p>\n\n<p><strong>Keep One, Delete the Rest<\/strong>\nFor any duplicate group, nominate one product to keep and automatically queue the rest for deletion \u2014 the safest and fastest way to resolve each group without manual cherry-picking.<\/p>\n\n<p><strong>Safe Deletion with Confirmation Guard<\/strong>\nEvery delete action requires an explicit confirmation step. A modal dialog asks you to confirm before anything is permanently removed \u2014 protecting you from accidental bulk deletions.<\/p>\n\n<p><strong>Permanent Deletion \u2014 Bypasses Trash<\/strong>\nProducts are force-deleted using WooCommerce's own <code>$product-&gt;delete( true )<\/code> \u2014 they are not moved to trash. All associated postmeta is removed at the same time. This keeps the database clean and the operation final.<\/p>\n\n<p><strong>Full Variable Product and Variation Support<\/strong>\nWhen a variable product is deleted, the plugin first loops through and removes every child variation before deleting the parent. Variation products that are themselves duplicates can also be detected and deleted independently. No orphaned variation rows are left behind.<\/p>\n\n<p><strong>React-Powered Admin Interface<\/strong>\nBuilt with <code>@wordpress\/scripts<\/code> and WordPress's own component library, the interface looks and feels native to WordPress 6.x. All scanning and deletion happens over a secure internal REST API \u2014 no page reloads. RTL layout is fully supported.<\/p>\n\n<p><strong>Secure REST API<\/strong>\nAll API endpoints under <code>\/wp-json\/rtddpw\/v1\/<\/code> require the <code>manage_woocommerce<\/code> capability. The scan endpoint validates the method parameter against an allowlist. The delete endpoint validates and sanitises every product ID before acting. Nonce verification is enforced throughout.<\/p>\n\n<h4>Who Is This Plugin For?<\/h4>\n\n<ul>\n<li><strong>Store managers<\/strong> who have run product imports multiple times and ended up with hundreds of duplicate listings.<\/li>\n<li><strong>Developers and agencies<\/strong> migrating a store from another platform and needing to clean up the imported catalogue quickly.<\/li>\n<li><strong>Store owners<\/strong> whose WooCommerce admin is slow and suspect a bloated products table is the cause.<\/li>\n<li><strong>SEO-focused merchants<\/strong> who need a clean catalogue with no duplicate URLs competing against each other in search results.<\/li>\n<\/ul>\n\n<h4>How It Works<\/h4>\n\n<ol>\n<li>Go to <strong>WooCommerce \u2192 Delete Duplicates<\/strong> in your WordPress admin.<\/li>\n<li>Choose your detection method: <strong>Title<\/strong>, <strong>SKU<\/strong>, or <strong>Both<\/strong>.<\/li>\n<li>Click <strong>Scan for Duplicates<\/strong> \u2014 the plugin queries your database and returns grouped results instantly.<\/li>\n<li>Review each group. View the name, SKU, price, stock status, creation date, and links for every product in the group.<\/li>\n<li>Select the products you want to remove \u2014 individually, by group, or across all groups at once.<\/li>\n<li>Click <strong>Delete Selected<\/strong> and confirm in the dialog.<\/li>\n<li>The plugin permanently deletes selected products (and their variations if applicable) and shows a deletion summary.<\/li>\n<\/ol>\n\n<h4>Technical Details<\/h4>\n\n<ul>\n<li>Detection queries run directly against <code>{prefix}_posts<\/code> and <code>{prefix}_postmeta<\/code> using <code>GROUP BY<\/code> and <code>HAVING COUNT(*) &gt; 1<\/code> \u2014 no full table scans.<\/li>\n<li>Scans cover <code>post_type IN ('product', 'product_variation')<\/code> and <code>post_status = 'publish'<\/code> only. Drafts, pending, private, and trashed products are excluded.<\/li>\n<li>Admin page is mounted under <strong>WooCommerce \u2192 Delete Duplicates<\/strong> and gated by the <code>manage_woocommerce<\/code> capability.<\/li>\n<li>REST API namespace: <code>rtddpw\/v1<\/code>. Endpoints: <code>GET \/duplicates?method=title|sku|both<\/code> and <code>POST \/delete<\/code>.<\/li>\n<li>Built with the <code>@wordpress\/scripts<\/code> build toolchain; dependencies resolved via <code>index.asset.php<\/code>.<\/li>\n<li>Singleton pattern ensures a single plugin instance throughout the request lifecycle.<\/li>\n<li>Internationalisation-ready \u2014 all user-facing strings use <code>__()<\/code> and <code>_n()<\/code> with text domain <code>rt-delete-duplicate-products-for-woocommerce<\/code>.<\/li>\n<li>RTL stylesheet (<code>index-rtl.css<\/code>) included and loaded automatically for right-to-left languages.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<h4>Automatic Installation<\/h4>\n\n<ol>\n<li>Log in to your WordPress admin panel.<\/li>\n<li>Navigate to <strong>Plugins \u2192 Add New<\/strong>.<\/li>\n<li>Search for <strong>RT Delete Duplicate Products for WooCommerce<\/strong>.<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<\/ol>\n\n<h4>Manual Installation<\/h4>\n\n<ol>\n<li>Download the plugin .zip file.<\/li>\n<li>Go to <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Upload the .zip and click <strong>Install Now<\/strong>.<\/li>\n<li>After installation, click <strong>Activate Plugin<\/strong>.<\/li>\n<\/ol>\n\n<h4>After Activation<\/h4>\n\n<ol>\n<li>Make sure <strong>WooCommerce<\/strong> is installed and active \u2014 the plugin will deactivate itself and display an admin notice if WooCommerce is missing.<\/li>\n<li>Navigate to <strong>WooCommerce \u2192 Delete Duplicates<\/strong>.<\/li>\n<li>Choose a detection method and scan your catalogue.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20require%20woocommerce%3F\"><h3>Does this plugin require WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. WooCommerce must be installed and active. The plugin checks for the <code>WooCommerce<\/code> class both on activation and on every load. If WooCommerce is missing, the plugin deactivates itself and shows an admin notice.<\/p><\/dd>\n<dt id=\"what%20detection%20methods%20are%20available%3F\"><h3>What detection methods are available?<\/h3><\/dt>\n<dd><p>Three methods are supported. <strong>Title<\/strong> finds products sharing the same product name. <strong>SKU<\/strong> finds products sharing the same <code>_sku<\/code> meta value (blank SKUs are excluded). <strong>Both<\/strong> runs both scans and merges results, so you see every duplicate from either method in a single grouped list.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20handle%20variable%20products%20and%20their%20variations%3F\"><h3>Does the plugin handle variable products and their variations?<\/h3><\/dt>\n<dd><p>Yes. When a variable product is deleted, all of its child variations are deleted first, preventing orphaned records. Individual variation products can also be detected as duplicates in their own right and deleted independently.<\/p><\/dd>\n<dt id=\"are%20deletions%20permanent%3F%20can%20i%20undo%20them%3F\"><h3>Are deletions permanent? Can I undo them?<\/h3><\/dt>\n<dd><p>Yes, deletions are permanent. The plugin uses WooCommerce force-delete (<code>$product-&gt;delete( true )<\/code>), which bypasses the trash and removes all associated product metadata immediately. A confirmation dialog is always shown before any delete action. Always back up your database before running bulk deletions.<\/p><\/dd>\n<dt id=\"what%20product%20information%20is%20displayed%20for%20each%20duplicate%3F\"><h3>What product information is displayed for each duplicate?<\/h3><\/dt>\n<dd><p>Each product in a group shows its name, SKU, price, stock status, creation date, a direct WordPress edit link, and the frontend product permalink \u2014 enough to compare duplicates side-by-side and decide which one to keep.<\/p><\/dd>\n<dt id=\"can%20i%20keep%20one%20product%20and%20delete%20the%20rest%20of%20a%20group%20automatically%3F\"><h3>Can I keep one product and delete the rest of a group automatically?<\/h3><\/dt>\n<dd><p>Yes. The <strong>Keep One, Delete the Rest<\/strong> option lets you nominate which product to keep, then automatically queues all others in that group for deletion.<\/p><\/dd>\n<dt id=\"who%20can%20access%20the%20delete%20duplicates%20page%3F\"><h3>Who can access the Delete Duplicates page?<\/h3><\/dt>\n<dd><p>Only users with the <code>manage_woocommerce<\/code> capability \u2014 typically WordPress Administrators and WooCommerce Managers. The REST API endpoints enforce the same capability check on every request.<\/p><\/dd>\n<dt id=\"will%20scanning%20slow%20down%20my%20site%3F\"><h3>Will scanning slow down my site?<\/h3><\/dt>\n<dd><p>Detection queries use optimised SQL and run only when you click Scan \u2014 they are never triggered automatically or on page load. For very large catalogues (10,000+ products), the scan may take a few seconds but will not affect your store's frontend performance.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20affect%20draft%20or%20trashed%20products%3F\"><h3>Does this plugin affect draft or trashed products?<\/h3><\/dt>\n<dd><p>No. The duplicate detector filters for <code>post_status = 'publish'<\/code> only. Drafts, pending, private, and trashed products are never included in scan results.<\/p><\/dd>\n<dt id=\"is%20rtl%20language%20layout%20supported%3F\"><h3>Is RTL language layout supported?<\/h3><\/dt>\n<dd><p>Yes. A dedicated RTL stylesheet (<code>index-rtl.css<\/code>) is included and loaded automatically for right-to-left languages.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20work%20on%20wordpress%20multisite%3F\"><h3>Does this plugin work on WordPress Multisite?<\/h3><\/dt>\n<dd><p>Yes. The plugin functions on Multisite installations when activated per-site.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>3.0.0<\/h4>\n\n<ul>\n<li>Full architectural refactor using the singleton pattern for safe, predictable initialisation.<\/li>\n<li>REST API updated to namespace <code>rtddpw\/v1<\/code> with <code>GET \/duplicates<\/code> and <code>POST \/delete<\/code> endpoints.<\/li>\n<li>All REST endpoints now require <code>manage_woocommerce<\/code> capability with nonce verification.<\/li>\n<li>Detection updated to scan both <code>product<\/code> and <code>product_variation<\/code> post types.<\/li>\n<li>Variable product deletion now removes all child variations first, preventing orphaned variation rows.<\/li>\n<li>Added \"Keep One, Delete the Rest\" workflow per duplicate group.<\/li>\n<li>Product detail view expanded to include price, stock status, creation date, edit URL, and frontend permalink.<\/li>\n<li>React admin UI rebuilt with <code>@wordpress\/scripts<\/code> and WordPress component library.<\/li>\n<li>RTL stylesheet added for right-to-left language support.<\/li>\n<li>Full internationalisation implemented across all user-facing strings.<\/li>\n<li>Improved validation and sanitisation on the REST delete endpoint.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release \u2014 basic duplicate detection by title, bulk deletion, and confirmation dialog.<\/li>\n<\/ul>","raw_excerpt":"Find and permanently delete duplicate WooCommerce products by title, SKU, or both \u2014 with bulk selection, group controls, and a built-in confirmation g &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/270120","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=270120"}],"author":[{"embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/raintech357"}],"wp:attachment":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=270120"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=270120"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=270120"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=270120"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=270120"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=270120"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}