WordPress中的相对URL


115

我一直在WordPress中感到沮丧,因为图像,文件,链接等以绝对URL而非相对URL插入WordPress。相对URL更方便用于切换域名,在http和https等之间进行更改。今天,我发现,如果使用相对URL定义WP_CONTENT_URL,则在将文件插入帖子时,它们将相对URL用作src而不是绝对URL。 。正是我一直想要的!但是WordPress官方文档说,如果要定义WP_CONTENT_URL ,则应使用完整的URI

WordPress Codex说

将WP_CONTENT_URL设置为该目录的完整URI(不带斜杠),例如

define( 'WP_CONTENT_URL', 'http://example/blog/wp-content');

当我使用相对URL时,一切似乎都正常运行,例如

define( 'WP_CONTENT_URL', '/my-content-folder');

但是使用相对URI是否存在一些问题?我只是认为WordPress必须有一个理由说明应使用完整的URI进行定义。


3
我猜答案是在WP代码和您使用的插件代码中审核它的所有使用,以确保没有一个人假设它不是完整的URL,但我想不到任何原因从我的头顶上跳下来不是很好。
Rup


5
@Krishna:如果只可以在wp-config中输入相对URL,为什么还要一个插件?问题的关键是找出在wp-config中使用相对URL是否会引起问题。
AidanCurran

36
我必须触摸wordpress时会哭。
托尼·克罗宁

6
@TonyCronin很高兴这不是Drupal。
motorbaby

Answers:


74

我认为这是只有核心开发人员才能/应该回答的问题。我进行了研究,发现核心票据#17048:传递给浏览器的URL应该是root相对的。我们在哪里可以找到主要核心开发人员Andrew Nacin解释的原因。他还链接到此[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,并非总是如此。一路上会破裂。


插件相对网址(在edse的Answer中链接)在动作挂钩wp_make_link_relative中的一系列过滤器中template_redirect应用了该功能。这是一个非常简单的代码,似乎是一个不错的选择。


14
好信息。我总是使用相对于根的路径,这样我可以毫无问题地部署到dev.mysite.com-> qa.mysite.com-> www.mysite.com甚至www.anothersite.com。不幸的是,WP并非在设计时就考虑到了这一点。由于设置WP_CONTENT_URL似乎并非旨在(即使允许)设置相对URL,因此该插件似乎是最佳选择。有没有一个测试用例,其中设置时插件会中断WP_CONTENT_URL但使用插件时可以正常工作?
贾斯汀

2
相对路径从不以开头,/ 相对URI(供内部使用<a>)从不以开头http://
TulainsCórdova'16

13
Wordpress从来都不适合用于适当的网站,它始终是由黑客编写的快速黑客,这些黑客(显然是从此处的引文中)没有想到也没有在框外寻找。移动网站的唯一方法是正确使用相对和/或根相对URL。绝对URL绝对可以阻止它。
哈卡

8
我创建了可以设置为位于子域,根目录或子文件夹中的网站。它不是很难。我觉得基本上有理由在说:“我们是很久以前建立的,而这种变化可能会破裂很多,所以我们不会修复。”
Donny V.

3
仍然认为没有开发者理由是正确的。硬编码的url与相对的url有相同的问题,这只是原始开发人员在其“不良习惯”工具包中的另一种非常不好的做法...在wordpress中有很多这样的原因,这就是为什么它被多次分叉删除这些问题。
Dawesi

15
<?php wp_make_link_relative( $link ) ?>

将完整的URL路径转换为相对路径。

删除http或https协议和域。将路径“ /”保留在开头,因此它不是真正的相对链接,而是从Web根目录开始。

参考:Wordpress Codex


而您在哪里删除该php代码段?
爱德华

6

我同意Rup。我想主要原因是要避免相对路径上的混淆。我认为wordpress可以从头开始使用相对路径,但是使用多个插件,主题配置方式等可能会出现问题。

在测试服务器上工作时,我曾经将此插件用于相对路径:

