В чем разница между home_url() и site_url()
Как я понимаю, site_url() возвращает расположение, где находятся основные файлы WordPress.
Если мой блог размещен по адресу http://example.com/blog, тогда site_url() возвращает http://example.com/blog
Но тогда чем отличается home_url()? У меня home_url() возвращает то же самое: http://example.com/blog
Если это правильно, то могу ли я заставить WordPress возвращать http://example.com/?
Вы задаете два вопроса одновременно:
- В чем разница между
home_url()иsite_url()? - Как получить корневой URL WordPress без подкаталога, в котором он установлен?
Вот ответы, которые я подтвердил с Эндрю Нацином (Andrew Nacin), одним из основных разработчиков WordPress, а также провел собственные тесты на сервере.
Вопрос №1
В разделе Настройки → Общие в админке WordPress, функция home_url() ссылается на поле "Адрес сайта (URL)". Запутанно, не так ли? Да, там написано "Адрес сайта", поэтому можно подумать, что это site_url(), но это не так. Проведите собственный тест, и вы увидите. (Вы можете временно добавить вывод значений site_url() и home_url() через echo в начале файла functions.php вашей темы.)
Между тем, site_url() ссылается на поле "Адрес WordPress (URL)" в Настройки → Общие.
Таким образом, если вам нужно указать физический путь, например, для вызова папки плагина или темы (чтобы загрузить изображение), используйте другие функции — plugins_url() и get_template_directory_uri().
Функция site_url() всегда указывает на расположение, где можно получить доступ к сайту, добавив /wp-admin в конце URL, тогда как home_url() не всегда будет вести туда.
Функция home_url() указывает на главную страницу, которую вы установили в поле "Адрес сайта (URL)".
Вопрос №2
Итак, если ваш блог расположен в http://example.com/blog, а example.com — это просто статический сайт с портфолио, то этот сценарий соответствует вашему вопросу. В таком случае можно использовать следующий код:
<?php
function getDomain() {
$sURL = site_url(); // WordPress функция
$asParts = parse_url( $sURL ); // PHP функция
if ( ! $asParts )
wp_die( 'ОШИБКА: Путь поврежден для парсинга.' ); // замените на более подходящее сообщение об ошибке
$sScheme = $asParts['scheme'];
$nPort = $asParts['port'];
$sHost = $asParts['host'];
$nPort = 80 == $nPort ? '' : $nPort;
$nPort = 'https' == $sScheme AND 443 == $nPort ? '' : $nPort;
$sPort = ! empty( $nPort ) ? ":$nPort" : '';
$sReturn = $sScheme . '://' . $sHost . $sPort;
return $sReturn;
}
Это было по электронной почте. Извините. Ах да, спасибо за правку — в следующий раз я запомню этот синтаксис.
Volomike
Мне потребовалось много времени и мучений, чтобы осознать, что 'Адрес сайта (URL)' = 'home', а 'Адрес WordPress (URL)' = 'siteurl'. Эти названия определенно стоит изменить.
Jbm
Кажется, здесь опечатка в строке $sPort = ! empty( $sPort ) ? ":$nPort" : '';. Думаю, ! empty( $sPort ) должно быть ! empty( $nPort ). Иначе ":$nPort" никогда не будет достигнуто, следовательно $sPort = '' и порт никогда не добавится в предпоследней строке.
Ferris
##Кратко:
При нестандартной установке вы можете разместить файлы WordPress в подкаталоге корневой директории вашего сайта.
...и при этом позволить посетителям получать доступ к вашему WordPress "сайту" из корневого URL домена, без добавления имени подкаталога:
(например: www.example.com вместо www.example.com/wordpress):
Функция WP | wp_options. | Константа WP | что представляет | Настройка WP | Пример
-------------------------------------------------------------------------------------------------------------------------------------
`site_url()` | `siteurl` | `WP_SITEURL` | Расположение файлов WP | Адрес WordPress | https://www.example.com/wordpress
`home_url()` | `home` | `WP_HOME` | Адрес в строке браузера | Адрес сайта | https://www.example.com
Где значение константы WP имеет приоритет над значением из wp_options/настроек WP.
##Различные конфигурации WordPress
В самых стандартных установках WordPress значения home_url и site_url будут одинаковыми.
Тем не менее, они представляют разные вещи.
В нестандартной установке они могут иметь разные значения.
ПРИМЕЧАНИЕ: Я опускаю протокол в ответе для удобства чтения.
В этом посте ДОБАВЬТЕ К КАЖДОМУ URL:https://,http://ИЛИ//
(если я уже не указал его).
(// - это относительный протокол и будет работать для обоих http:// и https://)
Стандартные установки (включая "One-Click" установки)
home_url: это домашняя страница вашего (WordPress) сайта, как указано в адресной строке пользователя.
site_url: это каталог, где расположены файлы WordPress.
В 5-минутной установке WordPress эти два значения будут одинаковыми - файлы WordPress будут установлены в той же папке, из которой пользователи должны обращаться к вашему сайту, или в части WordPress (блога) корневого каталога вашего сервера.
Пример 1:
пользователь получает доступ к вашему блогу по: www.example.com,
файлы WordPress установлены в: www.example.com, или корневую папку сайта на сервере.
home_url === site_url === "www.example.com"
Пример 2:
пользователь получает доступ к вашему блогу по: www.example.com/blog,
файлы WordPress установлены в: www.example.com/blog, или в папке blog внутри корня вашего сайта.
home_url === site_url === "www.example.com/blog"
В этом случае www.example.com - это основной сайт, а www.example.com/blog - корень вашего блога.
Здесь ваш блог отделен от основного сайта и работает как его подмножество.
В этом случае ваш основной сайт не контролируется, не определяется и не стилизуется WordPress.
Только ваш блог. Все URL в вашем блоге будут начинаться с www.example.com/blog
Примечание: В документации "WordPress сайт/веб-сайт" (в отличие от просто "сайт/веб-сайт") относится к каталогу, где установлены файлы WordPress. В этом случае это www.example.com/blog - всё внутри папки blog. "WordPress сайт" в этом сценарии не то же самое, что ваш домен, корень или основной сайт. Это подмножество вашего общего сайта. Что-то вроде сайта внутри сайта. Я упоминаю это, так как терминология может показаться неясной или запутанной в данной настройке.
Альтернативная конфигурация установки WordPress
Выделение WordPress в отдельный каталог, раздел Метод II (С изменением URL).
Например, многие не хотят засорять корневую папку своего сайта всеми файлами WordPress.
Они хотят установить WordPress в подкаталог, *но чтобы "блог" или "WordPress сайт" был доступен как если бы файлы были установлены в корне сервера.
Это особенно актуально, когда WordPress используется для создания и управления целым сайтом, который даже не имеет "блога".
Пример 3:
пользователь получает доступ к вашему "блогу" по: www.example.com,
файлы WordPress установлены в: www.example.com/wordpress, или корневую папку сайта на сервере.
home_url === "www.example.com"
site_url === "www.example.com/wordpress"
(Примечание: эта конфигурация не будет работать "из коробки" просто изменением значений этих переменных. Для правильной работы требуются дополнительные изменения конфигурации)
См. Выделение WordPress в отдельный каталог, раздел Метод II (С изменением URL) для инструкций.
В этом случае home_url и site_url должны содержать разные значения.
В этой настройке вы хотите, чтобы ваш сайт функционировал точно как если бы файлы WordPress были установлены в корневом каталоге сервера...
НО, для организационных целей на сервере,
ваши файлы WordPress фактически находятся в папке wordpress в корневом каталоге сервера.
Таким образом, пользователь будет вводить www.example.com для доступа к главной странице WordPress, вместо www.example.com/wordpress
Функция WordPress <--> переменная базы данных <--> Константа WordPress
Этот раздел предполагает конфигурацию из Примера 3 выше.
URL в адресной строке: www.example.com
файлы WordPress: в каталоге /wordpress
(Другие случаи тривиальны: Все переменные/функции содержат/возвращают одинаковые значения.)
Как установить значения для site_url и home_url
Во-первых, замечу, что siteurl и home хранят значения, возвращаемые функциями выше
- Обычно вы устанавливаете эти значения в админ-панели WordPress:
Настройки -> Общие ->
siteurlАдрес WordPress:https://www.example.com/wordpress
homeАдрес сайта:https://www.example.com
(не включайте завершающие слеши здесь - они настраиваются в другом месте)
Альтернативно, вы можете установить эти значения в базе данных WordPress:
таблицаwp_options->options_name|options_valuesiteurl|https://www.example.com/wordpress
home|https://www.example.com
(не включайте завершающие слеши здесь - они настраиваются в другом месте)
Отредактируйте ваш
wp-config.php
Определите эти конкретные константы для хранения ваших значений
Определите настройкиWP_HOMEиWP_SITEURL, добавив эти строки в начало вашего файлаwp-config.php:define('WP_SITEURL','http://example.com/wordpress'); // основные файлы wordpress define('WP_HOME','http://example.com'); // URL в адресной строке
// ** Настройки MySQL - эту информацию можно получить у хостинг-провайдера ** // ...
(не включайте завершающие слеши здесь - они настраиваются в другом месте)
Ссылки: WP_SITEURL и WP_HOME
ПРИМЕЧАНИЕ: Это запутанно
(Мне действительно хотелось бы, чтобы WordPress пометил настройки аналогично их PHP-именам,
например Адрес сайта WordPress и Адрес домашней страницы или что-то более явное вроде расположение основных файлов сайта WordPress и URL в браузере для доступа к главной странице WordPress)
`WP_SITEURL` <--> `site_url()` <--> `siteurl` <--> Адрес WordPress <--> /wordpress
`WP_HOME` <--> `home_url()` <--> `home` <--> Адрес сайта <--> /
Теперь вот где начинаются сложности!
ЕСЛИ вы определили эти константы в вашем файле wp-config.php, не имеет значения, какие значения у вас в базе данных/настройках.
Фактически, вы не сможете изменить это значение через админку (оно будет серым). Вы всё ещё можете изменить его, редактируя базу данных, но это не повлияет на ваш сайт, пока константы существуют в файле wp-config.
Ваш конфигурационный файл не изменит значения в вашей базе данных (и, следовательно, на странице настроек). Вместо этого значения в базе данных/настройках будут игнорироваться. Значения в wp-config переопределяют или имеют приоритет над настройками в базе данных.
#Итак... подводя итоги (Кратко) :
Функция WP | wp_options. | Константа WP | что представляет | Настройка WP | Пример
-------------------------------------------------------------------------------------------------------------------------------------
`site_url()` | `siteurl` | `WP_SITEURL` | Расположение файлов WP | Адрес WordPress | https://www.example.com/wordpress
`home_url()` | `home` | `WP_HOME` | Адрес в строке браузера | Адрес сайта | https://www.example.com
Где значение константы WP имеет приоритет над значением из wp_options/настроек WP.
Значение записи wp_options и значение Настроек WP одинаковы.
Редактирование одного, по определению, редактирует другое.
Это просто два разных способа доступа к одной и той же переменной.
С другой стороны, Константы WordPress уникальны и независимы.
Внутренне константы WordPress (PHP) переопределяют их аналоги из базы данных.
Если константа определена в wp-config, она не изменяет базу данных.
Но внутренне WordPress всегда будет предпочитать/использовать её значение вместо значения из базы данных.
Если вы хотите установить WordPress в отдельную директорию, но чтобы главная страница сайта отображалась в корне домена, вам нужно переместить основной файл index.php в корень домена и отредактировать в нём require, чтобы он указывал на файл внутри вашей директории.
Этот процесс описан здесь: Размещение WordPress в отдельной директории.
Я всегда использую home_url(), так как работаю в режиме сети WordPress. Лишь однажды я разместил WordPress в отдельной директории, но мне это не понравилось. Однако на некоторых сайтах я действительно использую wp_content_dir.
xLRDxREVENGEx
У меня нет опыта работы с мультисайтом, поэтому я не знаком с тем, как это работает в такой конфигурации. Я предпочитаю устанавливать WP в отдельную директорию, чтобы поддерживать порядок и не загромождать корневую папку.
Milo
Моя файловая структура, пожалуй, одна из самых аккуратных. home/usr/public_html/site1 home/usr/public_html/site2 и так далее, а wp_content_dir обычно находится на CDN.
xLRDxREVENGEx
если бы там была только установка WordPress, это было бы нормально, но я в основном работаю на чужих серверах, где разбросаны сотни файлов и каталогов.
Milo
Функции site_url() и home_url() похожи и могут вызвать путаницу в их работе.
Функция site_url() получает значение параметра siteurl из таблицы wp_options в вашей базе данных.
Это URL-адрес, указывающий на основные файлы WordPress.
Если ваши основные файлы находятся в подкаталоге /wordpress на веб-сервере, значение будет http://example.com/wordpress.
Функция home_url() получает значение параметра home из таблицы wp_options в вашей базе данных.
Это адрес, по которому пользователи должны заходить для просмотра вашего сайта на WordPress.
Если основные файлы WordPress находятся в /wordpress, но вы хотите, чтобы URL вашего сайта был http://example.com, значение home должно быть http://example.com.
Отвечая на ваш второй вопрос:
В: Если это верно, то могу ли я заставить WordPress возвращать http://example.com/ ?
Вы не можете, если не выполните шаги из размещения WordPress в отдельной директории. Используя этот метод, вы помещаете основные файлы WordPress в /blog или /WordPress, а затем файл index.php в корневую директорию.
Если вы решите разместить WordPress в отдельной директории, то вам нужно использовать home_url() для перехода к index.php и site_url() для получения доступа к основным файлам и подобным ресурсам.
Ссылки:
Кодекс для site_url
Кодекс для home_url
Кодекс для размещения WordPress в отдельной директории
На ваш первый вопрос уже дан ответ, но я считаю, что самый простой способ получить корневой домен — это использовать функцию bloginfo('url');. Кроме того, у bloginfo() есть и другие параметры, которые можно использовать — ознакомьтесь с документацией.
Также существует функция get_bloginfo(), которую можно использовать, если вам нужно обернуть результат в переменную.
Самый простой способ получить URL сайта без подкаталогов (например, http://example.com/ вместо http://example.com/blog) — просто использовать слеш /.
Например, если вы напишете:
<a href="/">URL домена</a>
Это создаст ссылку, ведущую на ваш домен.
Спасибо за участие. К сожалению, это не отвечает на вопрос, заданный автором. Есть много причин, почему человеку может понадобиться использовать функции WordPress, о которых спрашивает автор. Маловероятно, что автор просто хочет добавить ссылку на главную страницу через HTML, например, редактируя запись. Скорее всего, автор редактирует файл темы PHP или файл плагина. В любом случае, он работает с PHP, а не с HTML. Наконец, хотя автор ожидал получить значение без / для этого сайта, на другом сайте автор может ожидать возврата подкаталога. Это зависит от конфигурации WP для каждого конкретного сайта.
SherylHohman