Względne adresy URL w WordPress


115

Zawsze uważałem, że w WordPressie frustrujące jest to, że obrazy, pliki, linki itp. Są wstawiane do WordPress z bezwzględnym adresem URL zamiast względnego adresu URL. Względny adres URL jest znacznie wygodniejszy do przełączania nazw domen, zmiany między http i https itp. Dzisiaj odkryłem, że jeśli zdefiniujesz WP_CONTENT_URL ze względnym adresem URL, to kiedy wstawisz pliki do postów, używają względnego adresu URL dla src zamiast bezwzględnego adresu URL . Właśnie to, czego zawsze chciałem! Ale oficjalna dokumentacja WordPress mówi, że powinieneś używać pełnego identyfikatora URI jeśli definiujesz WP_CONTENT_URL .

Kodeks WordPress mówi :

Ustaw WP_CONTENT_URL na pełny identyfikator URI tego katalogu (bez końcowego ukośnika), np

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

Wydaje się, że wszystko działa dobrze, gdy używam względnego adresu URL, np

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

Ale czy jest jakiś problem z używaniem względnego identyfikatora URI? Myślę tylko, że musi istnieć powód, dla którego WordPress twierdzi, że powinien być zdefiniowany z pełnym identyfikatorem URI.


3
Myślę, że odpowiedzią jest audyt wszystkich jego zastosowań w kodzie WP i kodzie wtyczek, których używasz, aby upewnić się, że żadna z nich nie zakłada, że ​​jest to pełny adres URL, gdy tak nie jest, ale nie mogę wymyślić żadnego powodu to nie byłoby w porządku z mojej głowy.
Rup

2
wypróbuj tę wtyczkę wordpress.org/plugins/relative-url lub przeczytaj, co może ci pomóc deluxeblogtips.com/2012/06/relative-urls.html
krishna

5
@Krishna: Po co nam wtyczka, skoro możemy po prostu wpisać względny adres URL w wp-config? Chodzi o to, aby dowiedzieć się, czy użycie względnego adresu URL w wp-config może powodować problem.
AidanCurran

36
Płaczę, kiedy muszę dotknąć wordpress.
Tony Cronin

6
@TonyCronin Ciesz się, że to nie Drupal.
motorbaby

Odpowiedzi:


75

Myślę, że jest to pytanie, na które może odpowiedzieć tylko główny programista. Zbadałem i znalazłem podstawowy bilet nr 17048: adresy URL dostarczane do przeglądarki powinny odnosić się do katalogu głównego . Gdzie możemy znaleźć powody wyjaśnione przez Andrew Nacina, głównego programistę. Podaje również linki do tego wątku [wp-hackers] . Na obu tych linkach znajdują się kluczowe cytaty, dlaczego WP nie używa względnych adresów URL:

Bilet podstawowy:

  • Adresy URL względem katalogu głównego nie są tak naprawdę poprawne. /path/może nie być WordPress, może znajdować się poza instalacją. Więc tak naprawdę nie różni się zbytnio od bezwzględnego adresu URL.

  • Wszelkie względne adresy URL również znacznie utrudniają wykonywanie przekształceń podczas przenoszenia instalacji. W większości sytuacji konieczne będzie znalezienie i zastąpienie, a posiadanie bezwzględnego adresu URL jest ironicznie bardziej przenośne z tych powodów.

  • bezwzględne adresy URL są potrzebne w wielu innych miejscach. Konieczność warunkowego dodania ich spowoduje zwiększenie przetwarzania, a także wprowadzenie potencjalnych błędów (i niekompatybilności z wtyczkami).

Wątek [wp-hackers]

  • Względem czego, nie jestem pewien, ponieważ WordPress często znajduje się w podkatalogu, co oznacza, że ​​zawsze będziemy musieli przetworzyć zawartość, aby następnie dodać resztę ścieżki. To wprowadza narzut.

  • Pamiętaj, że istnieją dwa rodzaje względnych adresów URL, z ukośnikiem na początku i bez niego. Oba mają zastrzeżenia, które uniemożliwiają prawidłowe wdrożenie tego rozwiązania.

  • WordPress powinien (i robi) przechowywać bezwzględne adresy URL. Nie wymaga to wstępnego przetwarzania treści, narzutów ani niejednoznaczności. Jeśli chcesz zmienić lokalizację, jest to globalne wyszukiwanie i zastępowanie w bazie danych.


I osobiście, wiele razy znalazłem motyw i wtyczki źle zakodowane, które po prostu psują się, gdy WP_CONTENT_URLsą zdefiniowane.
Nie wiedzą, że można to ustawić i zakładają, że to prawda: WP.URL / wp-content / WhatEver , a nie zawsze tak jest. I po drodze coś się zepsuje.


