URL relativas en WordPress


115

Siempre me ha resultado frustrante en WordPress que las imágenes, archivos, enlaces, etc. se inserten en WordPress con una URL absoluta en lugar de una URL relativa. Una URL relativa es mucho más conveniente para cambiar nombres de dominio, cambiar entre http y https, etc. Hoy descubrí que si define WP_CONTENT_URL con una URL relativa, cuando inserta archivos en las publicaciones, usan la URL relativa para el src en lugar de la URL absoluta. . ¡Justo lo que siempre quise! Pero la documentación oficial de WordPress dice que debe usar un URI completo si está definiendo WP_CONTENT_URL.

El códice de WordPress dice :

Establezca WP_CONTENT_URL en el URI completo de este directorio (sin barra diagonal), por ejemplo

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

Todo parece funcionar bien cuando uso una URL relativa, por ejemplo

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

Pero, ¿hay algún problema con el uso de un URI relativo? Solo estoy pensando que debe haber una razón para que WordPress indique que debe definirse con un URI completo.


3
Supongo que la respuesta es auditar todos los usos en el código WP y en el código de los complementos que está utilizando para asegurarse de que ninguno de ellos asuma que es una URL completa cuando no lo es, pero no puedo pensar en ninguna razón. no estaría bien fuera de mi cabeza.
Rup


5
@Krishna: ¿Por qué necesitaríamos un complemento si solo podemos ingresar una URL relativa en wp-config? El punto de la pregunta es averiguar si el uso de una URL relativa en wp-config puede causar un problema.
AidanCurran

36
Lloro cuando tengo que tocar wordpress.
Tony Cronin

6
@TonyCronin Alégrate de que no sea Drupal.
Motorbaby

Respuestas:


74

Creo que este es el tipo de pregunta que solo un desarrollador central podría / debería responder. Investigué y encontré el ticket principal # 17048: las URL entregadas al navegador deben ser relativas a la raíz . Donde podemos encontrar las razones explicadas por Andrew Nacin, desarrollador principal principal. También enlaza a este hilo [wp-hackers] . En ambos enlaces, estas son las citas clave sobre por qué WP no usa URL relativas:

Boleto básico:

  • Las URL relativas a la raíz no son realmente adecuadas. /path/podría no ser WordPress, podría estar fuera de la instalación. Entonces, realmente no es muy diferente a una URL absoluta.

  • Cualquier URL relativa también dificulta significativamente la realización de transformaciones cuando se mueve la instalación. La búsqueda-reemplazo será necesaria en la mayoría de las situaciones, y tener una URL absoluta es irónicamente más portátil por esas razones.

  • Se necesitan URL absolutas en muchos otros lugares. La necesidad de agregarlos de forma condicional aumentará el procesamiento, además de introducir errores potenciales (e incompatibilidades con los complementos).

[wp-hackers] hilo

  • En relación con qué, no estoy seguro, ya que WordPress a menudo está en un subdirectorio, lo que significa que siempre necesitaremos procesar el contenido para luego agregar el resto de la ruta. Esto introduce gastos generales.

  • Tenga en cuenta que hay dos tipos de URL relativas, con y sin barra inclinada. Ambos tienen advertencias que hacen que esto sea imposible de implementar correctamente.

  • WordPress debería (y lo hace) almacenar URL absolutas. Esto no requiere preprocesamiento de contenido, gastos generales ni ambigüedad. Si necesita reubicarse, es una búsqueda y reemplazo global en la base de datos.


Y, en una nota personal, más de una vez he encontrado temas y complementos mal codificados que simplemente se rompen cuando WP_CONTENT_URLse definen.
No saben que esto se puede configurar y asumen que esto es cierto: WP.URL / wp-content / WhatEver , y no siempre es así. Y algo se romperá en el camino.


