137 votes

URLs relatives dans WordPress

J'ai toujours trouvé frustrant que les images, fichiers, liens, etc. soient insérés dans WordPress avec une URL absolue au lieu d'une URL relative. Une URL relative est beaucoup plus pratique pour changer de nom de domaine, passer de http à https, etc. Aujourd'hui, j'ai découvert que si vous définissez WP_CONTENT_URL avec une URL relative, lorsque vous insérez des fichiers dans les articles, ils utilisent l'URL relative pour le src au lieu de l'URL absolue. C'est exactement ce que j'ai toujours voulu ! Mais la documentation officielle de WordPress indique que vous devez utiliser une valeur de URI complète si vous définissez WP_CONTENT_URL.

WordPress codex dit :

Définissez WP_CONTENT_URL à l'adresse suivante URI complète de ce répertoire (pas de fin de ligne ), par exemple

define( 'WP_CONTENT_URL', 'http://example/blog/wp-content');

Tout semble fonctionner correctement lorsque j'utilise une URL relative, par exemple.

define( 'WP_CONTENT_URL', '/my-content-folder');

Mais y a-t-il un problème à utiliser un URI relatif ? Je pense simplement qu'il doit y avoir une raison pour que WordPress déclare qu'il doit être défini avec un URI complet.

88voto

brasofilo Points 11907

Je pense que c'est le genre de question à laquelle seul un développeur de base pourrait/devrait répondre. J'ai fait des recherches et trouvé le ticket #17048 : Les URL fournies au navigateur doivent être relatives à la racine. . Où l'on peut trouver les raisons expliquées par Andrew Nacin, lead core developer. Il renvoie également à ce fil de discussion [wp-hackers] . Sur ces deux liens, voici les principales citations expliquant pourquoi WP n'utilise pas les URL relatives :

Billet de base :

  • Les URL relatives à la racine ne sont pas vraiment correctes. /path/ peut ne pas être WordPress, il peut être en dehors de l'installation. Donc, en fait, ce n'est pas très différent d'une URL absolue.

  • Toute URL relative rend également beaucoup plus difficile l'exécution de transformations lorsque l'installation est déplacée. La recherche et le remplacement seront nécessaires dans la plupart des situations, et avoir une URL absolue est ironiquement plus portable pour ces raisons.

  • Les URL absolus sont nécessaires dans de nombreux autres endroits. Le fait de devoir les ajouter de manière conditionnelle alourdira le traitement, tout en introduisant des bogues potentiels (et des incompatibilités avec les plugins).

Fil de discussion [wp-hackers]

  • Par rapport à quoi, je ne suis pas sûr, car WordPress se trouve souvent dans un sous-répertoire, ce qui signifie que nous toujours besoin de traiter le contenu pour ensuite ajouter le reste du chemin. Ce introduit des frais généraux.

  • Gardez à l'esprit qu'il existe deux types d'URL relatives, avec et sans l'attribut en tête. Les deux ont des limitations qui rendent impossible leur mise en œuvre correctement.

  • WordPress devrait stocker (et stocke) les URLs absolues. Ce site ne nécessite aucun prétraitement du contenu, aucune surcharge, aucune ambiguïté. Si vous Si vous avez besoin de déplacer une URL, il s'agit d'une recherche globale et d'un remplacement dans la base de données.


Et, sur une note personnelle, plus d'une fois j'ai trouvé des thèmes et des plugins mal codés qui se cassent tout simplement lorsque WP_CONTENT_URL est définie.
Ils je ne sais pas cela peut être défini et supposer que cela est vrai : WP.URL/wp-content/WhatEver et ce n'est pas toujours le cas. Et quelque chose va se casser en cours de route.


Le plugin URLs relatifs (en lien dans edse Réponse de la Commission ), applique la fonction wp_make_link_relative dans un série de filtres dans le crochet d'action template_redirect . C'est un code assez simple et semble être une bonne option.

22voto

dcc Points 1033
<?php wp_make_link_relative( $link ) ?>

Convertir les chemins d'URL complets en chemins relatifs.

Supprime les protocoles http ou https et le domaine. Conserve le chemin d'accès '/' au début, de sorte qu'il ne s'agit pas d'un véritable lien relatif, mais d'un lien provenant de la base de la racine web.

Référence : Codex Wordpress

8voto

ikebastuz Points 56

J'ai résolu le problème dans mon site en ajoutant ceci dans functions.php

add_action("template_redirect", "start_buffer");
add_action("shutdown", "end_buffer", 999);

function filter_buffer($buffer) {
    $buffer = replace_insecure_links($buffer);
    return $buffer;
}
function start_buffer(){
    ob_start("filter_buffer");
}

function end_buffer(){
    if (ob_get_length()) ob_end_flush();
}

function replace_insecure_links($str) {

   $str = str_replace ( array("http://www.yoursite.com/", "https://www.yoursite.com/") , array("/", "/"), $str);

   return apply_filters("rsssl_fixer_output", $str);

}

J'ai pris une partie d'un plugin, je l'ai coupé en morceaux et j'ai fait ça. Il a remplacé TOUS les liens de mon site (menus, css, scripts etc.) et tout fonctionnait.

6voto

edse Points 96

Je suis d'accord avec Rup. Je suppose que la raison principale est d'éviter la confusion sur les chemins relatifs. Je pense que Wordpress peut fonctionner à partir de zéro avec des chemins relatifs, mais le problème peut venir de l'utilisation de plusieurs plugins, de la façon dont le thème est configuré, etc.

J'ai déjà utilisé ce plugin pour les chemins relatifs, lorsque je travaillais sur des serveurs de test :

URLs relatives à la racine
Convertit toutes les URL en URL relatives à la racine afin d'héberger le même site sur plusieurs IP, de faciliter la migration vers la production et de mieux tester les appareils mobiles.

0voto

Botond Vajna Points 69

Vous devriez utiliser get_home_url(), vos liens sont alors absolus, mais cela n'affecte pas si vous changez l'url du site.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X