Wtyczka Względne adresy URL (związany w edse „s Odpowiedź ), stosuje się funkcję wp_make_link_relativew szereg filtrów w haku działaniatemplate_redirect . To dość prosty kod i wydaje się fajną opcją.


14
Dobra informacja. Zawsze używam ścieżek względem katalogu głównego, aby móc bezproblemowo wdrażać na dev.mysite.com -> qa.mysite.com -> www.mysite.com lub nawet www.anothersite.com. Szkoda, że ​​WP nie został zaprojektowany z myślą o tym. Ponieważ ustawienie WP_CONTENT_URLnie wydaje się być przeznaczone do ustawiania względnych adresów URL (nawet jeśli pozwala), wtyczka wydaje się być najlepszą opcją. Czy istnieje przypadek testowy, w którym wtyczka psuje się podczas ustawiania, WP_CONTENT_URLale działa dobrze podczas korzystania z wtyczki?
Justin

2
Względne ścieżki nigdy nie zaczynają się od, / a względne identyfikatory URI (do użytku wewnątrz <a>) nigdy nie zaczynają się od http://.
Tulains Córdova

13
Wordpress nigdy nie był przeznaczony dla odpowiednich stron internetowych, zawsze był to szybki hack, napisany przez hakerów, którzy (wyraźnie z cytatów tutaj) nie myśleli ani nie wyglądali nieszablonowo. Witrynę można przenieść tylko wtedy, gdy PRAWIDŁOWO używa względnych i / lub względnych adresów URL katalogu głównego. Bezwzględne adresy URL absolutnie temu zapobiegają.
Haqa

8
Utworzyłem witryny, które można skonfigurować do życia w poddomenach, katalogu głównym lub podfolderze. To nie jest bardzo trudne. Wydaje mi się, że istnieją powody, które w zasadzie mówią: „Zbudowaliśmy to dawno temu i ta zmiana byłaby zbyt wielka, więc nie naprawiamy tego”.
Donny V.

3
nadal uważam, że żaden z powodów deweloperów nie jest ważny. Zakodowany na stałe adres URL ma te same problemy, co adres względny, to po prostu kolejna naprawdę zła praktyka, którą pierwotni programiści mają w swoim zestawie narzędzi do `` złych nawyków '' ... jest ich wiele w WordPressie, dlatego wiele razy był rozwidlany, aby usunąć te problemy.
Dawesi

15
<?php wp_make_link_relative( $link ) ?>

Przekonwertuj pełne ścieżki URL na ścieżki względne.

Usuwa protokoły http lub https i domenę. Zachowuje ścieżkę „/” na początku, więc nie jest to prawdziwy link względny, ale z katalogu głównego sieci.

Źródła: Wordpress Codex


i gdzie upuszczasz ten fragment php?
Edward

6

Zgadzam się z Rupem. Myślę, że głównym powodem jest uniknięcie pomyłki na ścieżkach względnych. Myślę, że wordpress może działać od zera ze względnymi ścieżkami, ale problem może pojawić się podczas korzystania z wielu wtyczek, konfiguracji motywu itp.

Kiedyś użyłem tej wtyczki do ścieżek względnych podczas pracy na serwerach testowych:

Względne adresy
URL katalogu głównego Konwertuje wszystkie adresy URL na adresy URL względem katalogu głównego w celu hostowania tej samej witryny pod wieloma adresami IP, łatwiejszej migracji produkcyjnej i lepszych testów urządzeń mobilnych.


5
Dlaczego w ogóle potrzebna byłaby wtyczka, skoro wystarczy skonfigurować jedną stałą w pliku wp-config? Chyba że zapewni rozwiązanie pozwalające uniknąć szczególnej pułapki związanej z robieniem WP_CONTENT_URLkrewnych i nie ulegnie żadnym pułapkom z własnym podejściem. Chciałabym wiedzieć, czy rzeczywiście istnieje znana pułapka związana z robieniem WP_CONTENT_URLkrewnych.
AidanCurran

1
Adres URL zaczynający się od ukośnika /wp-content/some-file.jpgjest ścieżką bezwzględną, a nie ścieżką względną. Nie ma możliwości zamieszania. To włączenie protokołu i nazwy domeny do bezwzględnego adresu URL sprawia, że ​​WordPress nie jest pomocny bez uzasadnienia. Aby wdrożyć witrynę WP z wersji deweloperskiej na tymczasową, muszę uruchomić skrypt znajdowania i zastępowania nazw domen w zrzucie bazy danych. Myślę, że problem polega na tym, że jest przeznaczony do edycji treści w produkcji, która działa na blogach (do czego jest przeznaczona), ale nie na wielu komercyjnych witrynach.
Ade

