Відносні URL-адреси в WordPress


115

У WordPress мені завжди було страшно, що зображення, файли, посилання тощо вставляються в WordPress з абсолютною URL-адресою замість відносної URL-адреси. Відносна URL-адреса набагато зручніша для перемикання доменних імен, зміни між http та https тощо. Сьогодні я виявив, що якщо ви визначаєте WP_CONTENT_URL з відносною URL-адресою, тоді, коли ви вставляєте файли в повідомлення, вони використовують відносний URL для src замість абсолютного URL. . Просто те, чого я завжди хотів! Але офіційна документація WordPress говорить, що ви повинні використовувати повний URI, якщо ви визначаєте WP_CONTENT_URL.

WordPress кодекс говорить :

Встановіть WP_CONTENT_URL на повний URI цього каталогу (відсутній кінець косої риси), наприклад

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

Здається, все працює добре, коли я використовую відносну URL-адресу, наприклад

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

Але чи є якась проблема із використанням відносного URI? Я просто думаю, що в WordPress повинна бути причина, що вона повинна визначатися з повним URI.


3
Я думаю, що відповідь полягає в тому, щоб перевірити всі його використання в коді WP і в коді плагінів, які ви використовуєте, щоб переконатися, що жоден з них не вважає, що це повна URL-адреса, коли її немає, але я не можу придумати жодної причини це не було б нормально з моєї голови.
Rup

2
спробуйте цей плагін wordpress.org/plugins/relative-url або читати це може допомогти вам deluxeblogtips.com/2012/06/relative-urls.html
Крішною

5
@Krishna: Навіщо нам потрібен плагін, якщо ми можемо просто ввести відносну URL-адресу у wp-config? Суть питання полягає в тому, щоб з’ясувати, чи може використовувати відносну URL-адресу в wp-config проблему.
AidanCurran

36
Я плачу, коли мені доводиться торкатися wordpress.
Тоні Кронін

6
@TonyCronin Будь щасливим, що це не Drupal.
motorbaby

Відповіді:


75

Я думаю, що це питання, на яке міг / повинен відповісти лише розробник ядра. Я дослідив і знайшов основний квиток № 17048: URL-адреси, що надходять до браузера, мають бути кореневими . Де ми можемо знайти причини, пояснені Ендрю Начіним, головним розробником ядра. Він також посилається на цю тему [wp-хакери] . На обох цих посиланнях це ключові цитати про те, чому WP не використовує відносні URL-адреси:

Основний квиток:

  • Кореневі URL-адреси насправді не є правильними. /path/може бути не WordPress, це може бути поза встановленням. Тож насправді це не сильно відрізняється від абсолютної URL-адреси.

  • Будь-які відносні URL-адреси також значно ускладнюють виконання перетворень під час переміщення встановлення. У більшості ситуацій пошук-заміна буде необхідним, а наявність абсолютної URL-адреси з цих причин іронічно більш портативна.

  • абсолютні URL-адреси потрібні в багатьох інших місцях. Необхідність додавати ці умови умовно додасть до обробки, а також введе потенційні помилки (та несумісність із плагінами).

[wp-хакери] нитка

  • Щодо того, я не впевнений, оскільки WordPress часто знаходиться у підкаталозі, а це означає, що нам завжди потрібно буде обробляти вміст, а потім додавати його в іншій частині шляху. Це вводить накладні витрати.

  • Майте на увазі, що існують два типи відносних URL-адрес із провідною косою рисою та без неї. В обох є застереження, які унеможливлюють належне виконання.

  • WordPress повинен (і дійсно) зберігає абсолютні URL-адреси. Це не вимагає попередньої обробки контенту, ніяких накладних витрат, неясності. Якщо вам потрібно переїхати, це глобальна знахідка-заміна в базі даних.


І, в особистому записі, не раз я знаходив тему та плагіни, кодовані неправильно, які просто ламаються, коли WP_CONTENT_URLвизначено.
Вони не знають, що це можна встановити і припускати, що це правда: WP.URL / wp-content / WhatEver , і це не завжди так. І щось поламає по дорозі.


