home_url()和site_url()有什么区别


65

我的理解是site_url()返回wordpress核心文件所在的位置。

因此,如果我的博客托管于,http://example.com/blogsite_url()返回http://example.com/blog

但是那home_url()又有什么不同呢?对我来说,home_url()返回相同的内容:http://example.com/blog

如果正确,那么我可以让wordpress返回http://example.com/吗?


4
您在一个非常重要的问题上一次要问两个问题。答案为“ home_url()和site_url()有什么区别?” 与“我如何让WordPress返回没有安装子目录的URL根目录?”这个问题不同。
Volomike

Answers:


51

您一次要问两个问题:

  1. home_url()和之间有什么区别site_url()
  2. 如何让WordPress返回没有安装子目录的URL根目录?

这是答案,我已与WordPress的核心开发人员Andrew Nacin确认,并进行了一些服务器测试以确认Andrew告诉我的内容。

问题#1

在wp-admin的“常规”>“设置”中,home_url()引用标有“站点地址(URL)”的字段。令人困惑,是吗?是的,它说的是“站点地址”,所以您可以假设site_url(),但是您会错的。运行您自己的测试,您会看到。(您可以在主题的functions.php顶部echo H1使用site_url()home_url()值临时放置一个字段。)

同时,site_url()在“常规”>“设置”中引用标有“ WordPress地址(URL)”的字段。

因此,如果您想参考物理路径的位置,例如在URL上调用插件的文件夹路径以加载图像,或调用主题的文件夹路径以加载图像,则实际上应该使用其他功能-看看plugins_url()get_template_directory_uri()

site_url()会一直在那里你可以通过套结对到达现场的位置/wp-admin上结束,而home_url()不会可靠地这个位置。

home_url()会是,你必须通过设置常规>设置“网站地址(URL)”字段设置您的主页。

问题2

因此,如果我将博客放在中http://example.com/blog,并且example.com只是一个我喜欢投资组合主题的静态站点,那么这将是一个符合您问题的方案。在这种情况下,我将使用以下代码段:

<?php
function getDomain() {
    $sURL    = site_url(); // WordPress function
    $asParts = parse_url( $sURL ); // PHP function

    if ( ! $asParts )
      wp_die( 'ERROR: Path corrupt for parsing.' ); // replace this with a better error result

    $sScheme = $asParts['scheme'];
    $nPort   = $asParts['port'];
    $sHost   = $asParts['host'];
    $nPort   = 80 == $nPort ? '' : $nPort;
    $nPort   = 'https' == $sScheme AND 443 == $nPort ? '' : $nPort;
    $sPort   = ! empty( $sPort ) ? ":$nPort" : '';
    $sReturn = $sScheme . '://' . $sHost . $sPort;

    return $sReturn;
}

您是否有与A.Nacin进行讨论的链接?
kaiser 2012年

1
是通过电子邮件。抱歉。哦,感谢您的编辑-我会记得下一次语法更改。
Volomike

8
我花了很长时间并且很痛苦地意识到'Site Address(URL)'='home'和'WordPress Address(URL)'='siteurl'。他们绝对应该更改这些标签。
Jbm

您对第二个问题的回答中奖了!
Devner

7

如果要将WP安装在目录中,但将站点安装在域根目录下,则需要将index.php主文件移到域根目录下,并编辑require语句以指向目录。

此处概述了此过程:为WordPress提供自己的目录


我一直只是使用,home_url()因为我处于wp网络模式。我只给过WordPress一个自己的目录,但这并不是我的喜好。但是我确实wp_content_dir在某些网站上使用了。
xLRDxREVENGEx 2011年

我没有使用多站点的经验,所以我不熟悉这种情况下的工作原理。我更喜欢将WP安装在目录中,只是为了保持环境整洁而不会使根目录混乱。
米洛

