Relative URLs in WordPress


115

Ich fand es in WordPress immer frustrierend, dass Bilder, Dateien, Links usw. mit einer absoluten URL anstelle einer relativen URL in WordPress eingefügt werden. Eine relative URL ist viel praktischer, um Domain-Namen zu wechseln, zwischen http und https usw. zu wechseln. 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 den 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 vollständigen URI dieses Verzeichnisses (kein abschließender Schrägstrich), z

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

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

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

Aber gibt es ein Problem bei der Verwendung eines relativen URI? Ich denke nur, dass es einen Grund für WordPress geben muss, dass es mit einer vollständigen URI definiert werden sollte.


3
Ich denke, die Antwort besteht darin, alle Verwendungen im WP-Code und im Code der verwendeten Plugins zu überprüfen, um sicherzustellen, dass keiner von ihnen davon ausgeht, dass es sich um eine vollständige URL handelt, wenn dies nicht der Fall ist, aber ich kann mir keinen Grund vorstellen Es wäre nicht in Ordnung auf meinem Kopf.
Rup

2
dieses Plugin versuchen wordpress.org/plugins/relative-url oder diese lesen kann Ihnen helfen, deluxeblogtips.com/2012/06/relative-urls.html
krishna

5
@Krishna: Warum brauchen wir ein Plugin, wenn wir nur die relative URL in wp-config eingeben können? Der Punkt der Frage ist herauszufinden, ob die Verwendung einer relativen URL in wp-config ein Problem verursachen kann.
AidanCurran

36
Ich weine, wenn ich WordPress berühren muss.
Tony Cronin

6
@ TonyCronin Sei froh, dass es nicht Drupal ist.
Motorbaby

Antworten:


74

Ich denke, dies ist die Art von Frage, die nur ein Kernentwickler beantworten kann / sollte. Ich habe das Kernticket Nr. 17048 recherchiert und gefunden: URLs, die an den Browser gesendet werden, sollten root-relativ sein . Wo wir die Gründe finden können, die Andrew Nacin, leitender Kernentwickler, erklärt hat. Er verlinkt auch auf diesen [wp-hackers] Thread . Bei diesen beiden Links sind dies die wichtigsten Anführungszeichen dafür, warum WP keine relativen URLs verwendet:

Kernticket:

  • Root-relative URLs sind nicht richtig. /path/Möglicherweise nicht WordPress, 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 erheblich, wenn die Installation verschoben wird. 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. Wenn Sie diese bedingt hinzufügen müssen, erhöht sich die Verarbeitung und es treten potenzielle Fehler (und Inkompatibilitäten mit Plugins) auf.

[wp-Hacker] Thread

  • In Bezug auf was bin ich mir nicht sicher, da sich WordPress oft in einem Unterverzeichnis befindet, was bedeutet, dass wir den Inhalt immer verarbeiten müssen, um ihn dann im Rest des Pfades hinzuzufügen. Dies führt zu Overhead.

  • Beachten Sie, dass es zwei Arten von relativen URLs gibt, mit und ohne den führenden Schrägstrich. Beide haben Vorbehalte, die eine ordnungsgemäße Implementierung unmöglich machen.

  • WordPress sollte (und tut) 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 und Ersetzen in der Datenbank.


Und persönlich habe ich mehr als einmal ein schlecht codiertes Thema und Plugins gefunden, die einfach kaputt gehen, wenn sie WP_CONTENT_URLdefiniert sind.
Sie wissen nicht, dass dies festgelegt werden kann, und gehen davon aus, dass dies zutrifft: WP.URL / wp-content / WhatEver , und dies ist nicht immer der Fall. Und auf dem Weg wird etwas kaputt gehen.


Das Plugin Relative URLs (in der Antwort von edse verlinkt ) wendet die Funktion wp_make_link_relativein einer Reihe von Filtern im Aktions-Hook antemplate_redirect . Es ist ein ziemlich einfacher Code und scheint eine gute Option zu sein.


14
Gute Infos. Ich verwende immer root-relative Pfade, damit ich ohne Probleme auf dev.mysite.com -> qa.mysite.com -> www.mysite.com oder sogar www.anothersite.com bereitstellen kann. Es ist bedauerlich, dass WP nicht in diesem Sinne entwickelt wurde. Da die Einstellung WP_CONTENT_URLnicht dazu gedacht zu sein scheint (obwohl dies erlaubt), relative URLs festzulegen, scheint das Plugin die beste Option zu sein. Gibt es einen Testfall, in dem ein Plugin beim Einstellen kaputt geht, WP_CONTENT_URLaber bei Verwendung des Plugins einwandfrei funktioniert?
Justin

