Относительные 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