我的文件结构可能是最整洁的文件结构之一。home/usr/public_html/site1 home/usr/public_html/site2等等,然后wp_content_dir通常是在CDN上
xLRDxREVENGEx 2011年

如果仅安装WP会很好,但是我主要是在其他人的服务器上工作,其中有成百上千个文件和目录。
米洛

我的理解正确吗,除非site_url()和home_url()相同,除非将其wordpress安装目录设置为与根目录不同?
Praveen

3

TLDR:

在非标准安装中,您可以将WordPress文件放在网站根目录的子目录中。
...并且仍然允许访问者访问者从您站点的域(根)URL访问WordPress“网站”,而无需附加子目录名称:(
即:www.example.comvs www.example.com/wordpress):

WP function  | wp_options. | WP constant  | what it represents       | WP Settings Label | Example     
-------------------------------------------------------------------------------------------------------------------------------------
`site_url()` | `siteurl`   | `WP_SITEURL` | WordPress files location | WordPress Address | https://www.example.com/wordpress
`home_url()` | `home`      | `WP_HOME`    | browser address bar      | Site Address      | https://www.example.com 

WP常量的值优先于wp_options / WP设置值。

WordPress的不同配置

在最标准的WordPress安装,home_url并且site_url将具有相同的价值。
无论如何,它们代表两种不同的事物。

非标准安装中,它们可能具有不同的值。

注意:为了便于阅读,我在回答中保留了协议。
在这篇文章中,PREPEND每个URL有: https://http:////
(除非我把它的话)。

//relative协议,适用于/ http://https://

标准安装(包括“一键式”安装)

home_url:是您(wordpress)网站的主页,如用户地址栏中所示。
site_url:是您的wordpress文件所在的目录。

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的控制,定义或样式设置。
只是您的博客而已。您博客中的所有网址都将以www.example.com/blog

注意:在文档中,“ Wordpress网站/网站”(而不是简单的“网站/网站”)是指WordPress文件的安装目录。在这种情况下,它是www.example.com/blog- blog文件夹中的所有内容。在这种情况下,“ WordPress网站”与您的域,您的根目录或主网站不同。它是您整体网站的子集。有点像网站内部的网站。我提到这一点是因为考虑到这种特殊设置,术语似乎不清楚或令人困惑。

备用WordPress安装配置

为WordPress提供自己的目录,一节Method II (With URL change)

例如,许多人不想用所有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提供自己的目录”,标题Method II (With URL change)为如何执行此操作。

这种情况下home_urlsite_url应保持不同的值。

在此设置中,你希望你的网站的功能完全相同,如同 WordPress的文件安装在服务器的根目录为您的网站...
但是,对于在服务器上组织的目的,
实际上有一个文件夹,名为在你的WordPress的文件wordpress在服务器的您网站的根目录。

因此,用户将输入www.example.com以获取您的WordPress主页,而不是www.example.com/wordpress

wordpress函数<->数据库变量<-> Wordpress常量

本节假定上面的示例3配置。
地址栏网址:www.example.com
wordpress文件:/ wordpress目录

(其他情况很简单:所有变量/函数都保持/返回相同的值。)

如何为site_url和设置值home_url

首先,请注意siteurlhome存储上述函数返回的值

1)通常,您可以在WordPress后端/仪表板/管理面板上设置以下值:
Settings -> General ->
siteurl WordPress地址: https://www.example.com/wordpress
home 站点地址: https://www.example.com

(此处不包括斜杠,否则将在其他位置进行配置)

2)或者,您可以在WordPress数据库中设置以下值:
wp_optionstable->

`options_name` | `options_value`
----------------------------------------------------
`siteurl`      | `https://www.example.com/wordpress`  
`home`         | `https://www.example.com`  

(此处不包括斜杠,否则将在其他位置进行配置)

3)编辑wp-config.php
定义这些特定常量来保存你的价值
定义WP_HOME,并WP_SITEURL通过插入对你的顶部这些行设置wp-config.php文件:

