{"id":333339,"date":"2026-07-01T09:03:41","date_gmt":"2026-07-01T09:03:41","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/honeill-media-duplicate-manager\/"},"modified":"2026-07-01T09:22:24","modified_gmt":"2026-07-01T09:22:24","slug":"honeill-media-duplicate-manager","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/honeill-media-duplicate-manager\/","author":23524743,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.4.0","stable_tag":"0.4.0","tested":"7.0","requires":"5.6","requires_php":"7.4","requires_plugins":null,"header_name":"Honeill Media Duplicate Manager","header_author":"Hayden O'Neill","header_description":"Finds exact duplicate media files by SHA-256 and visually similar images with a perceptual visual hash, then safely merges references before deleting.","assets_banners_color":"","last_updated":"2026-07-01 09:22:24","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":24,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.4.0":{"tag":"0.4.0","author":"honeill","date":"2026-07-01 09:22:24"}},"upgrade_notice":{"0.4.0":"<p>Fixes stale ACF field values immediately after a merge (a caching issue, not a data issue \u2014 recommended for anyone using ACF).<\/p>","0.3.0":"<p>Naming\/compliance release. No change to how duplicates are detected or merged.<\/p>","0.2.1":"<p>Compliance and hardening release recommended for everyone; no changes to how duplicates are detected or merged.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.4.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Exact duplicate groups with a recommended master and per-copy delete controls.","2":"Similar image groups detected by visual hash.","3":"Settings: match strictness, batch size, delete behaviour, and deep usage scan."}},"plugin_section":[],"plugin_tags":[3786,29823,163,84,233],"plugin_category":[50],"plugin_contributors":[269707],"plugin_business_model":[],"class_list":["post-333339","plugin","type-plugin","status-publish","hentry","plugin_tags-cleanup","plugin_tags-duplicates","plugin_tags-images","plugin_tags-media","plugin_tags-media-library","plugin_category-media","plugin_contributors-honeill","plugin_committers-honeill"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/honeill-media-duplicate-manager.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Media Duplicate Manager helps you clean up large WordPress media libraries. It finds duplicate images, lets you choose which copy to keep, repoints the references it can find to that image, and then (optionally) deletes the duplicates.<\/p>\n\n<p>It works in two ways:<\/p>\n\n<ul>\n<li><strong>Exact duplicates<\/strong> are detected with a SHA-256 hash, so matches are byte-for-byte identical files.<\/li>\n<li><strong>Similar images<\/strong> are detected with a lightweight perceptual visual hash \u2014 useful for compressed, resized, or re-exported versions of the same picture.<\/li>\n<\/ul>\n\n<p>You stay in control of every deletion:<\/p>\n\n<ul>\n<li>Pick one <strong>master<\/strong> to keep per group (the most-used image is recommended, oldest as a tie-break).<\/li>\n<li>Tick only the copies you want deleted \u2014 leave the rest and they are kept untouched.<\/li>\n<li>\"Keep all\" dismisses a group you have decided are not duplicates.<\/li>\n<li>A confirmation dialog shows how many files will be affected before anything is deleted.<\/li>\n<\/ul>\n\n<p>Before deleting, the plugin repoints common references, including every generated image size (<code>-300x200<\/code>, etc.), in post content, featured images, gallery shortcodes, WooCommerce product galleries, ACF fields (image, gallery, repeater and flexible content sub-fields, and options pages), and serialized post\/term\/user meta and options.<\/p>\n\n<p><strong>Always test on a staging site with a full database and uploads backup before deleting on production.<\/strong> Reference replacement is best-effort; some page builders store image IDs inside JSON or cache their own rendered output and may need a manual refresh.<\/p>\n\n<p><strong>Disclaimer:<\/strong> You use this plugin entirely at your own risk. Always keep a current backup of your database and uploads, and double-check your site before and after merging. The author accepts no responsibility or liability for any data loss or site issues.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>honeill-media-duplicate-manager<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the ZIP via Plugins &gt; Add New &gt; Upload Plugin.<\/li>\n<li>Activate the plugin through the Plugins menu in WordPress.<\/li>\n<li>Go to <strong>Media &gt; Duplicate Manager<\/strong>.<\/li>\n<li>Run the Exact Duplicate scan to completion, review a group, choose a master, tick the copies to delete, and merge.<\/li>\n<li>Run the Similar Image scan and review matches manually.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20deleting%20a%20duplicate%20break%20images%20on%20my%20pages%3F\"><h3>Will deleting a duplicate break images on my pages?<\/h3><\/dt>\n<dd><p>The plugin repoints the references it can find \u2014 including resized image URLs \u2014 to the master before deleting. To be safe, use a staging site and a backup first, and consider the \"Safe mode\" setting, which repoints references without deleting the files.<\/p><\/dd>\n<dt id=\"does%20it%20delete%20anything%20automatically%3F\"><h3>Does it delete anything automatically?<\/h3><\/dt>\n<dd><p>No. Nothing is deleted unless you tick a copy and confirm. You can keep all or just some versions of any group.<\/p><\/dd>\n<dt id=\"what%20image%20types%20are%20supported%20for%20similar%20matching%3F\"><h3>What image types are supported for similar matching?<\/h3><\/dt>\n<dd><p>JPEG, PNG, GIF, and WebP. Other types (for example SVG) are indexed for exact matching but skipped for visual matching.<\/p><\/dd>\n<dt id=\"how%20do%20i%20undo%20a%20dismissed%20group%3F\"><h3>How do I undo a dismissed group?<\/h3><\/dt>\n<dd><p>Open the Settings tab and choose \"Show dismissed groups again\".<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Added ACF support: image, gallery, repeater and flexible content sub-fields, and options pages are repointed on merge (they were already stored as plain post meta, so this was largely already working \u2014 this release fixes the part that wasn't).<\/li>\n<li>Fixed a caching bug where, after a merge, ACF's <code>get_field()<\/code> (and other cached meta reads) could keep returning the old, deleted attachment ID until the object cache was cleared elsewhere. Post, term, user and options caches are now invalidated immediately after each reference is repointed.<\/li>\n<li>Deep usage scan setting description now explicitly calls out ACF field coverage.<\/li>\n<\/ul>\n\n<h4>0.3.1<\/h4>\n\n<ul>\n<li>Branded the admin menu label (Media \u2192 Honeill Duplicate Manager) and tidied the plugin description.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Renamed all option, post meta, transient, CSS class and script-global names to a unique <code>honeill_<\/code> \/ <code>honeill-<\/code> prefix to avoid any conflict with other plugins or themes.<\/li>\n<li>Added an explicit backup \/ use-at-your-own-risk disclaimer to the description and the admin screen.<\/li>\n<\/ul>\n\n<h4>0.2.1<\/h4>\n\n<ul>\n<li>Added GPL license headers and a WordPress.org readme.<\/li>\n<li>Added translators comments for all translatable strings with placeholders.<\/li>\n<li>Hardened and documented dynamic-table SQL with an internal allowlist; centralized request input handling.<\/li>\n<li>Removed manual text-domain loading (WordPress loads translations automatically for hosted plugins).<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Repoint all resized image URLs (and scheme\/root-relative and escaped-slash forms) on merge.<\/li>\n<li>New keep\/delete UI: choose one master, opt in to deleting individual copies, or keep all.<\/li>\n<li>Reliable batch scanning with progress that never drifts or stalls, plus \"Scan all remaining\".<\/li>\n<li>Transitive (union-find) similar-image clustering and faster distance checks.<\/li>\n<li>Cached usage counts, optional deep usage scan, confirmation dialogs, safe (repoint-only) mode, and uninstall cleanup.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release: exact (SHA-256) and visual-hash duplicate detection with manual review.<\/li>\n<\/ul>","raw_excerpt":"Find exact and visually similar duplicate images in your media library, then safely repoint references before deleting the copies.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/333339","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=333339"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/honeill"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=333339"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=333339"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=333339"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=333339"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=333339"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=333339"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}