El plug-in URL relativos (en relación en EDSE respuesta 's ), se aplica la función wp_make_link_relativede una serie de filtros en el gancho de la accióntemplate_redirect . Es un código bastante simple y parece una buena opción.


14
Buena informacion. Siempre uso rutas relativas a la raíz para poder implementar en dev.mysite.com -> qa.mysite.com -> www.mysite.com o incluso www.anothersite.com sin problemas. Es lamentable que WP no se haya diseñado con eso en mente. Dado que la configuración WP_CONTENT_URLno parece estar destinada a (aunque permite) establecer URL relativas, el complemento parece ser la mejor opción. ¿Hay algún caso de prueba en el que un complemento se rompa al configurarlo WP_CONTENT_URLpero funcione bien cuando se usa el complemento?
Justin

2
Las rutas relativas nunca comienzan con / y los URI relativos (para usar en el interior <a>) nunca comienzan con http://.
Tulains Córdova

13
Wordpress nunca fue diseñado para sitios web adecuados, siempre fue un truco rápido, escrito por piratas informáticos que (claramente por las citas aquí) no han pensado ni mirado fuera de la caja. La única forma en que puede mover un sitio web es si usa CORRECTAMENTE URL relativas y / o relativas a la raíz. Las URL absolutas lo impiden absolutamente.
Haqa

8
He creado sitios que se pueden configurar para vivir en subdominios, raíz o subcarpeta. No es muy dificil. Siento que hay razones que básicamente dicen "Construimos esto hace mucho tiempo y este cambio se rompería demasiado, así que no lo vamos a arreglar".
Donny V.

3
Todavía creo que ninguna de las razones de los desarrolladores es válida. La URL codificada tiene los mismos problemas que una relativa, es solo otra práctica realmente mala que tienen los desarrolladores originales en su kit de herramientas de 'malos hábitos' ... hay muchos de ellos en wordpress, por lo que se ha bifurcado varias veces para eliminar estos asuntos.
Dawesi

15
<?php wp_make_link_relative( $link ) ?>

Convierta las rutas de URL completas en rutas relativas.

Elimina los protocolos http o https y el dominio. Mantiene la ruta '/' al principio, por lo que no es un vínculo relativo verdadero, sino desde la base de la raíz web.

Referencia: Wordpress Codex


¿y dónde dejas caer ese fragmento de php?
Edward

6

Estoy de acuerdo con Rup. Supongo que la razón principal es evitar confusiones en rutas relativas. Creo que WordPress puede funcionar desde cero con rutas relativas, pero el problema puede surgir cuando se usan múltiples complementos, cómo se configura el tema, etc.

Una vez usé este complemento para rutas relativas, cuando trabajaba en servidores de prueba:

URL relativas a la raíz
Convierte todas las URL en URL relativas a la raíz para alojar el mismo sitio en varias direcciones IP, facilitar la migración de la producción y realizar mejores pruebas de dispositivos móviles.


5
¿Por qué sería necesario un complemento si todo lo que se necesita es configurar una constante en el archivo wp-config? A menos que proporcione una solución para evitar un escollo particular de hacer WP_CONTENT_URLrelativo y no sucumbir a ningún escollo con su propio enfoque. Lo que me gustaría saber es si en realidad existe un error conocido al hacer WP_CONTENT_URLpariente.
AidanCurran

1
Una URL que comienza con una barra inclinada /wp-content/some-file.jpges una ruta absoluta, no una ruta relativa. No hay confusión posible. Es la inclusión del protocolo y el nombre de dominio en la URL absoluta lo que hace que WordPress sea inútil sin justificación. Para implementar un sitio de WP desde el desarrollo hasta la puesta en escena para vivir, tengo que ejecutar un script de búsqueda y reemplazo en los nombres de dominio en un volcado de base de datos. Creo que el problema es que está diseñado para editar contenido en producción que funciona para blogs (que es para lo que está hecho) pero no para muchos sitios web comerciales.
Ade

1
¿en qué se confunde dude.com/bob/jane vs / bob / jane? #serious #badpractice
Dawesi

1
@Ade, haz tu tarea en caminos relativos. Te equivocas acerca de /wp-content/some-file.jpgser un camino absoluto. Para otros que lean su comentario en el futuro, tenga en cuenta que una ruta relativa a la web es una ruta que tiene el protocolo y el dominio excluidos de la ruta. Por lo tanto, /wp-content/some-file.jpgy wp-content/some-file.jpgson relativos, y el /principio del primer ejemplo tiene el propósito de hacer referencia al directorio raíz accesible del titular de la cuenta o servidor.
Pegues

1
@ Pegues OK, encontré muchas fuentes (algunas en SO) usando el término "ruta absoluta" en lugar de "URL absoluta". También se conoce como ruta "Relativa raíz". Si bien la semántica y la terminología son, por supuesto, importantes, el punto sigue siendo que son fundamentalmente diferentes entre sí. Ser relativo a la raíz tiene todos los beneficios de coherencia de una URL absoluta. A menos que haya algún otro razonamiento que no conozca.
Ade

4

Lo resolví en mi sitio haciendo esto en 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);

}