define('WP_SITEURL','http://example.com/wordpress');  // wordpress core files
define('WP_HOME','http://example.com');               // address bar url

// ** MySQL settings - You can get this info from your web host ** //
...    

(此处不包括斜杠,否则将在其他位置进行配置)

参考:WP_SITEURLWP_HOME

注意:这很令人困惑
(我真的希望WordPress已将设置标记为类似于其php名称,
例如和Wordpress Site AddressHome Page Address或更明确的像location of WordPress Site core filesbrowser url to access WordPress home page)。

`WP_SITEURL` <--> `site_url()` <--> `siteurl` <--> Wordpress Address <--> /wordpress   
`WP_HOME`    <--> `home_url()` <--> `home`    <--> Site Address      <--> /

现在,这里变得棘手!

如果您在wp-config.php文件中定义了这些常量,则在数据库/设置页面中具有什么值都没有关系
实际上,您将无法通过后端修改此值(该值将显示为灰色)。您仍然可以通过编辑数据库来进行修改,但是这样做不会对您的站点产生影响,而常量存在于wp-config文件中。

您的配置文件不会更改数据库中的值(或因此更改您的设置页面)。相反,您的数据库/设置页面值将被忽略。wp-config中的值将覆盖或优先于数据库设置。

所以...总结(TLDR):

WP function  | wp_options. | WP constant  | what it represents       | WP Settings Label | Example     
-------------------------------------------------------------------------------------------------------------------------------------
`site_url()` | `siteurl`   | `WP_SITEURL` | WordPress files location | WordPress Address | https://www.example.com/wordpress
`home_url()` | `home`      | `WP_HOME`    | browser address bar      | Site Address      | https://www.example.com 

WP常量的值优先于wp_options / WP设置值。

wp_options记录值和WP设置值相同。
编辑一个,根据定义编辑另一个。
访问同一变量只是两种不同的方式。

另一方面,WordPress常量是唯一且独立的。
在内部,WordPress(PHP)常量将覆盖它们的db对应对象。
如果在wp-config中定义了一个常量,则它不会更改数据库。
但是在内部,WordPress将始终喜欢/使用其值而不是数据库值。


3

site_url()home_url()功能是相似的,并可能导致混乱,他们是如何工作的。

site_url()功能用于检索值值siteurlwp_options数据库中的表。

这是WordPress核心文件的URL。
如果核心文件存在于/wordpressWeb服务器的子目录中,则值为http://example.com/wordpress

home_url()功能用于检索值homewp_options数据库中的表。

这是您希望人们访问以查看您的WordPress网站的地址。

如果您的WordPress核心文件存在于其中/wordpress,但您希望网站URL为http://example.comhome值http://example.com


2

要回答第二个问题:

问:如果正确,那么我可以让wordpress返回http://example.com/吗?

除非您按照给WordPress自己的目录步骤进行操作,否则您不能这样做。使用此方法意味着您将WordPress核心文件放入/blog/WordPress,然后index.php放入根。

如果你决定把WordPress的自己的目录里,那么你会用home_url()的去index.php,并site_url()为获得核心文件和等。

参考:
Codex for site_url
Codex for home_url
Codex,用于提供Wordpress自己的目录


-1

不带任何子目录(http://example.com/而不是http://example.com/blog)的最简单的获取网站url的方法,只需使用反斜杠/

例如,如果您键入:

<a href="/">domain url</a>

它将创建一个链接到您的域


感谢您的参与。不幸的是,这不能回答OP提出的问题。人们需要使用OP询问的wordpress功能的原因有很多。OP不太可能只想通过html(例如通过编辑帖子)将链接添加到其主页。OP更有可能编辑php主题文件或插件文件。无论如何,他们使用的是php,而不是html。最后,虽然OP 预期值不/这个网站,在不同的网站,OP可以预期要返回一个子目录。这取决于每个站点的WP配置。
SherylHohman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.