2
Relative Pfade beginnen nie mit / und relative URIs (zur Verwendung im Inneren <a>) beginnen nie mit http://.
Tulains Córdova

13
Wordpress war nie für richtige Websites gedacht, es war immer ein schneller Hack, geschrieben von Hackern, die (klar aus den Zitaten hier) nicht über den Tellerrand hinaus gedacht oder geschaut haben. Sie können eine Website nur verschieben, wenn sie relative und / oder relative Root-URLs RICHTIG verwendet. Absolute URLs verhindern dies absolut.
Haqa

8
Ich habe Websites erstellt, die so eingerichtet werden können, dass sie in Unterdomänen, Stamm- oder Unterordnern leben. Es ist nicht sehr schwer. Ich habe das Gefühl, dass die Gründe im Grunde sagen: "Wir haben das vor langer Zeit gebaut und diese Änderung würde zu viel brechen, also reparieren wir es nicht."
Donny V.

3
Ich denke immer noch, dass keiner der Entwicklergründe gültig ist. Die hartcodierte URL hat die gleichen Probleme wie eine relative. Es ist nur eine weitere wirklich schlechte Praxis, die die ursprünglichen Entwickler in ihrem Toolkit für schlechte Gewohnheiten haben. Es gibt viele davon in WordPress, weshalb sie mehrfach entfernt wurden diese Probleme.
Dawesi

15
<?php wp_make_link_relative( $link ) ?>

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

Entfernt die http- oder https-Protokolle und die Domäne. Behält den Pfad '/' am Anfang bei, sodass es sich nicht um einen echten relativen Link handelt, sondern um die Web-Root-Basis.

Referenz: Wordpress Codex


und wo lässt du das PHP-Snippet fallen?
Edward

6

Ich stimme Rup zu. Ich denke, der Hauptgrund ist, Verwirrung auf relativen Pfaden zu vermeiden. Ich denke, WordPress kann mit relativen Pfaden von Grund auf neu funktionieren, aber das Problem kann auftreten, wenn mehrere Plugins verwendet werden, wie das Thema konfiguriert ist usw.

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

Relative Root-URLs
Konvertiert alle URLs in root-relative URLs, um dieselbe Site auf mehreren IPs zu hosten, die Produktionsmigration zu vereinfachen und das Testen mobiler Geräte zu verbessern.


5
Warum sollte ein Plugin überhaupt notwendig sein, wenn nur eine Konstante in der wp-config-Datei konfiguriert werden muss? Es sei denn, es bietet eine Lösung, um eine bestimmte Gefahr zu vermeiden, WP_CONTENT_URLrelativ zu werden, und erliegt keinen Fallstricken mit seinem eigenen Ansatz. Was ich gerne wissen würde, ist, ob es tatsächlich eine bekannte Gefahr gibt, WP_CONTENT_URLVerwandte zu machen.
AidanCurran

1
Eine URL, die mit einem Schrägstrich beginnt, /wp-content/some-file.jpgist ein absoluter Pfad und kein relativer Pfad. Es gibt keine mögliche Verwirrung. Es ist die Aufnahme des Protokolls und des Domainnamens in die absolute URL , die WordPress ohne Begründung nicht hilfreich macht. Um eine WP-Site von dev bis staging live bereitzustellen, muss ich ein Skript zum Suchen und Ersetzen von Domänennamen in einem Datenbankspeicherauszug ausführen. Ich denke, das Problem ist, dass es für die Bearbeitung von Inhalten in der Produktion entwickelt wurde, die für Blogs funktionieren (wofür es gemacht ist), aber nicht für viele kommerzielle Websites.
Ade

1
Wie verwirrt dude.com/bob/jane vs / bob / jane? #serious #badpractice
Dawesi

