URL relatives dans WordPress


115

J'ai toujours trouvé frustrant dans WordPress que des images, des fichiers, des 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, changer entre http et 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 des messages, ils utilisent l'url relative pour le src au lieu de l'URL absolue . Juste ce que j'ai toujours voulu! Mais la documentation officielle de WordPress indique que vous devez utiliser un URI complet si vous définissez WP_CONTENT_URL.

Le codex WordPress dit :

Définissez WP_CONTENT_URL sur l' URI complet de ce répertoire (pas de barre oblique à la fin), 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 avec l'utilisation d'un URI relatif? Je pense juste qu'il doit y avoir une raison pour que WordPress déclare qu'il doit être défini avec un URI complet.


3
Je suppose que la réponse est de vérifier toutes les utilisations de celui-ci dans le code WP et dans le code des plugins que vous utilisez pour vous assurer qu'aucun d'entre eux ne suppose qu'il s'agit d'une URL complète alors que ce n'est pas le cas, mais je ne vois aucune raison. ce ne serait pas OK du haut de ma tête
Rup


5
@Krishna: Pourquoi aurions-nous besoin d'un plugin si nous pouvons simplement entrer une URL relative dans wp-config? Le but de la question est de savoir si l'utilisation d'une URL relative dans wp-config peut causer un problème.
AidanCurran

36
Je pleure quand je dois toucher wordpress.
Tony Cronin

6
@TonyCronin Soyez heureux que ce ne soit pas Drupal.
motorbaby

Réponses:


75

Je pense que c'est le genre de question à laquelle seul un développeur principal pourrait / devrait répondre. J'ai recherché et trouvé le ticket principal n ° 17048: les URL fournies au navigateur doivent être relatives à la racine . Où nous pouvons trouver les raisons expliquées par Andrew Nacin, développeur principal. Il établit également un lien vers ce fil [wp-hackers] . Sur ces deux liens, voici les citations clés expliquant pourquoi WP n'utilise pas d'URL relatives:

Ticket de base:

  • Les URL relatives à la racine ne sont pas vraiment appropriées. /path/peut ne pas être WordPress, cela peut être en dehors de l'installation. Ce n'est donc vraiment pas très différent d'une URL absolue.

  • Toutes les URL relatives rendent également considérablement plus difficile l'exécution des transformations lorsque l'installation est déplacée. La recherche-remplacement sera nécessaire dans la plupart des situations, et avoir une URL absolue est ironiquement plus portable pour ces raisons.

  • des URL absolues sont nécessaires dans de nombreux autres endroits. Le besoin de les ajouter de manière conditionnelle ajoutera au traitement, ainsi que l'introduction de bogues potentiels (et d'incompatibilités avec les plugins).

fil [wp-hackers]

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

  • Gardez à l'esprit qu'il existe deux types d'URL relatives, avec et sans la barre oblique principale. Les deux ont des mises en garde qui rendent cela impossible à mettre en œuvre correctement.

  • WordPress devrait (et le fait) stocker des URL absolues. Cela ne nécessite aucun prétraitement du contenu, aucune surcharge, aucune ambiguïté. Si vous devez déménager, il s'agit d'une recherche-remplacement globale 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 cassent simplement lorsqu'ils WP_CONTENT_URLsont définis.
Ils ne savent pas que cela peut être défini et supposent que c'est vrai: WP.URL / wp-content / WhatEver , et ce n'est pas toujours le cas. Et quelque chose se cassera en cours de route.


