{"id":344545,"date":"2026-09-13T16:12:48","date_gmt":"2026-09-13T16:12:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/skip-duplicate-media-upload\/"},"modified":"2026-10-24T14:27:34","modified_gmt":"2026-10-24T14:27:34","slug":"webfydev-duplicate-media-guard","status":"publish","type":"plugin","link":"https:\/\/pcm.wordpress.org\/plugins\/webfydev-duplicate-media-guard\/","author":21115769,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.1.0","stable_tag":"2.1.0","tested":"7.1.4","requires":"6.2","requires_php":"7.2","requires_plugins":null,"header_name":"Duplicate Media Guard","header_author":"Webfydev","header_description":"Prevents duplicate media uploads by skipping files that already exist based on their filename and extension.","assets_banners_color":"8cc2d2","last_updated":"2026-10-24 14:27:34","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/webfydev.com","header_plugin_uri":"https:\/\/webfydev.com\/products\/plugins\/webfydev-duplicate-media-guard","header_author_uri":"https:\/\/webfydev.com","rating":5,"author_block_rating":0,"active_installs":20,"downloads":316,"num_ratings":2,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"jsrasheduzzaman","date":"2026-09-13 16:12:17","revision":3693909},"1.0.1":{"tag":"1.0.1","author":"jsrasheduzzaman","date":"2026-09-27 10:26:23","revision":3715315},"2.1.0":{"tag":"2.1.0","author":"jsrasheduzzaman","date":"2026-10-24 14:27:34","revision":3763384}},"upgrade_notice":{"2.1.0":"<ul>\n<li>Image matching is enabled by default; existing images are fingerprinted gradually in the background.<\/li>\n<\/ul>","1.0.1":"<ul>\n<li>Option page color change &amp; plugin security checked.<\/li>\n<\/ul>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3715315,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3763384,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3763384,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","2.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3763384,"resolution":"1","location":"assets","locale":"","width":1645,"height":760},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3763384,"resolution":"2","location":"assets","locale":"","width":1629,"height":760},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3763384,"resolution":"3","location":"assets","locale":"","width":1629,"height":760},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3763384,"resolution":"4","location":"assets","locale":"","width":1579,"height":844},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3763384,"resolution":"5","location":"assets","locale":"","width":1579,"height":844}},"screenshots":{"1":"Plugin settings page showing duplicate detection options.","2":"Example showing a duplicate media upload being detected and skipped (when disable hash check).","3":"Example warning showing matching images with cancel and upload options (when enable hash check).","4":"Example showing replace media first step.","5":"Example showing replace media processing."}},"plugin_section":[],"plugin_tags":[21756,268759,280495,3191,166592],"plugin_category":[],"plugin_contributors":[224273,241269],"plugin_business_model":[],"class_list":["post-344545","plugin","type-plugin","status-publish","hentry","plugin_tags-bulk-upload","plugin_tags-duplicate-media","plugin_tags-duplicate-upload","plugin_tags-media-upload","plugin_tags-replace-media","plugin_contributors-jsrasheduzzaman","plugin_contributors-webfydev","plugin_committers-jsrasheduzzaman"],"banners":{"banner":"https:\/\/ps.w.org\/webfydev-duplicate-media-guard\/assets\/banner-772x250.png?rev=3763384","banner_2x":"https:\/\/ps.w.org\/webfydev-duplicate-media-guard\/assets\/banner-1544x500.png?rev=3763384","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/webfydev-duplicate-media-guard\/assets\/icon-256x256.png?rev=3715315","icon_2x":"https:\/\/ps.w.org\/webfydev-duplicate-media-guard\/assets\/icon-256x256.png?rev=3715315","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/webfydev-duplicate-media-guard\/assets\/screenshot-1.png?rev=3763384","caption":"Plugin settings page showing duplicate detection options."},{"src":"https:\/\/ps.w.org\/webfydev-duplicate-media-guard\/assets\/screenshot-2.png?rev=3763384","caption":"Example showing a duplicate media upload being detected and skipped (when disable hash check)."},{"src":"https:\/\/ps.w.org\/webfydev-duplicate-media-guard\/assets\/screenshot-3.png?rev=3763384","caption":"Example warning showing matching images with cancel and upload options (when enable hash check)."},{"src":"https:\/\/ps.w.org\/webfydev-duplicate-media-guard\/assets\/screenshot-4.png?rev=3763384","caption":"Example showing replace media first step."},{"src":"https:\/\/ps.w.org\/webfydev-duplicate-media-guard\/assets\/screenshot-5.png?rev=3763384","caption":"Example showing replace media processing."}],"raw_content":"<!--section=description-->\n<p><strong>Duplicate Media Guard<\/strong> helps you maintain a well-organized WordPress Media Library. It identifies potential duplicate uploads and lets authorized users replace existing media files without creating a new attachment.<\/p>\n\n<p>During upload, the plugin compares files with existing Media Library items. Filename checks identify matching names, exact hashing detects byte-identical images, and perceptual hashing can identify resized or recompressed images even when their filenames differ. When potential image matches are found, a pre-upload notice displays previews so you can review them, cancel the upload, or continue.<\/p>\n\n<p>For example:<\/p>\n\n<ul>\n<li><code>logo.png<\/code> and <code>logo.png<\/code> \u2192 Duplicate<\/li>\n<li><code>logo.png<\/code> and <code>logo.jpg<\/code> \u2192 Duplicate (when extension check is disabled)<\/li>\n<li><code>banner.webp<\/code> and <code>banner.webp<\/code> \u2192 Duplicate<\/li>\n<li><code>photo.jpg<\/code> and a resized or recompressed <code>copy.webp<\/code> \u2192 Possible visual duplicate (when visually similar resized enable)<\/li>\n<\/ul>\n\n<p>This helps reduce unnecessary duplicates and storage use while still allowing intentional uploads.<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li>Review possible image duplicates with existing-media previews before uploading. (preview appear if Enable Image Hash Checks)<\/li>\n<li>Detect byte-identical images using exact file hashes.<\/li>\n<li>Identify resized or recompressed images using perceptual hashes.<\/li>\n<li>Match filenames with or without their file extensions.<\/li>\n<li>Enable or disable duplicate protection and image hash checks in the settings.<\/li>\n<li>Replace an existing media file while retaining its attachment ID.<\/li>\n<li>Use the standard WordPress Media Uploader.<\/li>\n<li>Index existing image fingerprints gradually in the background.<\/li>\n<\/ul>\n\n<h3>Duplicate Detection<\/h3>\n\n<ol>\n<li>Select an image through the WordPress Media Library.<\/li>\n<li>The plugin checks the filename, exact file hash, and perceptual hash of indexed images.<\/li>\n<li>If potential matches are found, a warning shows previews and lets you cancel or proceed. Files with no matches upload without a confirmation.<\/li>\n<li>Files uploaded outside the standard Media Uploader retain the server-side filename duplicate check.<\/li>\n<\/ol>\n\n<p>Use <strong>Enable Duplicate Protection<\/strong> to turn duplicate checks on or off. Use <strong>Enable Image Hash Checks<\/strong> to control exact and visual image matching. When image hash checks are disabled, filename duplicates use the standard WordPress upload notice and copy-URL action, while other files in the same bulk upload continue normally. Existing images are indexed gradually, so visual matching may be incomplete until indexing has progressed.<\/p>\n\n<h3>Replace Existing Media<\/h3>\n\n<p>Enable <strong>Enable Media Replace<\/strong> in the plugin settings to show the <strong>Replace media<\/strong> action in the Media Library. Users who can upload files and edit the selected media item can choose a replacement and select how it should be applied:<\/p>\n\n<ul>\n<li><strong>Replace the file only<\/strong> keeps the existing filename, URL, and folder. The replacement must have the same file type.<\/li>\n<li><strong>Replace the file, use the new file name, and update all links<\/strong> applies the uploaded filename and updates matching references in WordPress content and metadata. Links on external websites are not changed.<\/li>\n<\/ul>\n\n<p>The attachment ID is retained in either mode. Under <strong>Upload Destination<\/strong>, choose whether to use today's date or keep the existing media date. When using a new filename, this choice also determines the upload folder.<\/p>\n\n<!--section=installation-->\n<h3>Modern Installation<\/h3>\n\n<ol>\n<li>Go to <strong>WordPress Dashboard \u2192 Plugins \u2192 Add New Plugin<\/strong>.<\/li>\n<li>Search for <strong>Duplicate Media Guard<\/strong>.<\/li>\n<li>Click <strong>Install Now<\/strong>.<\/li>\n<li>Activate the plugin.<\/li>\n<\/ol>\n\n<h3>Manual Installation<\/h3>\n\n<ol>\n<li>Upload the plugin folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Go to <strong>Plugins<\/strong> in your WordPress dashboard.<\/li>\n<li>Activate <strong>Duplicate Media Guard<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20is%20considered%20a%20duplicate%3F\"><h3>What is considered a duplicate?<\/h3><\/dt>\n<dd><p>Images can match by filename, exact content hash, or perceptual hash. Perceptual matching is intended to identify resized or recompressed copies and may also flag visually similar images.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20duplicate%20is%20detected%3F\"><h3>What happens if a duplicate is detected?<\/h3><\/dt>\n<dd><p>With <strong>Enable Image Hash Checks<\/strong> on, the uploader shows matching images with previews and lets you cancel or choose <strong>Upload anyway<\/strong>. With it off, filename duplicates are skipped and shown through the standard WordPress upload notice.<\/p><\/dd>\n<dt id=\"can%20i%20compare%20filenames%20without%20extensions%3F\"><h3>Can I compare filenames without extensions?<\/h3><\/dt>\n<dd><p>Yes. If enabled, files like <code>photo.jpg<\/code>, <code>photo.png<\/code>, and <code>photo.webp<\/code> are considered duplicates because they share the same filename.<\/p><\/dd>\n<dt id=\"does%20duplicate%20detection%20change%20existing%20media%20files%3F\"><h3>Does duplicate detection change existing media files?<\/h3><\/dt>\n<dd><p>No. Duplicate detection checks files during upload and does not alter existing media. An existing file is changed only when an authorized user explicitly uses the <strong>Replace media<\/strong> action.<\/p><\/dd>\n<dt id=\"can%20i%20replace%20an%20existing%20media%20file%3F\"><h3>Can I replace an existing media file?<\/h3><\/dt>\n<dd><p>Yes. Enable <strong>Enable Media Replace<\/strong> in the plugin settings, then use <strong>Replace media<\/strong> from the Media Library. You can keep the current filename and URL or use the replacement's filename and update matching links stored in WordPress. The attachment ID is retained.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20all%20media%20types%3F\"><h3>Does this work with all media types?<\/h3><\/dt>\n<dd><p>Filename checks apply to supported media types. Exact and perceptual hashing apply to images.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20lightweight%3F\"><h3>Is the plugin lightweight?<\/h3><\/dt>\n<dd><p>Yes. Fingerprints are computed once and stored with attachment metadata. Existing images are processed in small background batches, so uploads compare hashes rather than repeatedly reading the full Media Library from disk.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.1.0 - 2026-10-24<\/h4>\n\n<ul>\n<li>Added exact image hashing and perceptual similarity detection.<\/li>\n<li>Added pre-upload match previews with cancel or upload-anyway options.<\/li>\n<li>Added settings switches for duplicate protection and image hash checks.<\/li>\n<li>Restored the standard duplicate-upload notice flow when image hash checks are disabled.<\/li>\n<li>Added media replace features.<\/li>\n<\/ul>\n\n<h4>1.0.1 - 2026-09-27<\/h4>\n\n<ul>\n<li>Changes: Color &amp; security fixed.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Prevent duplicate media uploads.<\/li>\n<li>Option to compare filenames with file extensions.<\/li>\n<li>Option to compare filenames without file extensions.<\/li>\n<li>Added admin settings page.<\/li>\n<li>Added duplicate upload detection notice.<\/li>\n<li>Lightweight and optimized for WordPress Media Library.<\/li>\n<\/ul>","raw_excerpt":"Prevent duplicate uploads and replace existing Media Library files while preserving their attachment IDs.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/344545","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=344545"}],"author":[{"embeddable":true,"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jsrasheduzzaman"}],"wp:attachment":[{"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=344545"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=344545"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=344545"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=344545"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=344545"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=344545"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}