Плагін Відносні URL (пов'язані в edse Відповідь «и ), застосовує функцію wp_make_link_relativeв серії фільтрів в гаку дійtemplate_redirect . Це досить простий код і здається приємним варіантом.


14
Гарна інформація. Я завжди використовую відносні кореневі шляхи, щоб я міг розгорнутись до dev.mysite.com -> qa.mysite.com -> www.mysite.com або навіть www.anothersite.com без проблем. Прикро, що WP не було розроблено з урахуванням цього. Оскільки налаштування WP_CONTENT_URL, здається, не призначене (хоча це дозволяє) встановити відносні URL-адреси, плагін здається найкращим варіантом. Чи є тестовий випадок, коли плагін під час налаштування ламається, WP_CONTENT_URLале працює добре при використанні плагіна?
Джастін

2
Відносні шляхи ніколи не починаються з / відносних URI (для використання всередині <a>) ніколи не починаються http://.
Тулен Кордова

13
Wordpress ніколи не призначався для належних веб-сайтів, це завжди був швидкий злом, написаний хакерами, які (зрозуміло з цитат тут) не думали і не дивилися поза коробкою. Єдиний спосіб перенести веб-сайт, це якщо ПРАВИЛЬНО використовувати відносні та / або відносні URL-адреси кореня. Абсолютні URL-адреси абсолютно перешкоджають цьому.
Хака

8
Я створив сайти, на яких можна налаштувати жити в піддоменах, root або sub папці. Це не дуже важко. Я відчуваю, що причини в основному говорять: "Ми створили це дуже давно, і ця зміна зміниться значною мірою, тому ми не виправляємо це".
Донні В.

3
все ще думаю, що жодна з причин розробників не є дійсною. У жорстко зашифрованому URL-адресі виникають ті ж проблеми, що і у відносному, це просто ще одна дійсно погана практика, яку мають оригінальні розробники у своїх інструментаріях "шкідливих звичок" ... їх у Wordpress багато, тому його багато разів видаляють ці питання.
Dawesi

15
<?php wp_make_link_relative( $link ) ?>

Перетворення повних URL-адрес у відносні шляхи.

Вилучає протоколи http або https та домен. Зберігає шлях '/' на початку, тому це не справжнє відносне посилання, а від бази кореневих веб-сторінок.

Довідка: Wordpress Codex


і куди ви кинете цей фрагмент php?
Едвард

6

Я згоден з Рупом. Гадаю, головна причина - уникнути плутанини щодо відносних шляхів. Я думаю, що wordpress може працювати з нуля з відносними шляхами, але проблема може виникнути при використанні декількох плагінів, налаштування теми тощо.

Я колись використовував цей плагін для відносних шляхів, коли працював на тестуванні серверів:

Кореневі відносні URL-адреси
Перетворює всі URL-адреси у відносні кореневі URL-адреси для розміщення одного і того ж сайту на декількох IP-адресах, легшої міграції виробництва та кращого тестування мобільних пристроїв.


5
Чому плагін навіть необхідний, якщо все необхідне - це налаштувати одну константу у файлі wp-config? Якщо це не дає рішення, щоб уникнути певного підводного стосунку WP_CONTENT_URLі не піддатися жодним підводним каменям власним підходом. Що я хотів би знати, якщо є насправді відомий підводний камінь із створенням WP_CONTENT_URLродичів.
AidanCurran

1
URL-адреса, що починається з нахилу вперед, /wp-content/some-file.jpg- це абсолютний шлях, а не відносний шлях. Немає можливої ​​плутанини. Саме включення протоколу та доменного імені в абсолютну URL-адресу робить WordPress корисним без обґрунтування. Для розгортання WP-сайту від розробника до постановки на реалізацію я повинен запустити скрипт пошуку та заміни доменних імен на дамп бази даних. Я думаю, що проблема полягає в тому, що він призначений для редагування вмісту у виробництві, який працює для блогів (для чого він створений), але не для багатьох комерційних веб-сайтів.
Аде

1
як плутати dude.com/bob/jane vs / bob / jane? #serious #badpractice
Dawesi

1
@Ade, виконайте домашнє завдання щодо відносних шляхів. Ви неправильно ставитесь /wp-content/some-file.jpgдо абсолютного шляху. Для інших, хто читає ваш коментар у майбутньому, зауважте, що веб-відносний шлях - це шлях, у якому протокол та домен виключені з шляху. Таким чином, /wp-content/some-file.jpgі wp-content/some-file.jpgобидва по порівнянні з провідним /в першому прикладі , утримуючи мета посилання доступного кореневого каталогу власника рахунків або сервера.
Pegues

1
@Pegues Гаразд, я знайшов багато джерел (деякі на SO), використовуючи термін "абсолютний шлях" на відміну від "абсолютного URL-адреса". Це також називається "кореневим відносним" шляхом. Незважаючи на те, що семантика та термінологія є, безумовно, важливими, однак все ж стоїть висновок, що вони принципово відрізняються один від одного. Що стосується кореня, то всі переваги несуперечливості мають абсолютний URL. Якщо немає якихось інших міркувань, яких я не знаю.
Аде

4

Я вирішив це на своєму веб-сайті, зробивши це у function.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);

}

