Относительные URL в WordPress
Я всегда находил разочарование в WordPress тем, что изображения, файлы, ссылки и т.д. Вставляются в WordPress с абсолютным URL-адресом вместо относительного URL-адреса. Относительный URL намного удобнее для переключения доменных имен, переключения между http и https и т.д. Сегодня я обнаружил, что если вы определяете WP_CONTENT_URL с относительным URL, то при вставке файлов в сообщения они используют относительный URL для src вместо абсолютного URL., Именно то, что я всегда хотел! Но в официальной документации WordPress сказано, что вам следует использовать полный URI, если вы определяете WP_CONTENT_URL.
Кодекс WordPress гласит::
Set WP_CONTENT_URL to the full URI of this directory (no trailing
slash), e.g.
define( 'WP_CONTENT_URL', 'http://example/blog/wp-content');
Кажется, что все работает нормально, когда я использую относительный URL, например,
define( 'WP_CONTENT_URL', '/my-content-folder');
Но есть ли проблема с использованием относительного URI? Я просто думаю, что должна быть причина для WordPress заявить, что он должен быть определен с полным URI.
Ответы
Ответ 1
Я думаю, что на этот вопрос может/должен ответить только основной разработчик. Я исследовал и обнаружил, что основной билет # 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 Answer) применяет функцию wp_make_link_relative
в серии фильтров в хуке действий template_redirect
. Это довольно простой код и кажется хорошим вариантом.
Ответ 2
<?php wp_make_link_relative( $link ) ?>
Преобразование всех URL-адресов в относительные пути.
Удаляет протоколы http или https и домен. Сохраняет путь "/" в начале, поэтому это не истинная относительная ссылка, а из корневой базы веб-сайта.
Ссылка: Wordpress Codex
Ответ 3
Я согласен с Rup. Я думаю, главная причина - избегать путаницы на относительных путях. Я думаю, Wordpress может работать с нуля с относительными путями, но проблема может возникнуть при использовании нескольких плагинов, способа настройки темы и т.д.
Я использовал этот плагин для относительных путей при работе с серверами тестирования:
Коренные относительные URL
Преобразует все URL-адреса в корневые URL-адреса для размещения одного и того же сайта на нескольких IP-адресах, упрощает производственную миграцию и улучшает тестирование мобильных устройств.
Ответ 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, скрипты и т.д.), И все работало.
Ответ 5
Мне нравится, как Joomla обрабатывает URL-адреса... относительно своего собственного местоположения, а не webroot. Вы можете легко изменить домен или переместить все это в подкаталог, не выполняя поиск/замену базы данных или другие хаки... при условии, что любые URL-адреса, которые вы добавляете вручную, также придерживаются этого соглашения, например, src="images/slider/slide1.jpg"
. Обратите внимание на отсутствие начального /
, в котором указывался бы путь относительно корня документа веб-сервера, а не установки joomla.
Решение разработчиков Wordpress сделать это по-другому не может быть оправдано никакими техническими терминами, хотя, возможно, оно требует от пользователей и производителей плагинов меньшей строгости.
Также могут быть преимущества SEO, поскольку любые копии сайта будут иметь различное содержимое после поиска/замены базы данных, необходимого для размещения копии под другим именем хоста (хотя, как и все приемы SEO, алгоритмы поисковых систем в конечном итоге обходят их).
И, конечно же, поскольку Wordpress имеет коммерческий компонент, компанию, занимающуюся хостингом блогов, можно утверждать, что создание сайтов, вызывающих затруднения у новичков, помогает коммерческим интересам достичь этой давно поставленной цели - "блокирование поставщиков". Но не быть циничным ;-)
Ответ 6
должен использовать get_home_url(), тогда ваши ссылки являются абсолютными, но это не влияет на изменение URL-адреса сайта
Ответ 7
Я думаю, что вы делаете это, пока вы меняете имена доменов, файл дампа sql, который у вас есть, вы можете заменить все экземпляры старого имени домена новым. Это только опция, так как нет плагинов, которые помогут вам сделать это.
Это самый быстрый способ.
Ответ 8
Существует простой способ
Вместо /pagename/
используйте index.php/pagename/
или если вы не используете permalinks, выполните следующие действия:
Сообщение
index.php?p=123
Страница
index.php?page_id=42
Категория
index.php?cat=7
Дополнительная информация здесь: http://codex.wordpress.org/Linking_Posts_Pages_and_Categories