{
  "id": 8788171,
  "title": "Finding duplicate images in a WordPress media library, without flagging WPML translations",
  "url": "https://urgent.news/2026/09/20/finding-duplicate-images-in-a-wordpress-media-library-without",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-09-20T22:47:48.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/lyodefr/finding-duplicate-images-in-a-wordpress-media-library-without-flagging-wpml-translations-1dbc"
  },
  "original_language": "en",
  "account": "I introduced duplicate image detection into Filikod, a free WordPress plugin I maintain. During testing on a real client site with 3,099 images across three languages under WPML and two migrations, my initial assumptions proved incorrect. I discovered that exact duplicates require exact byte matches, not just similar filenames. Resized or re-encoded variants should be treated as distinct files. I avoided counting near-duplicates to simplify the process. My findings revealed that WPML creates separate attachments for each language, even when referencing the same physical file. This resulted in hundreds of redundant copies that needed to be consolidated. Additionally, I identified images left behind from migrations that still appeared in the media library but had no associated file. I created a dedicated tab to list these orphaned attachments and the pages where they were used. Lastly, I ensured the plugin marked the oldest version of each duplicate group for easier cleanup, but it never automatically deletes or merges files.",
  "summary": "How I added exact-duplicate detection to a free WordPress plugin, what broke on a 3,099-image multilingual site, and the SQL that fixed it. Last week I shipped duplicate image detection in Filikod , the free alt text audit plugin I maintain. On paper the feature is small: fingerprint every image file, group identical fingerprints, show the groups. Then I ran it on a real client site. 3,099…",
  "key_points": [],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}