Le plugin URL relatives (lié dans la réponse d' edse ), applique la fonction wp_make_link_relativedans une série de filtres dans le crochet d'actiontemplate_redirect . C'est un code assez simple et semble une bonne option.


14
Bonne info. J'utilise toujours des chemins relatifs à la racine afin de pouvoir déployer sur dev.mysite.com -> qa.mysite.com -> www.monsite.com ou même www.anothersite.com sans aucun problème. Il est regrettable que WP n'ait pas été conçu dans cet esprit. Étant donné que la configuration WP_CONTENT_URLne semble pas être destinée (même si elle permet) la définition d'URL relatives, le plugin semble être la meilleure option. Existe-t-il un cas de test où un plugin se casse lors du réglage WP_CONTENT_URLmais fonctionne bien lors de l'utilisation du plugin?
Justin

2
Les chemins relatifs ne commencent jamais par / et les URI relatifs (à utiliser à l'intérieur <a>) ne commencent jamais par http://.
Tulains Córdova le

13
Wordpress n'a jamais été conçu pour les sites Web appropriés, c'était toujours un hack rapide, écrit par des pirates qui (clairement d'après les citations ici) n'ont pas pensé ou regardé en dehors des sentiers battus. La seule façon de déplacer un site Web est de savoir s'il utilise CORRECTEMENT des URL relatives et / ou relatives racine. Les URL absolues l'empêchent absolument.
Haqa

8
J'ai créé des sites qui peuvent être configurés pour vivre dans des sous-domaines, racine ou sous-dossier. Ce n'est pas très dur. J'ai l'impression qu'il y a des raisons qui disent essentiellement: "Nous l'avons construit il y a longtemps et ce changement serait trop brisé, nous ne le réparons pas."
Donny V.20

3
pense toujours qu'aucune des raisons des développeurs n'est valable. L'URL codée en dur a les mêmes problèmes qu'une URL relative, c'est juste une autre très mauvaise pratique que les développeurs d'origine ont dans leur boîte à outils `` mauvaises habitudes '' ... il y en a beaucoup dans wordpress, c'est pourquoi il a été bifurqué plusieurs fois pour être supprimé. ces problèmes.
Dawesi

15
<?php wp_make_link_relative( $link ) ?>

Convertissez les chemins URL complets en chemins relatifs.

Supprime les protocoles http ou https et le domaine. Conserve le chemin «/» au début, donc ce n'est pas un vrai lien relatif, mais de la base racine Web.

Référence: Wordpress Codex


et où déposez-vous cet extrait de code php?
Edward le

6

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 survenir lors de l'utilisation de plusieurs plugins, de la configuration du thème, etc.

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

URL relatives à la racine
Convertit toutes les URL en URL relatives à la racine pour héberger le même site sur plusieurs IP, une migration de production plus facile et un meilleur test des appareils mobiles.


5
Pourquoi un plugin serait même nécessaire s'il suffit de configurer une constante dans le fichier wp-config? A moins qu'il ne fournisse une solution pour éviter un écueil particulier de la WP_CONTENT_URLparenté et ne succombe à aucun écueil avec sa propre approche. Ce que j'aimerais savoir, c'est s'il y a en fait un piège connu dans la relation WP_CONTENT_URL.
AidanCurran

1
Une URL commençant par une barre oblique /wp-content/some-file.jpgest un chemin absolu et non un chemin relatif. Il n'y a pas de confusion possible. C'est l'inclusion du protocole et du nom de domaine dans l' URL absolue qui rend WordPress inutile sans justification. Pour déployer un site WP du développement à la mise en production, je dois exécuter un script de recherche et de remplacement sur les noms de domaine dans un vidage de base de données. Le problème, je pense, c'est qu'il est conçu pour éditer du contenu en production qui fonctionne pour les blogs (ce pour quoi il est fait) mais pas pour de nombreux sites Web commerciaux.
Ade

1
en quoi dude.com/bob/jane vs / bob / jane est-il déroutant? #serious #badpractice
Dawesi

1
@Ade, faites vos devoirs sur les chemins relatifs. Vous avez tort d' /wp-content/some-file.jpgêtre un chemin absolu. Pour les autres qui liront votre commentaire à l'avenir, veuillez noter qu'un chemin d'accès Web relatif est un chemin dont le protocole et le domaine sont exclus du chemin. Ainsi, /wp-content/some-file.jpget wp-content/some-file.jpgsont tous deux relatifs, /le premier exemple du premier exemple ayant pour but de référencer le répertoire racine accessible du titulaire du compte ou du serveur.
Pegues du

1
@Pegues OK, j'ai trouvé de nombreuses sources (certaines sur SO) utilisant le terme "chemin absolu" par opposition à "URL absolue". Il est également appelé chemin "Root Relative". Bien que la sémantique et la terminologie soient bien sûr importantes, le fait est qu'elles sont fondamentalement différentes l'une de l'autre. Être relatif à la racine a tous les avantages de cohérence d'une URL absolue. Sauf s'il y a un autre raisonnement dont je ne suis pas conscient.
Ade

4

Je l'ai résolu dans mon site en faisant cela 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 part à un plugin, je l'ai coupé en morceaux et je l'ai fait. Il a remplacé TOUS les liens de mon site (menus, css, scripts, etc.) et tout fonctionnait.


0

Sous Paramètres => Média, il existe une option pour 'Chemin d'URL complet pour les fichiers'. Si vous définissez ceci sur le chemin du répertoire multimédia par défaut '/ wp-content / uploads' au lieu de vide, il insérera des chemins relatifs par exemple '/wp-content/uploads/2020/06/document.pdf'.

Je ne sais pas si cela rend tous les liens relatifs, par exemple aux publications, mais au moins, il gère les médias, ce qui est probablement ce qui inquiète la plupart des gens.


Cette option «Chemin d'accès URL complet aux fichiers» n'apparaît pas par défaut dans les paramètres multimédia. Y a-t-il un paramètre dans wp-config qui l'active?
AidanCurran le

@AidanCurran Je suis à peu près sûr qu'il existe depuis longtemps, mais après quelques recherches, il semble que wp-config l'active après tout, car il a été supprimé par défaut de WP 3.5+. Il peut être ramené à l'aide d'un ancien plugin comme: wordpress.org/plugins/upload-url-path-enabler Donc, je suppose que l'un de mes plugins l'ajoute, même si j'en ai à peine installé. Simplement en utilisant Elementor et le thème Futurio avec le plugin Futurio Extra. J'ai essayé de les désactiver sans aucun changement, donc pas sûr: /
câlin le

@AidanCurran Vous pouvez ajouter quelque chose comme: update_option ('upload_url_path', '/ wp-content / uploads'); dans votre fichier functions.php pour le thème ou via un plugin d'extrait de code, et cela devrait avoir le même effet.
câlin le

-3

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


-4

Ce que je pense que vous faites, c'est pendant que vous changez les noms de domaine, le fichier de vidage SQL que vous avez, vous pouvez remplacer toutes les instances de l'ancien nom de domaine par un nouveau. C'est la seule option disponible car il n'y a pas de plugins qui vous aideront à le faire.

C'est le moyen le plus rapide.


1
Gardez à l'esprit que vous souhaiterez également remplacer le nom de domaine dans des chaînes PHP sérialisées. Cet outil pratique de recherche et de remplacement semble être la manière standard de faire les choses (référentiel GitHub ici ). Ceci est utilisé par les solutions de déploiement Capistrano que j'utilise comme capistrano-wp et semble très bien fonctionner. Il est également référencé sur la page officielle Moving WordPress Codex .
Matt Gibson

3
Cette approche est compliquée et sujette aux erreurs. Si nous pouvons l'éviter en utilisant des URL relatives dans wp-config, n'est-ce pas tellement mieux? Le but de la question est de savoir si l'utilisation d'une URL relative dans wp-config peut causer un problème.
AidanCurran

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.