Tomé parte de un complemento, lo corté en pedazos y lo hice. Reemplazó TODOS los enlaces en mi sitio (menús, css, scripts, etc.) y todo estaba funcionando.


0

En Configuración => Medios, hay una opción para 'Ruta URL completa para archivos'. Si establece esto en la ruta del directorio de medios predeterminado '/ wp-content / uploads' en lugar de en blanco, insertará rutas relativas, por ejemplo, '/wp-content/uploads/2020/06/document.pdf'.

No estoy seguro si hace que todos los enlaces sean relativos, por ejemplo, a publicaciones, pero al menos maneja los medios, que probablemente es lo que preocupa a la mayoría de la gente.


Esta opción 'Ruta URL completa a los archivos' no aparece en Configuración de medios de forma predeterminada. ¿Hay alguna configuración en wp-config que lo active?
AidanCurran

@AidanCurran Estoy bastante seguro de que ha estado allí durante mucho tiempo, pero después de investigar un poco, parece que hay algo de wp-config que lo habilita, después de todo, porque se eliminó de forma predeterminada de WP 3.5+. Se puede recuperar usando un complemento antiguo como: wordpress.org/plugins/upload-url-path-enabler Entonces, supongo que uno de mis complementos está agregando esto, aunque apenas tengo ninguno instalado. Simplemente usando Elementor y el tema Futurio con el complemento Futurio Extra. Sin embargo, intenté desactivarlos sin ningún cambio, así que no estoy seguro: /
abrazo el

@AidanCurran Podría agregar algo como: update_option ('upload_url_path', '/ wp-content / uploads'); en su archivo functions.php para el tema oa través de algún complemento de fragmento de código, y debería tener el mismo efecto.
abrazo

-3

debe usar get_home_url (), entonces sus enlaces son absolutos, pero no afecta si cambia la URL del sitio


-4

Lo que creo que haces es mientras cambias los nombres de dominio, el archivo de volcado de SQL que tienes puedes reemplazar todas las instancias del nombre de dominio antiguo por uno nuevo. Esta es la única opción disponible, ya que no hay complementos que lo ayuden a hacer esto.

Esta es la forma más rápida ...


1
Tenga en cuenta que también querrá reemplazar el nombre de dominio en cadenas PHP serializadas. Esta práctica herramienta de búsqueda y reemplazo parece ser la forma estándar de hacer las cosas (repositorio de GitHub aquí ). Esto lo utilizan las soluciones de implementación de Capistrano que uso como capistrano-wp y parece que funciona muy bien. También se hace referencia en la página oficial del Códice de WordPress en movimiento .
Matt Gibson

3
Este enfoque es complicado y propenso a errores. Si podemos evitarlo usando URL relativas en wp-config, ¿no es mucho mejor? El punto de la pregunta es averiguar si el uso de una URL relativa en wp-config puede causar un problema.
AidanCurran

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.