Я взяв частину одного плагіна, розрізав його на шматочки і зробив це. Він замінив ВСІ посилання на моєму сайті (меню, css, скрипти тощо), і все працювало.


0

У розділі Налаштування => Медіа є опція "Повний URL-шлях для файлів". Якщо встановити цей шлях до медіа-каталогу за замовчуванням '/ wp-content / uploads' замість порожнього, він буде вставляти відносні шляхи, наприклад '/wp-content/uploads/2020/06/document.pdf'.

Я не впевнений, чи це робить усі посилання відносними, наприклад, до публікацій, але, принаймні, він обробляє засоби масової інформації, що, мабуть, саме це хвилює більшість людей.


Ця опція "Повний URL-адрес до файлів" за замовчуванням не відображається в Налаштуваннях медіа. Чи є якесь налаштування в wp-config, яке його активує?
АйданКурран

@AidanCurran Я майже впевнений, що він там уже давно, але після деяких досліджень, схоже, є якийсь wp-конфігуратор, який дозволяє це врешті-решт, тому що він був видалений за замовчуванням з WP 3.5+. Його можна повернути за допомогою старого плагіна на зразок: wordpress.org/plugins/upload-url-path-enabler Отже, я думаю, один із моїх плагінів додає це назад, навіть якщо я ледве не встановлений. Просто використовуючи Elementor і тему Futurio із плагіном Futurio Extra. Я намагався відключити їх без будь-яких змін, тому не впевнений: /
обійняти

@AidanCurran Ви можете додати щось на зразок: update_option ("upload_url_path", "/ wp-content / uploads"); у вашому файлі function.php для теми або через якийсь плагін фрагменту коду, і він повинен мати той же ефект.
обійняти

-3

слід використовувати get_home_url (), тоді ваші посилання абсолютні, але це не впливає на зміну URL-адреси сайту


-4

Я думаю, що ви робите, коли ви змінюєте доменні імена, файли дамп-файлу sql, які у вас є, ви можете замінити всі екземпляри старого доменного імені на нові. Це лише варіант, оскільки немає плагінів, які допоможуть вам це зробити.

Це найшвидший спосіб ..


1
Майте на увазі, ви також захочете замінити доменне ім’я в серіалізованих рядках PHP. Цей зручний інструмент пошуку та заміни здається стандартним способом роботи (репозиторій GitHub тут ). Це використовується рішеннями для розгортання Capistrano, які я використовую як capistrano-wp і, здається, працює дуже добре. Про це також посилається на офіційній сторінці Moving WordPress Codex .
Метт Гібсон

3
Цей підхід безладний і схильний до помилок. Якщо ми можемо цього уникнути, використовуючи відносні URL-адреси в wp-config, чи не так вже й краще? Суть питання полягає в тому, щоб з’ясувати, чи може використовувати відносну URL-адресу в wp-config проблему.
АйданКурран

-4

Є простий спосіб

Замість /pagename/використання index.php/pagename/або якщо ви не використовуєте постійні посилання, виконайте наступне:

Опублікувати

index.php?p=123

Сторінка

index.php?page_id=42

Категорія

index.php?cat=7

Більше інформації тут: http://codex.wordpress.org/Linking_Posts_Pages_and_Ca категории


Це не відповідає на запитання.
Матенг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.