{
    "id": 5016,
    "date": "2025-09-18T16:25:50",
    "date_gmt": "2025-09-18T14:25:50",
    "guid": {
        "rendered": "https:\/\/wpmastertoolkit.com\/module\/media-replacement\/"
    },
    "modified": "2025-09-18T16:37:24",
    "modified_gmt": "2025-09-18T14:37:24",
    "slug": "media-replacement",
    "status": "publish",
    "type": "module",
    "link": "https:\/\/wpmastertoolkit.com\/fr\/module\/media-replacement\/",
    "title": {
        "rendered": "Media Replacement"
    },
    "content": {
        "rendered": "<h1 class=\"wp-block-heading\">Media Replacement \u2014 Remplacer un m\u00e9dia WordPress sans casser vos liens<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>On a tous connu \u00e7a : une image mal retouch\u00e9e, un PDF obsol\u00e8te, une vid\u00e9o compress\u00e9e trop fort\u2026 mais d\u00e9j\u00e0 ins\u00e9r\u00e9s partout sur le site. Supprimer puis r\u00e9importer casse les URLs, les pages restent avec des liens morts, et l\u2019ID du m\u00e9dia change.<br>Le module <strong>Media Replacement<\/strong> de WPMasterToolKit r\u00e8gle ce probl\u00e8me : il <strong>remplace le fichier source<\/strong> d\u2019un m\u00e9dia <strong>sans changer son ID, son nom de fichier ni sa date de publication<\/strong>. R\u00e9sultat : <strong>toutes les URLs et int\u00e9grations restent valides<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quels plugins ce module peut remplacer ?<\/h2>\n\n\n\n<p>Pertinent si vous utilisiez un plugin d\u00e9di\u00e9 du type \u201cEnable Media Replace\u201d. Ce module <strong>offre la m\u00eame logique<\/strong> (remplacement in-place) mais int\u00e9gr\u00e9 nativement dans WPMasterToolKit, sans plugin suppl\u00e9mentaire.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ce que fait exactement le module<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Remplacement in-place<\/strong> : copie votre nouveau fichier <strong>par-dessus le fichier existant<\/strong> sur le disque.<\/li>\n\n\n\n<li><strong>Identit\u00e9 conserv\u00e9e<\/strong> : <strong>ID, slug\/nom de fichier et date<\/strong> du m\u00e9dia restent identiques \u2014 donc <strong>aucune URL ne change<\/strong>.<\/li>\n\n\n\n<li><strong>Miniatures r\u00e9g\u00e9n\u00e9r\u00e9es<\/strong> : apr\u00e8s remplacement, le module relance <code>wp_generate_attachment_metadata()<\/code> pour <strong>recr\u00e9er toutes les sous-tailles<\/strong> (thumbnails).<\/li>\n\n\n\n<li><strong>V\u00e9rification stricte du type<\/strong> : le nouveau fichier <strong>doit avoir le m\u00eame MIME type<\/strong> (ex. JPG \u2192 JPG, PDF \u2192 PDF). Cela \u00e9vite les incoh\u00e9rences et probl\u00e8mes d\u2019int\u00e9gration.<\/li>\n\n\n\n<li><strong>Aper\u00e7u visuel<\/strong> : une interface c\u00f4t\u00e9 admin permet de voir les infos <strong>\u201cActuel\u201d<\/strong> vs <strong>\u201cNouveau\u201d<\/strong> (type, taille, largeur\/hauteur pour les images) avant validation.<\/li>\n\n\n\n<li><strong>Nettoyage fiable des anciens fichiers<\/strong> : suppression des fichiers et sous-tailles existants, y compris le cas des images <strong><code>-scaled<\/code><\/strong>. Si un plugin (ex. multilingue) bloque la suppression, un <strong>\u201chard delete\u201d<\/strong> s\u2019assure d\u2019effacer les restes.<\/li>\n\n\n\n<li><strong>Int\u00e9gration naturelle dans l\u2019admin<\/strong> :\n<ul class=\"wp-block-list\">\n<li>Bouton <strong>\u201cReplace media\u201d<\/strong> dans les actions de ligne de la <strong>M\u00e9diath\u00e8que<\/strong> (liste).<\/li>\n\n\n\n<li>Bouton dans la <strong>modale d\u2019\u00e9dition<\/strong> d\u2019un m\u00e9dia.<\/li>\n\n\n\n<li>Bouton dans la <strong>bo\u00eete Publier<\/strong> (\u00e9cran d\u2019\u00e9dition d\u2019une pi\u00e8ce jointe).<\/li>\n\n\n\n<li>Une page interne (sous <strong>M\u00e9dias<\/strong>) g\u00e8re l\u2019upload et la confirmation \u2014 elle est <strong>masqu\u00e9e du menu<\/strong> pour rester accessible uniquement via les boutons d\u2019action.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">D\u00e9tails UX c\u00f4t\u00e9 administration<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Interface claire avec deux colonnes : <strong>Actuel<\/strong> vs <strong>Nouveau<\/strong>.<\/li>\n\n\n\n<li>Drag &amp; drop ou clic pour s\u00e9lectionner le fichier.<\/li>\n\n\n\n<li><strong>Validation imm\u00e9diate c\u00f4t\u00e9 JS<\/strong> (poids max du site, type identique), avec messages localis\u00e9s.<\/li>\n\n\n\n<li><strong>Bouton \u201cReplace\u201d<\/strong> d\u00e9sactiv\u00e9 tant que les validations ne passent pas.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Sc\u00e9narios et limites \u00e0 conna\u00eetre<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>M\u00eame type obligatoire<\/strong> : vous <strong>ne pouvez pas<\/strong> remplacer un PNG par un JPG. Garder le m\u00eame format garantit 0 casse.<\/li>\n\n\n\n<li><strong>Nom de fichier conserv\u00e9<\/strong> : c\u2019est voulu pour garder <strong>exactement la m\u00eame URL<\/strong>.<\/li>\n\n\n\n<li><strong>CDN \/ cache<\/strong> : apr\u00e8s remplacement, pensez \u00e0 <strong>purger le cache<\/strong> si vous utilisez un CDN ou une mise en cache agressive.<\/li>\n\n\n\n<li><strong>Dimensions<\/strong> : si vous importez une image plus grande\/petite, les miniatures seront r\u00e9g\u00e9n\u00e9r\u00e9es en cons\u00e9quence (selon vos tailles d\u2019images WordPress\/th\u00e8me).<\/li>\n\n\n\n<li><strong>Permissions<\/strong> : accessible aux r\u00f4les ayant <code>upload_files<\/code>.<\/li>\n\n\n\n<li><strong>S\u00e9curit\u00e9<\/strong> : tout est prot\u00e9g\u00e9 par <strong>nonce<\/strong> et contr\u00f4les sur le fichier upload\u00e9 (<code>is_uploaded_file<\/code>, types autoris\u00e9s, taille max de WordPress).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Comment utiliser ce module<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Allez dans <strong>M\u00e9dias<\/strong> \u2192 <strong>Biblioth\u00e8que<\/strong>.<\/li>\n\n\n\n<li>Sur la ligne du m\u00e9dia \u00e0 remplacer, cliquez <strong>Replace media<\/strong> (ou ouvrez la fiche du m\u00e9dia et cliquez le m\u00eame bouton).<figure class=\"wp-block-image size-large\"><img alt=\"\" fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"417\" src=\"https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-1024x417.png\" class=\"wp-image-5017\" srcset=\"https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-1024x417.png 1024w, https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-300x122.png 300w, https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-768x313.png 768w, https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-1536x626.png 1536w, https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-18x7.png 18w, https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image.png 1899w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/li>\n\n\n\n<li>Glissez-d\u00e9posez le <strong>nouveau fichier<\/strong> (m\u00eame type que l\u2019original).<figure class=\"wp-block-image size-large\"><img alt=\"\" decoding=\"async\" width=\"1024\" height=\"632\" src=\"https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-1-1024x632.png\" class=\"wp-image-5019\" srcset=\"https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-1-1024x632.png 1024w, https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-1-300x185.png 300w, https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-1-768x474.png 768w, https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-1-18x12.png 18w, https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-1.png 1296w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/li>\n\n\n\n<li>V\u00e9rifiez les infos dans l\u2019aper\u00e7u <strong>\u201cNew\u201d<\/strong>.<\/li>\n\n\n\n<li>Cliquez <strong>Replace<\/strong>.<br>C\u2019est tout : <strong>l\u2019URL ne change pas<\/strong>, le site continue de pointer sur le m\u00eame ID, mais avec le <strong>fichier mis \u00e0 jour<\/strong>.<figure class=\"wp-block-image size-large\"><img alt=\"\" decoding=\"async\" width=\"1024\" height=\"639\" src=\"https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-2-1024x639.png\" class=\"wp-image-5022\" srcset=\"https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-2-1024x639.png 1024w, https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-2-300x187.png 300w, https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-2-768x479.png 768w, https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-2-18x12.png 18w, https:\/\/wpmastertoolkit.com\/wp-content\/uploads\/2025\/09\/image-2.png 1293w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Nos choix techniques (et pourquoi)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Conserver ID\/chemin<\/strong> : on copie le nouveau fichier <strong>sur le chemin d\u2019origine<\/strong> (<code>copy()<\/code> \u2192 m\u00eame nom, m\u00eame emplacement). C\u2019est la seule fa\u00e7on d\u2019assurer que <strong>tous les liens restent valides<\/strong>.<\/li>\n\n\n\n<li><strong>Validation stricte du MIME<\/strong> : comparaison entre le MIME d\u2019origine et celui du nouveau fichier via <code>wp_check_filetype_and_ext()<\/code> et <code>get_post_mime_type()<\/code> pour \u00e9viter les surprises (embed, players, balises HTML, etc.).<\/li>\n\n\n\n<li><strong>Nettoyage robuste<\/strong> : on utilise <code>wp_delete_attachment_files()<\/code> avec m\u00e9tadonn\u00e9es et tailles de backup, puis un <strong>fallback<\/strong> de suppression physique si n\u00e9cessaire (cas d\u2019images <code>-scaled<\/code> ou de plugins multilingues).<\/li>\n\n\n\n<li><strong>R\u00e9g\u00e9n\u00e9ration des m\u00e9tadonn\u00e9es<\/strong> : <code>wp_generate_attachment_metadata()<\/code> + <code>wp_update_attachment_metadata()<\/code> pour recr\u00e9er toutes les sous-tailles dans la foul\u00e9e du remplacement \u2014 pas besoin d\u2019outil tiers.<\/li>\n\n\n\n<li><strong>Exp\u00e9rience admin<\/strong> : boutons ajout\u00e9s via :\n<ul class=\"wp-block-list\">\n<li><code>media_row_actions<\/code><\/li>\n\n\n\n<li><code>attachment_fields_to_edit<\/code> (pour la modale)<\/li>\n\n\n\n<li><code>attachment_submitbox_misc_actions<\/code> (\u00e9cran d\u2019\u00e9dition)<br>Une <strong>page de sous-menu masqu\u00e9e<\/strong> est charg\u00e9e \u00e0 la demande pour afficher l\u2019UI de remplacement, avec assets d\u00e9di\u00e9s (CSS\/JS) et cha\u00eenes localis\u00e9es.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>S\u00e9curit\u00e9 &amp; capacit\u00e9s<\/strong> :\n<ul class=\"wp-block-list\">\n<li>Acc\u00e8s restreint via <code>upload_files<\/code>.<\/li>\n\n\n\n<li><strong>Nonce<\/strong> sp\u00e9cifique au module pour toutes les URLs et formulaires.<\/li>\n\n\n\n<li>Contr\u00f4les <code>is_uploaded_file<\/code>, gestion des erreurs d\u2019upload, et respect de <code>wp_max_upload_size()<\/code> (via JS localis\u00e9).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Performance<\/strong> : chargement conditionnel des assets <strong>uniquement<\/strong> sur la page de remplacement. Si le module n\u2019est pas activ\u00e9, <strong>rien n\u2019est charg\u00e9<\/strong>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Le module <strong>Media Replacement<\/strong> de WPMasterToolKit rend le remplacement d\u2019un m\u00e9dia <strong>s\u00fbr, rapide et sans effet de bord<\/strong> : <strong>m\u00eame ID, m\u00eame URL, m\u00eame date<\/strong>, mais <strong>fichier mis \u00e0 jour<\/strong> et <strong>miniatures r\u00e9g\u00e9n\u00e9r\u00e9es<\/strong>. Fini les liens cass\u00e9s et la gymnastique de r\u00e9importation. C\u2019est l\u2019outil id\u00e9al pour maintenir des biblioth\u00e8ques m\u00e9dias propres et \u00e0 jour, en toute confiance.<\/p>\n\n\n\n<p><\/p>",
        "protected": false
    },
    "excerpt": {
        "rendered": "<p>Le plugin WPMasterToolKit pour WordPress propose une solution pratique avec son module \u00ab\u00a0Media Replacement\u00a0\u00bb, permettant de remplacer des fichiers m\u00e9dias sans casser les liens existants. Cette fonction, plus int\u00e9gr\u00e9e et efficace que des plugins similaires comme \u00ab\u00a0Enable Media Replace\u00a0\u00bb, vise \u00e0 r\u00e9duire le nombre de plugins actifs pour am\u00e9liorer les performances du site. Elle s&rsquo;int\u00e8gre parfaitement \u00e0 l&rsquo;interface d&rsquo;administration de WordPress, permettant un remplacement transparent et s\u00e9curis\u00e9 des fichiers tout en maintenant l&rsquo;int\u00e9grit\u00e9 des liens. C&rsquo;est une solution id\u00e9ale pour une gestion simplifi\u00e9e et optimis\u00e9e des m\u00e9dias.<\/p>",
        "protected": false
    },
    "featured_media": 0,
    "parent": 0,
    "template": "",
    "meta": {
        "_acf_changed": true,
        "_seopress_robots_primary_cat": "",
        "_seopress_titles_title": "",
        "_seopress_titles_desc": "",
        "_seopress_robots_index": "",
        "_surecart_dashboard_logo_width": "180px",
        "_surecart_dashboard_show_logo": true,
        "_surecart_dashboard_navigation_orders": true,
        "_surecart_dashboard_navigation_invoices": true,
        "_surecart_dashboard_navigation_subscriptions": true,
        "_surecart_dashboard_navigation_downloads": true,
        "_surecart_dashboard_navigation_billing": true,
        "_surecart_dashboard_navigation_account": true
    },
    "class_list": [
        "post-5016",
        "module",
        "type-module",
        "status-publish",
        "hentry"
    ],
    "acf": [],
    "_links": {
        "self": [
            {
                "href": "https:\/\/wpmastertoolkit.com\/fr\/wp-json\/wp\/v2\/module\/5016",
                "targetHints": {
                    "allow": [
                        "GET"
                    ]
                }
            }
        ],
        "collection": [
            {
                "href": "https:\/\/wpmastertoolkit.com\/fr\/wp-json\/wp\/v2\/module"
            }
        ],
        "about": [
            {
                "href": "https:\/\/wpmastertoolkit.com\/fr\/wp-json\/wp\/v2\/types\/module"
            }
        ],
        "wp:attachment": [
            {
                "href": "https:\/\/wpmastertoolkit.com\/fr\/wp-json\/wp\/v2\/media?parent=5016"
            }
        ],
        "curies": [
            {
                "name": "wp",
                "href": "https:\/\/api.w.org\/{rel}",
                "templated": true
            }
        ]
    }
}