1
@Ade, bitte mach deine Hausaufgaben auf relativen Wegen. Sie sind falsch, /wp-content/some-file.jpgwenn Sie ein absoluter Weg sind. Beachten Sie für andere, die Ihren Kommentar in Zukunft lesen, dass ein relativer Webpfad ein Pfad ist, bei dem das Protokoll und die Domäne vom Pfad ausgeschlossen sind. Somit /wp-content/some-file.jpgund wp-content/some-file.jpgsind beide relativ, mit der führenden /in dem ersten Beispiel hält den Zweck des zugänglichen Stammverzeichnis des Kontoinhabers oder Server verweist.
Pegues

1
@Pegues OK, ich habe viele Quellen (einige auf SO) gefunden, die den Begriff "absoluter Pfad" im Gegensatz zu "absolute URL" verwenden. Es wird auch als "Root Relative" -Pfad bezeichnet. Obwohl Semantik und Terminologie natürlich wichtig sind, bleibt der Punkt bestehen, dass sie sich grundlegend voneinander unterscheiden. Relativ zur Wurzel zu sein hat alle Konsistenzvorteile einer absoluten URL. Es sei denn, es gibt andere Gründe, die mir nicht bekannt sind.
Ade

4

Ich habe es auf meiner Seite 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 habe an einem Plugin teilgenommen, es in Stücke geschnitten und dieses gemacht. Es ersetzte ALLE Links auf meiner Website (Menüs, CSS, Skripte usw.) und alles funktionierte.


0

Unter Einstellungen => Medien gibt es eine Option für 'Vollständiger URL-Pfad für Dateien'. Wenn Sie dies auf den Standard-Medienverzeichnispfad '/ wp-content / uploads' anstatt auf leer setzen, werden relative Pfade eingefügt, z. B. '/wp-content/uploads/2020/06/document.pdf'.

Ich bin mir nicht sicher, ob alle Links relativ zu Posts sind, aber zumindest Medien, worüber sich die meisten Menschen wahrscheinlich Sorgen machen.


Diese Option "Vollständiger URL-Pfad zu Dateien" wird standardmäßig nicht in den Medieneinstellungen angezeigt. Gibt es eine Einstellung in wp-config, die es aktiviert?
AidanCurran

@AidanCurran Ich bin mir ziemlich sicher, dass es schon lange da ist, aber nach einigen Recherchen scheint es doch eine wp-config zu geben, die dies aktiviert, da es standardmäßig aus WP 3.5+ entfernt wurde. Es kann mit einem alten Plugin wie wordpress.org/plugins/upload-url-path-enabler zurückgebracht werden. Ich denke, eines meiner Plugins fügt dies wieder hinzu, obwohl ich kaum eines installiert habe. Nur mit Elementor und Theme Futurio mit Plugin Futurio Extra. Ich habe versucht, sie ohne Änderung zu deaktivieren, bin mir also nicht sicher: /
Umarme den

@AidanCurran Sie können Folgendes hinzufügen: update_option ('upload_url_path', '/ wp-content / uploads'); in Ihrer Datei functions.php für das Thema oder über ein Code-Snippet-Plugin, und es sollte den gleichen Effekt haben.
Umarme den

-3

sollte get_home_url () verwendet werden, dann sind Ihre Links absolut, aber es hat keinen Einfluss darauf, ob Sie die Site-URL ändern


-4

Was ich denke, dass Sie tun, während Sie Domain-Namen ändern, die SQL-Dump-Datei, die Sie haben, können Sie alle Instanzen des alten Domain-Namens durch neue ersetzen. Dies ist nur eine Option verfügbar, da es keine Plugins gibt, die Ihnen dabei helfen.

Dies ist der schnellste Weg.


1
Denken Sie daran, dass Sie den Domainnamen auch in serialisierten PHP-Zeichenfolgen ersetzen möchten. Dieses praktische Tool zum Suchen und Ersetzen scheint die Standardmethode zu sein (GitHub-Repository hier ). Dies wird von Capistrano-Bereitstellungslösungen verwendet, die ich wie capistrano-wp verwende, und scheint sehr gut zu funktionieren. Es wird auch auf der offiziellen Moving WordPress Codex-Seite referenziert .
Matt Gibson

3
Dieser Ansatz ist chaotisch und fehleranfällig. Wenn wir es vermeiden können, indem wir relative URLs in wp-config verwenden, ist das nicht so viel besser? Der Punkt der Frage ist herauszufinden, ob die Verwendung einer relativen URL in wp-config ein Problem verursachen kann.
AidanCurran

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.