web-dev-qa-db-de.com

Relative URLs in Wordpress

Ich habe in Wordpress immer frustriert gefunden, dass Bilder, Dateien, Links usw. mit einer absoluten URL anstelle einer relativen URL in WordPress eingefügt werden. Eine relative URL ist viel bequemer zum Wechseln von Domänennamen und zum Wechseln zwischen http und https usw. Heute habe ich festgestellt, dass, wenn Sie WP_CONTENT_URL mit einer relativen URL definieren, beim Einfügen von Dateien in Posts die relative URL für die SRC anstelle der absoluten URL verwendet wird . Genau das, was ich immer wollte! Die offizielle Wordpress-Dokumentation besagt jedoch, dass Sie einen vollständigen URI verwenden sollten, wenn Sie WP_CONTENT_URL definieren.

Wordpress-Codex sagt :

Setzen Sie WP_CONTENT_URL auf den full URI dieses Verzeichnisses (kein nachstehender Schrägstrich), z.

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

Everyting scheint gut zu funktionieren, wenn ich eine relative URL verwende, z.

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

Gibt es ein Problem bei der Verwendung einer relativen URI? Ich denke nur, dass es einen Grund für Wordpress geben muss, der besagt, dass es mit einem vollständigen URI definiert werden muss. 

77
AidanCurran

Ich denke, das ist die Art von Frage, die nur ein Kernentwickler beantworten kann/sollte. Ich habe das Kernticket # 17048 recherchiert und gefunden: an den Browser gelieferte URLs sollten root-relativ sein . Wo wir die Gründe finden, die von Andrew Nacin, Hauptentwickler, erklärt wurden. Er verlinkt auch auf diesen [wp-hackers] Thread . Bei beiden Links handelt es sich um die wichtigsten Anführungszeichen, warum WP keine relativen URLs verwendet:

Kernticket:

  • Root-relative URLs sind nicht richtig. _/path/_ ist möglicherweise nicht WordPress und befindet sich möglicherweise außerhalb der Installation. Es ist also wirklich nicht viel anders als eine absolute URL.

  • Relative URLs erschweren außerdem die Durchführung von Transformationen beim Verschieben der Installation erheblich. Das Suchen und Ersetzen wird in den meisten Situationen notwendig sein, und eine absolute URL ist aus diesen Gründen ironischerweise portabler.

  • an zahlreichen anderen Stellen werden absolute URLs benötigt. Das bedingte Hinzufügen dieser Elemente erhöht die Verarbeitungsleistung und führt zu potenziellen Fehlern (und Inkompatibilitäten mit Plugins).

[WP-Hacker] Thread

  • Im Vergleich zu dem, was ich nicht sicher bin, befindet sich WordPress oft in einem Unterverzeichnis, was bedeutet, dass wir den Inhalt immer verarbeiten müssen, um ihn dann in den Rest des Pfads einzufügen. Dies führt zu Overhead.

  • Beachten Sie, dass es zwei Arten relativer URLs gibt, mit und ohne vorangestelltem Schrägstrich. Beide haben Vorbehalte, die eine ordnungsgemäße Implementierung unmöglich machen.

  • WordPress sollte (und muss) absolute URLs speichern. Dies erfordert keine Vorverarbeitung von Inhalten, keinen Overhead, keine Mehrdeutigkeit. Wenn Sie umziehen müssen, handelt es sich um ein globales Suchen-Ersetzen in der Datenbank.


Und ich persönlich habe mehr als einmal ein schlecht codiertes Theme und Plugins gefunden, das einfach kaputt geht, wenn WP_CONTENT_URL definiert ist.
Sie wissen nicht , dass dies gesetzt werden kann und nehmen an, dass dies wahr ist : WP.URL/wp-content/WhatEver , und das ist nicht immer der Fall. Und etwas wird auf dem Weg brechen.


Das Plugin Relative URLs (verlinkt in edse 's Answer ) wendet die Funktion wp_make_link_relative in einem Reihe von Filtern im Aktions-Hook _template_redirect_ . Es ist ein ziemlich einfacher Code und scheint eine gute Option zu sein.

59
brasofilo
<?php wp_make_link_relative( $link ) ?>

Konvertieren Sie vollständige URL-Pfade in relative Pfade. 

Entfernt die Protokolle http oder https und die Domäne. Hält den Pfad '/' am Anfang, so dass es kein echter relativer Link ist, sondern von der Web-Root-Basis. 

Referenz: Wordpress-Codex

10
davidcondrey

Ich stimme Rup zu. Ich denke, der Hauptgrund ist, Verwirrung auf relativen Pfaden zu vermeiden. Ich denke, WordPress kann von Grund auf mit relativen Pfaden arbeiten, aber das Problem könnte auftreten, wenn mehrere Plugins verwendet werden, wie das Design konfiguriert wird usw. 

Ich habe dieses Plugin einmal für relative Pfade verwendet, wenn ich an Testservern arbeite:

Relative Root-URLs
Konvertiert alle URLs in root-relative URLs, um dieselbe Site auf mehreren IPs zu hosten.

5
danielsalare

Ich habe es in meiner Site gelöst und dies in functions.php gemacht

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);

}

Ich nahm ein Teil eines Plugins, schnitt es in Stücke und machte das ... __, es ersetzt ALLE Links auf meiner Site (Menüs, CSS, Scripts usw.) und alles hat funktioniert.

0
ikebastuz