Dans WordPress, un média n’est pas un fichier : c’est un enregistrement. Le type de contenu s’appelle « attachment », le chemin du fichier vit dans la métadonnée _wp_attached_file, et les dérivés générés au dépôt vivent dans le tableau sizes de _wp_attachment_metadata. Toute la chaîne des images adaptatives part de là : wp_get_attachment_image_srcset appelle wp_get_attachment_image_src, qui appelle wp_get_attachment_metadata. Chaque maillon exige l’identifiant d’attachement, et retourne faux sans lui. Un DAM, de son côté, indexe par son propre identifiant et livre des URL de dérivés : les deux référentiels ne se rejoignent nulle part tout seuls.
Elementor n’écrit pas son contenu dans post_content : il sérialise l’arbre entier de la page en JSON, dans la métadonnée _elementor_data. Son contrôle média y stocke nativement le triplet url, id, size — la place pour un identifiant existe donc déjà. Au rendu, Group_Control_Image_Size ne teste pas seulement cet identifiant : il vérifie aussi que la taille demandée figure parmi les tailles enregistrées par WordPress. Les deux réunies, Elementor délègue à wp_get_attachment_image et ajoute la classe wp-image suivie du numéro. Il en manque une — et la taille « Custom » offerte par le panneau n’est pas une taille enregistrée — et il compose lui-même une balise img avec src, alt et chargement différé, rien de plus. L’identifiant est donc nécessaire, pas suffisant.
Le rattrapage du cœur ne rattrape rien. Sur une page qui passe par the_content, WordPress repasse sur le contenu avec wp_filter_content_tags, accroché en priorité 12, donc après l’insertion d’Elementor en priorité 9 : le HTML traverse bien le filet. Mais ce filet cherche l’identifiant dans la classe wp-image, par expression régulière — précisément la classe que la branche sans identifiant n’écrit jamais. Le filet existe, passe au bon moment, et ne trouve rien à quoi se raccrocher. La question n’est donc pas quelle URL servir, mais si l’identifiant survit jusqu’au rendu.