В чем разница между home_url() и site_url()

17 июн. 2011 г., 21:07:10
Просмотры: 161K
Голосов: 93

Как я понимаю, 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/?

2
Комментарии

Вы задаёте два вопроса одновременно на очень важную тему. Ответ на вопрос "В чём разница между home_url() и site_url()?" отличается от вопроса "Как получить корневой URL WordPress без подкаталога, в котором он установлен?"

Volomike Volomike
30 апр. 2012 г. 02:33:53
Все ответы на вопрос 7
6
78

Вы задаете два вопроса одновременно:

  1. В чем разница между home_url() и site_url()?
  2. Как получить корневой 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;
}
30 апр. 2012 г. 03:54:56
Комментарии

У вас есть ссылка на обсуждение с A.Nacin?

kaiser kaiser
30 апр. 2012 г. 04:02:35

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

Volomike Volomike
30 апр. 2012 г. 05:07:21

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

Jbm Jbm
26 янв. 2014 г. 05:33:53

Ваш ответ на второй вопрос попал в точку!

Devner Devner
19 февр. 2018 г. 10:08:58

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

Ferris Ferris
26 мая 2023 г. 00:30:49

@Ferris, вы правы, я исправил. Спасибо.

Volomike Volomike
30 мая 2023 г. 06:41:55
Показать остальные 1 комментариев
0
35

##Кратко:
При нестандартной установке вы можете разместить файлы 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 хранят значения, возвращаемые функциями выше

  1. Обычно вы устанавливаете эти значения в админ-панели WordPress:
    Настройки -> Общие ->
    siteurl Адрес WordPress: https://www.example.com/wordpress
    home Адрес сайта: https://www.example.com

(не включайте завершающие слеши здесь - они настраиваются в другом месте)

  1. Альтернативно, вы можете установить эти значения в базе данных WordPress:
    таблица wp_options ->

    options_name | options_value

    siteurl | https://www.example.com/wordpress
    home | https://www.example.com

(не включайте завершающие слеши здесь - они настраиваются в другом месте)

  1. Отредактируйте ваш 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 всегда будет предпочитать/использовать её значение вместо значения из базы данных.

5 янв. 2019 г. 00:44:14
5

Если вы хотите установить WordPress в отдельную директорию, но чтобы главная страница сайта отображалась в корне домена, вам нужно переместить основной файл index.php в корень домена и отредактировать в нём require, чтобы он указывал на файл внутри вашей директории.

Этот процесс описан здесь: Размещение WordPress в отдельной директории.

17 июн. 2011 г. 21:12:30
Комментарии

Я всегда использую home_url(), так как работаю в режиме сети WordPress. Лишь однажды я разместил WordPress в отдельной директории, но мне это не понравилось. Однако на некоторых сайтах я действительно использую wp_content_dir.

xLRDxREVENGEx xLRDxREVENGEx
17 июн. 2011 г. 21:29:04

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

Milo Milo
17 июн. 2011 г. 21:34:07

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

xLRDxREVENGEx xLRDxREVENGEx
17 июн. 2011 г. 21:39:11

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

Milo Milo
17 июн. 2011 г. 21:46:01

Правильно ли я понимаю, что site_url() и home_url() одинаковы, за исключением случая, когда каталог установки WordPress отличается от корневого?

Praveen Praveen
20 июн. 2011 г. 22:00:52
0

Функции 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.

17 апр. 2013 г. 10:41:34
0

Отвечая на ваш второй вопрос:

В: Если это верно, то могу ли я заставить WordPress возвращать http://example.com/ ?

Вы не можете, если не выполните шаги из размещения WordPress в отдельной директории. Используя этот метод, вы помещаете основные файлы WordPress в /blog или /WordPress, а затем файл index.php в корневую директорию.

Если вы решите разместить WordPress в отдельной директории, то вам нужно использовать home_url() для перехода к index.php и site_url() для получения доступа к основным файлам и подобным ресурсам.

Ссылки:
Кодекс для site_url
Кодекс для home_url
Кодекс для размещения WordPress в отдельной директории

17 июн. 2011 г. 21:37:10
1

На ваш первый вопрос уже дан ответ, но я считаю, что самый простой способ получить корневой домен — это использовать функцию bloginfo('url');. Кроме того, у bloginfo() есть и другие параметры, которые можно использовать — ознакомьтесь с документацией.

Также существует функция get_bloginfo(), которую можно использовать, если вам нужно обернуть результат в переменную.

10 окт. 2023 г. 20:46:19
Комментарии

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

cjbj cjbj
14 окт. 2023 г. 12:45:50
1
-1

Самый простой способ получить URL сайта без подкаталогов (например, http://example.com/ вместо http://example.com/blog) — просто использовать слеш /.

Например, если вы напишете:

<a href="/">URL домена</a>

Это создаст ссылку, ведущую на ваш домен.

5 мая 2016 г. 12:12:41
Комментарии

Спасибо за участие. К сожалению, это не отвечает на вопрос, заданный автором. Есть много причин, почему человеку может понадобиться использовать функции WordPress, о которых спрашивает автор. Маловероятно, что автор просто хочет добавить ссылку на главную страницу через HTML, например, редактируя запись. Скорее всего, автор редактирует файл темы PHP или файл плагина. В любом случае, он работает с PHP, а не с HTML. Наконец, хотя автор ожидал получить значение без / для этого сайта, на другом сайте автор может ожидать возврата подкаталога. Это зависит от конфигурации WP для каждого конкретного сайта.

SherylHohman SherylHohman
5 янв. 2019 г. 04:12:55