{"id":228607,"date":"2022-10-15T10:50:00","date_gmt":"2022-10-15T07:50:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228607"},"modified":"2022-11-09T03:14:31","modified_gmt":"2022-11-09T00:14:31","slug":"creer-un-fichier-virtuel-dans-wordpress-avec-prise-en-charge-de-wordpress-multisite","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/creer-un-fichier-virtuel-dans-wordpress-avec-prise-en-charge-de-wordpress-multisite\/","title":{"rendered":"Cr\u00e9er un fichier virtuel dans WordPress avec prise en charge de WordPress multisite"},"content":{"rendered":"\n<p>R\u00e9cemment, je travaillais sur une instance WordPress multisite, et j&rsquo;avais besoin que chaque site (multilingue dans cette instance) ait son propre sitemap unique g\u00e9n\u00e9r\u00e9 dynamiquement. J&rsquo;ai g\u00e9n\u00e9r\u00e9 ces sitemaps en cr\u00e9ant <strong>des fichiers virtuels<\/strong> dans WordPress.<\/p>\n<p>Cet article vous montre comment cr\u00e9er un fichier virtuel, puis comment vous assurer que ce fichier virtuel n&rsquo;est pas accessible via tous les sites de votre instance WordPress multisite.<\/p>\n<h2>Configuration des r\u00e8gles de r\u00e9\u00e9criture<\/h2>\n<p>Pour cr\u00e9er un fichier virtuel, la premi\u00e8re chose que nous devons faire est de cr\u00e9er des r\u00e8gles de r\u00e9\u00e9criture, afin que WordPress sache quoi faire avec l&rsquo;URL virtuelle o\u00f9 nous voulons que notre fichier apparaisse.<\/p>\n<p>L&rsquo;exemple suivant cr\u00e9e deux URL de plan de site sitemap.xml et sitemap-fr.xml.<\/p>\n<pre><code>function wholesomecode_sitemap_rewrites() {\n    global $wp;\n    $wp-&gt;add_query_var( 'map' );\n\n    add_rewrite_rule( 'sitemap.xml$', 'index.php?map=sitemap', 'top' );\n    add_rewrite_rule( '^sitemap-fr.xml$', 'index.php?map=sitemap-fr', 'top' );\n}\nadd_action( 'init', 'wholesomecode_sitemap_rewrites', 99 );\n<\/code><\/pre>\n<p>Notez comment nous ajoutons une variable de requ\u00eate de &lsquo;carte&rsquo;, puis nous mappons le nom de notre sitemap \u00e0 cette requ\u00eate.<\/p>\n<h2>Emp\u00eacher les redirections canoniques<\/h2>\n<p>Parfois, si vous avez activ\u00e9 les redirections canoniques (par exemple via un plugin tel que Yoast SEO), WordPress tentera d&rsquo;ajouter une barre oblique \u00e0 la fin de votre URL. Nous pouvons emp\u00eacher cela en utilisant cette fonction.<\/p>\n<pre><code>function wholesomecode_prevent_slash_on_map_variable( $redirect) {\n    if (get_query_var( 'map')) {\n        return false;\n    }\n    return $redirect;\n}\nadd_filter( 'redirect_canonical', 'wholesomecode_prevent_slash_on_map_variable' );\n<\/code><\/pre>\n<h2>Cr\u00e9ation du contenu du fichier virtuel<\/h2>\n<p>Enfin, nous devons configurer les fichiers virtuels eux-m\u00eames. Pour ce faire, nous pouvons nous accrocher au <code>template_include<\/code>crochet. Voici une version tr\u00e8s simplifi\u00e9e de ce \u00e0 quoi pourraient ressembler nos sitemaps.<\/p>\n<p>Notez comment nous utilisons la variable map pour d\u00e9terminer quel fichier virtuel nous souhaitons afficher.<\/p>\n<pre><code>function wholesomecode_sitemap_contents( $template) {\n    $map = get_query_var( 'map' );\n    if (! empty( $map)) {\n        header( 'Content-type: text\/xml' );\n        if ('sitemap' === $map) {\n            ?&gt;\n            &lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n            &lt;sitemapindex xmlns=\"http:\/\/www.sitemaps.org\/schemas\/sitemap\/0.9\"&gt;\n                &lt;sitemap&gt;\n                    &lt;loc&gt;https:\n                &lt;\/sitemap&gt;\n            &lt;\/sitemapindex&gt;\n            &lt;?php\n        } elseif ('sitemap-fr' === $map) {\n            ?&gt;\n            &lt;sitemapindex xmlns=\"http:\/\/www.sitemaps.org\/schemas\/sitemap\/0.9\"&gt;\n                &lt;sitemap&gt;\n                    &lt;loc&gt;https:\n                &lt;\/sitemap&gt;\n            &lt;\/sitemapindex&gt;\n            &lt;?php\n        }\n        die();\n    }\n    return $template;\n}\nadd_action( 'template_include', 'wholesomecode_sitemap_contents' );\n<\/code><\/pre>\n<h3>Bonus\u00a0: incluez des fichiers statiques dans votre URL virtuelle<\/h3>\n<p>L&rsquo;exemple ci-dessus \u00e9tait tr\u00e8s simple, mais vous pouvez mapper des fichiers statiques dans ces URL virtuelles en extrayant leur contenu dans le fichier. Par exemple, nous utilisons ici des sitemaps dans le r\u00e9pertoire racine &quot;maps&quot; et les incluons dynamiquement en fonction de la variable map.<\/p>\n<pre><code>function wholesomecode_sitemap_from_file( $template) {\n    $map = get_query_var( 'map' );\n    if (! empty( $map)) {\n        if (! function_exists( 'get_home_path')) {\n            include_once ABSPATH. '\/wp-admin\/includes\/file.php';\n        }\n        header( 'Content-type: text\/xml' );\n        include get_home_path(). 'maps\/'. $map. '.xml';\n        die;\n    }\n    return $template;\n}\nadd_action( 'template_include', 'wholesomecode_sitemap_from_file' );\n<\/code><\/pre>\n<h2>Rin\u00e7age des r\u00e8gles de r\u00e9\u00e9criture<\/h2>\n<p>La derni\u00e8re chose que vous devrez faire, avant de voir vos fichiers virtuels, est de vider les r\u00e8gles de r\u00e9\u00e9criture. Si vous avez coll\u00e9 les instructions ci-dessus dans <code>functions.php<\/code>la meilleure chose \u00e0 faire, allez <code>Settings &gt; Permalinks<\/code>dans votre tableau de bord WordPress et enregistrez \u00e0 nouveau vos permaliens. Mais si vous construisez un plugin, vous pouvez vous connecter au hook d&rsquo;activation pour qu&rsquo;il se d\u00e9clenche automatiquement lorsque vous activez votre plugin :<\/p>\n<pre><code>register_activation_hook( __FILE__, 'flush_rewrite_rules' );\n<\/code><\/pre>\n<p>Vous pouvez <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/flush_rewrite_rules\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en savoir plus sur les r\u00e8gles de rin\u00e7age dans le WordPress Codex<\/a> pour d&rsquo;autres m\u00e9thodes qui peuvent \u00eatre pertinentes pour votre sc\u00e9nario.<\/p>\n<p>Notre plan du site fran\u00e7ais<\/p>\n<p>Cela fonctionne tr\u00e8s bien! Les fichiers virtuels sont cr\u00e9\u00e9s sans probl\u00e8me, mais si je visitais ensuite la version fran\u00e7aise du site et cherchais le sitemap (ex: <a href=\"https:\/\/mattwatson.codes\/fr\/sitemap.xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mattwatson.codes\/fr\/sitemap.xml<\/a>) je pourrais voir la version anglaise du sitemap. Pas id\u00e9al.<\/p>\n<h2>Fichiers virtuels uniques dans WordPress Multisite<\/h2>\n<p>La solution pour emp\u00eacher les fichiers virtuels dans vos autres instances WordPress Multisite est vraiment tr\u00e8s simple. Tout ce que vous devez faire lorsque vous configurez vos r\u00e9\u00e9critures est de v\u00e9rifier que le site que vous consultez actuellement est celui sur lequel vous souhaitez que ce fichier virtuel apparaisse.<\/p>\n<pre><code>function wholesomecode_sitemap_rewrites() {\n    global $wp;\n    $wp-&gt;add_query_var( 'map' );\n\n    if (get_current_blog_id() == '1') {\n        add_rewrite_rule( 'sitemap.xml$', 'index.php?map=sitemap', 'top' );\n    }\n\n    if (get_current_blog_id() === get_id_from_blogname( 'fr')) {\n        add_rewrite_rule( '^sitemap-fr.xml$', 'index.php?map=sitemap-fr', 'top' );\n    }\n}\nadd_action( 'init', 'wholesomecode_sitemap_rewrites', 99 );\n<\/code><\/pre>\n<p>Si vous avez d\u00e9sactiv\u00e9 WordPress Multisite, la fonction ci-dessus s&rsquo;arr\u00eatera, vous voudrez peut-\u00eatre v\u00e9rifier que la <code>get_current_blog_id<\/code>fonction existe avant d&rsquo;essayer de l&rsquo;utiliser.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>R\u00e9cemment, je travaillais sur une instance WordPress multisite, et j&rsquo;avais besoin que chaque site (multilingue dans cette instance) ait son propre sitemap unique g\u00e9n\u00e9r\u00e9 dynamiquement. J&rsquo;ai g\u00e9n\u00e9r\u00e9&#8230;<\/p>\n","protected":false},"author":1,"featured_media":223984,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[717,801,841],"tags":[1167],"class_list":["post-228607","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developpeur","category-php-3","category-tutoriels","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/228607","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=228607"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/228607\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/223984"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=228607"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=228607"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=228607"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}