В чем разница между 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;
}

Это было по электронной почте. Извините. Ах да, спасибо за правку — в следующий раз я запомню этот синтаксис.

Мне потребовалось много времени и мучений, чтобы осознать, что 'Адрес сайта (URL)' = 'home', а 'Адрес WordPress (URL)' = 'siteurl'. Эти названия определенно стоит изменить.

Кажется, здесь опечатка в строке $sPort = ! empty( $sPort ) ? ":$nPort" : '';
. Думаю, ! empty( $sPort )
должно быть ! empty( $nPort )
. Иначе ":$nPort"
никогда не будет достигнуто, следовательно $sPort = ''
и порт никогда не добавится в предпоследней строке.

##Кратко:
При нестандартной установке вы можете разместить файлы 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_value
siteurl
|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
.

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

Моя файловая структура, пожалуй, одна из самых аккуратных. home/usr/public_html/site1
home/usr/public_html/site2
и так далее, а wp_content_dir
обычно находится на CDN.

если бы там была только установка WordPress, это было бы нормально, но я в основном работаю на чужих серверах, где разбросаны сотни файлов и каталогов.

Функции 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 для каждого конкретного сайта.
