Относительные URL-адреса в WordPress

115

В WordPress меня всегда расстраивало то, что изображения, файлы, ссылки и т. Д. Вставляются в WordPress с абсолютным 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
37
Я плачу, когда мне приходится дотронуться до wordpress.
Тони Кронин,
6
@TonyCronin Будьте счастливы, что это не Drupal.
motorbaby

Ответы:

75

Я думаю, что на этот вопрос может / должен ответить только разработчик ядра. Я исследовал и нашел основной тикет # 17048: URL-адреса, доставляемые браузеру, должны относиться к корневому каталогу . Где мы можем найти причины, объясненные Эндрю Насином, ведущим разработчиком ядра. Он также ссылается на эту ветку [wp-hackers] . По обеим этим ссылкам это ключевые цитаты о том, почему WP не использует относительные URL-адреса:

Основной билет:

  • URL-адреса, относящиеся к корню, не совсем правильные. /path/может не быть WordPress, это может быть вне установки. Так что на самом деле это не сильно отличается от абсолютного URL.

  • Любые относительные URL-адреса также значительно затрудняют выполнение преобразований при перемещении установки. Поиск-замена понадобится в большинстве ситуаций, и по иронии судьбы наличие абсолютного URL-адреса более переносимо по этим причинам.

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

[wp-hackers] ветка

  • Относительно чего, я не уверен, поскольку WordPress часто находится в подкаталоге, что означает, что нам всегда нужно обрабатывать контент, чтобы затем добавить его в оставшуюся часть пути. Это приводит к накладным расходам.

  • Имейте в виду, что существует два типа относительных URL-адресов: с косой чертой и без нее. У обоих есть предостережения, которые делают это невозможным должным образом.

  • WordPress должен (и хранит) абсолютные URL-адреса. Это не требует предварительной обработки контента, никаких накладных расходов и двусмысленности. Если вам нужно переехать, это глобальный поиск-замена в базе данных.


И, от себя лично, я неоднократно обнаруживал, что темы и плагины плохо закодированы, которые просто ломаются, когда они WP_CONTENT_URLопределены.
Они не знают, что это можно установить, и предполагают, что это правда: WP.URL / wp-content / WhatEver , и это не всегда так. И что-то сломается по пути.


Плагин Относительные URL (связанные в edse Ответ «ы ), применяет функцию wp_make_link_relativeв серии фильтров в крюке действийtemplate_redirect . Это довольно простой код и кажется хорошим вариантом.

Brasofilo
источник
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://.
Tulains Córdova,
14
Wordpress никогда не предназначался для настоящих веб-сайтов, это всегда был быстрый взлом, написанный хакерами, которые (очевидно, из цитат здесь) не думали и не смотрели нестандартно. Единственный способ переместить веб-сайт - это ПРАВИЛЬНО использовать относительные и / или корневые относительные URL-адреса. Абсолютные URL-адреса абсолютно этому препятствуют.
Haqa
9
Я создал сайты, которые можно настроить для работы в субдоменах, корневой или подпапке. Это не очень сложно. Мне кажется, что есть причины, которые в основном говорят: «Мы построили это давным-давно, и это изменение может сильно сломаться, поэтому мы его не исправляем».
Donny V.
4
до сих пор считаю, что ни одна из причин разработчиков не обоснована. Жестко закодированный URL-адрес имеет те же проблемы, что и относительный, это просто еще одна действительно плохая практика, которую оригинальные разработчики используют в своем наборе инструментов для `` плохих привычек '' ... их много в wordpress, поэтому его много раз разветвляли для удаления эти вопросы.
Давеси
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
Давеси
1
@Ade, пожалуйста, сделайте домашнее задание по относительным путям. Вы /wp-content/some-file.jpgошибаетесь, говоря об абсолютном пути. Для тех, кто прочитает ваш комментарий в будущем, обратите внимание, что относительный веб-путь - это путь, для которого протокол и домен исключены из пути. Таким образом, /wp-content/some-file.jpgи wp-content/some-file.jpgявляются относительными, причем начало /в первом примере содержит ссылку на доступный корневой каталог владельца учетной записи или сервера.
Pegues
1
@Pegues Хорошо, я нашел много источников (некоторые на SO), использующие термин «абсолютный путь», а не «абсолютный URL-адрес». Его также называют «корневым относительным» путем. Хотя семантика и терминология, конечно, важны, тем не менее, они принципиально отличаются друг от друга. Отношение к корню имеет все преимущества согласованности абсолютного URL-адреса. Если нет других причин, о которых я не знаю.
Ade
4

Я решил это на своем сайте, сделав это в 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);

}

Я взял часть одного плагина, разрезал его на части и сделал это. Он заменил ВСЕ ссылки на моем сайте (меню, CSS, скрипты и т. Д.), И все заработало.

Икебастуз
источник
0

В разделе «Настройки» => «Медиа» есть опция «Полный URL-путь для файлов». Если вы установите для него путь к каталогу мультимедиа по умолчанию «/ wp-content / uploads» вместо пустого, он будет вставлять относительные пути, например, «/wp-content/uploads/2020/06/document.pdf».

Я не уверен, делает ли он все ссылки относительными, например, к сообщениям, но, по крайней мере, он обрабатывает медиа, что, вероятно, и беспокоит большинство людей.

объятие
источник
Этот параметр «Полный URL-путь к файлам» по умолчанию не отображается в настройках мультимедиа. Есть ли какой-нибудь параметр в wp-config, который его активирует?
AidanCurran
@AidanCurran Я почти уверен, что он существует уже давно, но после некоторого исследования кажется, что есть какой-то wp-config, который все-таки позволяет это, потому что он был удален по умолчанию из WP 3.5+. Его можно вернуть, используя старый плагин, например: wordpress.org/plugins/upload-url-path-enabler Итак, я полагаю, один из моих плагинов добавляет это обратно, хотя у меня почти не установлено. Просто использую Elementor и тему Futurio с плагином Futurio Extra. Я попытался отключить их без каких-либо изменений, поэтому не уверен: /
hug
@AidanCurran Вы можете добавить что-то вроде: update_option ('upload_url_path', '/ wp-content / uploads'); в вашем файле functions.php для темы или через какой-либо плагин фрагмента кода, и он должен иметь тот же эффект.
обнимаю
-3

следует использовать get_home_url (), тогда ваши ссылки будут абсолютными, но это не повлияет на изменение URL сайта

Ботонд Вайна
источник
-4

Я думаю, что вы делаете, когда вы меняете доменные имена, файл дампа sql, который у вас есть, вы можете заменить все экземпляры старого доменного имени новым. Это единственный доступный вариант, поскольку нет плагинов, которые помогут вам в этом.

Это самый быстрый способ ..

Шива
источник
1
Имейте в виду, что вы также захотите заменить доменное имя в сериализованных строках PHP. Этот удобный инструмент поиска и замены кажется стандартным способом работы (репозиторий GitHub здесь ). Это используется решениями для развертывания Capistrano, которые я использую, например capistrano-wp, и, похоже, работает очень хорошо. Он также упоминается на официальной странице Moving WordPress Codex .
Мэтт Гибсон,
3
Такой подход запутан и подвержен ошибкам. Если мы можем избежать этого, используя относительные URL-адреса в wp-config, не так ли лучше? Суть вопроса - выяснить, может ли использование относительного URL-адреса в wp-config вызвать проблему.
AidanCurran
-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_Categories

Гер
источник
Это не отвечает на вопрос.
Mateng