根目录相对URL将所有URL
转换为根目录相对URL,以将同一站点托管在多个IP上,从而简化了产品迁移并改善了移动设备测试。


5
如果只需要在wp-config文件中配置一个常量,为什么甚至需要一个插件?除非它提供了一种避免产生WP_CONTENT_URL相对关系的特殊陷阱的解决方案,并且不能以自己的方法屈服于任何陷阱。我想知道的是,在建立WP_CONTENT_URL亲戚关系中是否确实存在一个陷阱。
AidanCurran 2013年

1
以正斜杠开头的URL /wp-content/some-file.jpg绝对路径,而不是相对路径。没有可能的混乱。绝对URL中包含协议和域名,使得WordPress在没有理由的情况下毫无用处。要将WP网站从开发人员部署到暂存阶段,我必须在数据库转储中的域名上运行查找和替换脚本。我认为麻烦在于,它是为编辑生产内容而设计的,该内容适用于博客(这是针对博客的),但不适用于许多商业网站。
阿德(Ade)'18年

1
dude.com/bob/jane与/ bob / jane有何混淆?#serious #badpractice
Dawesi

1
@Ade,请在相对路径上做作业。您是/wp-content/some-file.jpg绝对路径是不正确的。对于以后会阅读您评论的其他人,请注意,Web相对路径是指从该路径中排除了协议和域的路径。因此,/wp-content/some-file.jpgwp-content/some-file.jpg都是相对的,与领先的/在第一实施例保持引用帐户持有人或服务器的访问根目录的目的。
Pegues

1
@Pegues好吧,我发现许多来源(某些在SO上)都使用术语“绝对路径”而不是“绝对URL”。也称为“相对根”路径。尽管语义和术语当然很重要,但仍然指出它们在根本上是彼此不同的。相对于根具有绝对URL的所有一致性好处。除非有其他我不知道的理由。
阿德(Ade)

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,脚本等),并且一切正常。


0

在设置=>媒体下,有一个“文件的完整URL路径”选项。如果将其设置为默认媒体目录路径“ / wp-content / uploads”而不是空白,它将插入相对路径,例如“ /wp-content/uploads/2020/06/document.pdf”。

我不确定它是否使所有链接相对于例如帖子,但至少它处理媒体,这可能是大多数人担心的问题。


默认情况下,此选项“文件的完整URL路径”不会出现在“媒体设置”中。wp-config中是否有一些设置可以激活它?
AidanCurran

@AidanCurran我很确定它已经存在了很长时间,但是经过一些研究,似乎毕竟有一些wp-config启用了此功能,因为默认情况下已将其从WP 3.5+中删除。可以使用旧的插件(如wordpress.org/plugins/upload-url-path-enabler )将其恢复。因此,即使我几乎没有安装任何插件,我想我的一个插件也将其添加了回来。仅将Elementor和主题Futurio与插件Futurio Extra一起使用。我尝试禁用它们,但未作任何更改,所以不确定:/
拥抱

@AidanCurran您可以添加以下内容:update_option('upload_url_path','/ wp-content / uploads'); 在主题的functions.php文件中,或者通过一些代码片段插件,它应该具有相同的效果。
拥抱

-3

应该使用get_home_url(),则您的链接是绝对的,但不影响您是否更改网站网址


-4

我认为您要做的是在更改域名时,您拥有的sql转储文件可以将新旧域名替换为所有旧域名。这是唯一可用的选项,因为没有插件可以帮助您完成此操作。

这是最快的方法..


1
请记住,您还将希望在序列化的PHP字符串中替换域名。这个方便的搜索和替换工具似乎是标准的处理方式(此处为 GitHub存储库)。我像capistrano-wp一样使用的Capistrano部署解决方案使用了该方法,并且效果很好。官方“ 移动WordPress Codex”页面上也引用了它。
马特·吉布森

3
这种方法是混乱且容易出错的。如果我们可以通过在wp-config中使用相对URL来避免这种情况,那不是更好吗?问题的关键是找出在wp-config中使用相对URL是否会引起问题。
AidanCurran

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.