{
    "id": 5024,
    "date": "2025-09-18T16:45:03",
    "date_gmt": "2025-09-18T14:45:03",
    "guid": {
        "rendered": "https:\/\/wpmastertoolkit.com\/?p=5024"
    },
    "modified": "2025-09-18T16:46:49",
    "modified_gmt": "2025-09-18T14:46:49",
    "slug": "wpmastertoolkit-2-11-0-nouveau-module-media-replacement-remplacer-un-media-sans-casser-les-liens",
    "status": "publish",
    "type": "post",
    "link": "https:\/\/wpmastertoolkit.com\/fr\/wpmastertoolkit-2-11-0-nouveau-module-media-replacement-remplacer-un-media-sans-casser-les-liens\/",
    "title": {
        "rendered": "WPMasterToolKit 2.11.0 \u2013 Nouveau module Media Replacement (remplacer un m\u00e9dia sans casser les liens)"
    },
    "content": {
        "rendered": "<h2 class=\"wp-block-heading\">R\u00e9sum\u00e9 de la version<\/h2>\n\n\n\n<p><strong>Version :<\/strong> 2.11.0<br><strong>Module ajout\u00e9 :<\/strong> Media Replacement<br><strong>Objectif :<\/strong> remplacer n\u2019importe quel fichier m\u00e9dia par une nouvelle version tout en conservant <strong>l\u2019ID du m\u00e9dia, le nom de fichier et la date de publication<\/strong> \u2014 vos URLs, int\u00e9grations et liens existants continuent de fonctionner.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pourquoi ce module est important<\/h2>\n\n\n\n<p>Mettre \u00e0 jour un PDF, un logo, une image produit ou une police sans casser les pages qui y font r\u00e9f\u00e9rence est un vrai casse-t\u00eate sous WordPress. Le module <strong>Media Replacement<\/strong> r\u00e9sout ce probl\u00e8me : vous uploadez la nouvelle version, nous rempla\u00e7ons le fichier <strong>au m\u00eame emplacement<\/strong>, puis nous <strong>r\u00e9g\u00e9n\u00e9rons les tailles<\/strong> et <strong>mettons \u00e0 jour les m\u00e9tadonn\u00e9es<\/strong>. R\u00e9sultat : aucune 404, aucun lien \u00e0 corriger, aucun contenu \u00e0 r\u00e9\u00e9diter.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ce qui change concr\u00e8tement<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Remplacement \u201cin place\u201d<\/strong> : copie du nouveau fichier par-dessus l\u2019ancien chemin (<code>get_attached_file()<\/code>).<\/li>\n\n\n\n<li><strong>Conservation des r\u00e9f\u00e9rences<\/strong> : m\u00eame <strong>ID<\/strong>, <strong>slug\/nouveau nom identique<\/strong>, <strong>date<\/strong> et <strong>permalinks<\/strong>.<\/li>\n\n\n\n<li><strong>Contr\u00f4le strict du type de fichier<\/strong> : le mimetype doit <strong>correspondre<\/strong> (image \u2194 image, PDF \u2194 PDF, etc.) pour \u00e9viter les incoh\u00e9rences.<\/li>\n\n\n\n<li><strong>R\u00e9g\u00e9n\u00e9ration automatique<\/strong> : <code>wp_generate_attachment_metadata()<\/code> + <code>wp_update_attachment_metadata()<\/code> pour reconstruire toutes les <strong>subsizes<\/strong> (thumbnails, medium, large, etc.).<\/li>\n\n\n\n<li><strong>Nettoyage fiabilis\u00e9<\/strong> : suppression des anciennes variantes via <code>wp_delete_attachment_files()<\/code> et suppression forc\u00e9e du fichier si n\u00e9cessaire (y compris les images <strong>-scaled<\/strong>).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Parcours utilisateur (en 3 clics)<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Biblioth\u00e8que de m\u00e9dias<\/strong> \u2192 survolez un \u00e9l\u00e9ment et cliquez <strong>Replace media<\/strong> (action de ligne)<br><em>(pr\u00e9sent aussi dans la sidebar de la page de pi\u00e8ce jointe et dans la modale des m\u00e9dias)<\/em><\/li>\n\n\n\n<li><strong>Glissez-d\u00e9posez<\/strong> ou <strong>s\u00e9lectionnez<\/strong> le fichier de remplacement.\n<ul class=\"wp-block-list\">\n<li>Le module affiche <strong>Type<\/strong>, <strong>Taille<\/strong> et \u2014 pour les images \u2014 <strong>Dimensions<\/strong> de l\u2019ancien et du nouveau fichier.<\/li>\n\n\n\n<li>Des garde-fous UI v\u00e9rifient <strong>taille max<\/strong> du site et <strong>mimetype identique<\/strong>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cliquez <strong>Replace<\/strong>. Le remplacement est instantan\u00e9 et vos pages restent intactes.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">D\u00e9tails techniques (pour les curieux)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Hooks &amp; UI<\/strong>\n<ul class=\"wp-block-list\">\n<li><code>media_row_actions<\/code> : ajoute l\u2019action <strong>Replace media<\/strong> dans la liste.<\/li>\n\n\n\n<li><code>attachment_fields_to_edit<\/code> &amp; <code>attachment_submitbox_misc_actions<\/code> : bouton dans la fiche m\u00e9dia + modale.<\/li>\n\n\n\n<li>Un <strong>submenu<\/strong> cach\u00e9 sous <code>upload.php<\/code> g\u00e8re l\u2019UI d\u00e9di\u00e9e (pr\u00e9visualisation avant\/apr\u00e8s).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>S\u00e9curit\u00e9<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Nonce<\/strong> sp\u00e9cifique au module sur chaque action.<\/li>\n\n\n\n<li><code>wp_check_filetype_and_ext()<\/code> + blocage si le type diff\u00e8re (sauf r\u00f4le avec <code>unfiltered_upload<\/code>).<\/li>\n\n\n\n<li>Validation des entr\u00e9es (<code>sanitize_text_field<\/code>, <code>is_uploaded_file<\/code>, gestion d\u2019erreurs upload).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Remplacement &amp; nettoyage<\/strong>\n<ul class=\"wp-block-list\">\n<li>Suppression des fichiers existants (y compris tailles et backups) puis <strong>copie<\/strong> du nouveau fichier au <strong>m\u00eame chemin<\/strong>.<\/li>\n\n\n\n<li>Gestion des cas \u201c<strong>-scaled<\/strong>\u201d et protections de plugins multilingues (ex. fichiers verrouill\u00e9s) avec une <strong>suppression dure<\/strong> en fallback.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Performance &amp; philosophie WPMTK<\/strong>\n<ul class=\"wp-block-list\">\n<li>Comme tous les modules WPMTK : <strong>charg\u00e9 uniquement s\u2019il est activ\u00e9<\/strong>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Cas d\u2019usage typiques<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>PDF<\/strong> : mise \u00e0 jour d\u2019une brochure sans changer l\u2019URL partag\u00e9e aux clients.<\/li>\n\n\n\n<li><strong>Logo\/charte<\/strong> : rafra\u00eechir un logo globalement utilis\u00e9 (header, footers, builders) sans \u00e9diter les pages.<\/li>\n\n\n\n<li><strong>Images e-commerce<\/strong> : ajuster une photo produit r\u00e9f\u00e9renc\u00e9e dans des centaines de fiches.<\/li>\n\n\n\n<li><strong>Fonts\/ICONS<\/strong> : remplacer un fichier statique r\u00e9f\u00e9renc\u00e9 par th\u00e8me ou builder.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Limites &amp; bonnes pratiques<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Mimetype strict<\/strong> : on ne peut pas remplacer un <strong>JPEG<\/strong> par un <strong>PNG<\/strong> (ou un <strong>PDF<\/strong> par un <strong>DOCX<\/strong>). Conservez le <strong>m\u00eame type<\/strong>.<\/li>\n\n\n\n<li><strong>Taille maximale<\/strong> : respect de la <strong>limite d\u2019upload<\/strong> du site (v\u00e9rifi\u00e9e en UI).<\/li>\n\n\n\n<li><strong>Cache<\/strong> : si un CDN est en place, purgez\/attendez la propagation pour voir la nouvelle version partout.<\/li>\n\n\n\n<li><strong>Dimensions d\u2019images<\/strong> : si vous changez radicalement les dimensions, l\u2019aspect peut varier l\u00e0 o\u00f9 l\u2019image est int\u00e9gr\u00e9e. V\u00e9rifiez vos mod\u00e8les.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Guide \u00e9clair (pas \u00e0 pas)<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Medias \u2192 choisissez le m\u00e9dia \u2192 <strong>Replace media<\/strong>.<\/li>\n\n\n\n<li>Uploadez un fichier <strong>du m\u00eame type<\/strong>.<\/li>\n\n\n\n<li>V\u00e9rifiez l\u2019aper\u00e7u, la taille et (si image) les dimensions.<\/li>\n\n\n\n<li>Validez : <strong>Replace<\/strong>. Les <strong>miniatures<\/strong> sont r\u00e9g\u00e9n\u00e9r\u00e9es automatiquement.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Notes de s\u00e9curit\u00e9 &amp; compatibilit\u00e9<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Nonces syst\u00e9matiques et validation serveur sur toutes les actions.<\/li>\n\n\n\n<li>Compatible Media Library (liste, modale, fiche) et admin natif.<\/li>\n\n\n\n<li>Con\u00e7u pour cohabiter avec plugins multilingues et tailles personnalis\u00e9es.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Cette version 2.11.0 apporte une <strong>mise \u00e0 jour majeure c\u00f4t\u00e9 UX et maintenance<\/strong> : fin des URLs cass\u00e9es lors des remplacements de fichiers. Activez le module <strong>Media Replacement<\/strong> et mettez \u00e0 jour vos m\u00e9dias en toute s\u00e9curit\u00e9, sans frictions et sans dette technique.<\/p>",
        "protected": false
    },
    "excerpt": {
        "rendered": "<p>R\u00e9sum\u00e9 de la version Version : 2.11.0Module ajout\u00e9 : Media ReplacementObjectif : remplacer n\u2019importe quel fichier m\u00e9dia par une nouvelle version tout en conservant l\u2019ID du m\u00e9dia, le nom de fichier et la date de publication \u2014 vos URLs, int\u00e9grations et liens existants continuent de fonctionner. Pourquoi ce module est important Mettre \u00e0 jour un [&hellip;]<\/p>",
        "protected": false
    },
    "author": 1,
    "featured_media": 0,
    "comment_status": "closed",
    "ping_status": "closed",
    "sticky": false,
    "template": "",
    "format": "standard",
    "meta": {
        "_acf_changed": false,
        "_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,
        "footnotes": ""
    },
    "categories": [
        1
    ],
    "tags": [],
    "class_list": [
        "post-5024",
        "post",
        "type-post",
        "status-publish",
        "format-standard",
        "hentry",
        "category-non-classe"
    ],
    "acf": [],
    "_links": {
        "self": [
            {
                "href": "https:\/\/wpmastertoolkit.com\/fr\/wp-json\/wp\/v2\/posts\/5024",
                "targetHints": {
                    "allow": [
                        "GET"
                    ]
                }
            }
        ],
        "collection": [
            {
                "href": "https:\/\/wpmastertoolkit.com\/fr\/wp-json\/wp\/v2\/posts"
            }
        ],
        "about": [
            {
                "href": "https:\/\/wpmastertoolkit.com\/fr\/wp-json\/wp\/v2\/types\/post"
            }
        ],
        "author": [
            {
                "embeddable": true,
                "href": "https:\/\/wpmastertoolkit.com\/fr\/wp-json\/wp\/v2\/users\/1"
            }
        ],
        "replies": [
            {
                "embeddable": true,
                "href": "https:\/\/wpmastertoolkit.com\/fr\/wp-json\/wp\/v2\/comments?post=5024"
            }
        ],
        "version-history": [
            {
                "count": 2,
                "href": "https:\/\/wpmastertoolkit.com\/fr\/wp-json\/wp\/v2\/posts\/5024\/revisions"
            }
        ],
        "predecessor-version": [
            {
                "id": 5026,
                "href": "https:\/\/wpmastertoolkit.com\/fr\/wp-json\/wp\/v2\/posts\/5024\/revisions\/5026"
            }
        ],
        "wp:attachment": [
            {
                "href": "https:\/\/wpmastertoolkit.com\/fr\/wp-json\/wp\/v2\/media?parent=5024"
            }
        ],
        "wp:term": [
            {
                "taxonomy": "category",
                "embeddable": true,
                "href": "https:\/\/wpmastertoolkit.com\/fr\/wp-json\/wp\/v2\/categories?post=5024"
            },
            {
                "taxonomy": "post_tag",
                "embeddable": true,
                "href": "https:\/\/wpmastertoolkit.com\/fr\/wp-json\/wp\/v2\/tags?post=5024"
            }
        ],
        "curies": [
            {
                "name": "wp",
                "href": "https:\/\/api.w.org\/{rel}",
                "templated": true
            }
        ]
    }
}