1
w jaki sposób dude.com/bob/jane vs / bob / jane są mylące? #serious #badpractice
Dawesi

1
@Ade, zrób swoją pracę domową ze ścieżek względnych. Jesteś niepoprawny o /wp-content/some-file.jpgbycie absolulte ścieżka. W przypadku innych osób, które przeczytają Twój komentarz w przyszłości, pamiętaj, że ścieżka względna sieci to ścieżka, w której protokół i domena są wykluczone ze ścieżki. Tak więc /wp-content/some-file.jpgi wp-content/some-file.jpgoba są względne, przy czym wiodący /w pierwszym przykładzie ma na celu odwołanie się do dostępnego katalogu głównego właściciela konta lub serwera.
Pegues,

1
@Pegues OK, znalazłem wiele źródeł (niektóre na SO) używających terminu „ścieżka bezwzględna” w przeciwieństwie do „bezwzględnego adresu URL”. Nazywa się ją również ścieżką „Root Relative”. Chociaż semantyka i terminologia są oczywiście ważne, to nadal jest jasne, że różnią się one od siebie zasadniczo. Bycie względnym w stosunku do katalogu głównego ma wszystkie zalety spójności bezwzględnego adresu URL. Chyba że istnieje jakiś inny powód, którego nie jestem świadomy.
Ade,

4

Rozwiązałem to na mojej stronie, robiąc to w 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);

}

Wziąłem część jednej wtyczki, pociąłem ją na kawałki i zrobiłem to. Zastąpił WSZYSTKIE linki w mojej witrynie (menu, css, skrypty itp.) I wszystko działało.


0

W obszarze Ustawienia => Media dostępna jest opcja „Pełna ścieżka URL do plików”. Jeśli ustawisz to na domyślną ścieżkę katalogu multimediów „/ wp-content / uploads” zamiast pustej, wstawi ona ścieżki względne, np. „/Wp-content/uploads/2020/06/document.pdf”.

Nie jestem pewien, czy sprawia, że ​​wszystkie linki są względne, np. Do postów, ale przynajmniej obsługuje media, o co prawdopodobnie martwi się większość ludzi.


Ta opcja „Pełna ścieżka URL do plików” nie pojawia się domyślnie w Ustawieniach multimediów. Czy jest jakieś ustawienie w wp-config, które go aktywuje?
AidanCurran

@AidanCurran Jestem prawie pewien, że istniał tam przez długi czas, ale po kilku badaniach wydaje się, że jest jakaś wp-config, która to umożliwia, ponieważ została domyślnie usunięta z WP 3.5+. Można go przywrócić za pomocą starej wtyczki, takiej jak: wordpress.org/plugins/upload-url-path-enabler Więc myślę, że jedna z moich wtyczek dodaje to z powrotem, mimo że prawie żadna nie jest zainstalowana. Wystarczy użyć Elementora i motywu Futurio z wtyczką Futurio Extra. Próbowałem je wyłączyć bez żadnych zmian, więc nie jestem pewien: /
przytul

@AidanCurran Możesz dodać coś takiego jak: update_option ('upload_url_path', '/ wp-content / uploads'); w pliku functions.php dla motywu lub za pośrednictwem wtyczki fragmentu kodu i powinno to mieć ten sam efekt.
przytul

-3

powinien użyć get_home_url (), wtedy twoje linki są bezwzględne, ale nie ma to wpływu na zmianę adresu URL witryny


-4

Myślę, że podczas zmiany nazw domen plik zrzutu sql, który masz, możesz zastąpić wszystkie wystąpienia starej nazwy domeny nową. Jest to jedyna dostępna opcja, ponieważ nie ma wtyczek, które pomogą Ci to zrobić.

To najszybszy sposób ...


1
Pamiętaj, że będziesz chciał również zamienić nazwę domeny na zserializowane ciągi PHP. To przydatne narzędzie do wyszukiwania i zamiany wydaje się być standardowym sposobem robienia rzeczy (repozytorium GitHub tutaj ). Jest to używane przez rozwiązania wdrożeniowe Capistrano, których używam, takie jak capistrano-wp i wydaje się, że działa bardzo dobrze. Jest również wymieniony na oficjalnej stronie Moving WordPress Codex .
Matt Gibson

3
Takie podejście jest nieporządne i podatne na błędy. Jeśli możemy tego uniknąć, używając względnych adresów URL w wp-config, czy nie jest to o wiele lepiej? Chodzi o to, aby dowiedzieć się, czy użycie względnego adresu URL w wp-config może powodować problem.
AidanCurran

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.