WordPress 中的相对 URL

我总是发现在 WordPress 中插入图片、文件、链接等是用绝对 URL 而不是相对 URL。一个相对的 url 更方便地切换域名,在 http 和 https 之间切换等等。今天我发现,如果您使用相对 URL 定义 WP _ CONTENT _ URL,那么当您向文章中插入文件时,它们使用 src 的相对 URL 而不是绝对 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 来定义一定是有原因的。

151307 次浏览

我同意拉普。我想主要原因是为了避免在相对路径上产生混淆。我认为 wordpress 可以从头开始使用相关路径,但是当使用多个插件时,问题可能会出现,比如主题是如何配置的等等。

我曾经在测试服务器时使用过这个插件的相对路径:

根相对 URL
将所有 URL 转换为根相关 URL,以便在多个 IP 上承载相同的站点,从而更容易进行生产迁移和更好的移动设备测试。

我认为你所做的是,当你改变域名,你有 sql 转储文件,你可以替换所有的旧域名实例与新的。这是唯一的选择,因为没有插件可以帮助你做到这一点。

这是最快的方法. 。

我认为这种问题只有核心开发人员才能够/应该回答。我研究了一下,找到了核心票 # 17048: 传递到浏览器的 URL 应该是根相对的。在那里我们可以找到的原因解释了安德鲁纳辛,首席核心开发人员。他还链接到 这个[ wp-hacker ]帖子。在这两个链接上,这些是 WP 为什么不使用相对 URL 的关键引用:

核心票:

  • 根相对 URL 实际上并不合适。/path/可能不是 WordPress,它可能在安装之外。所以它和绝对 URL 没什么不同。

  • 当安装被移动时,任何相对 URL 都会使执行转换变得非常困难。在大多数情况下,find-place 都是必需的,出于这些原因,具有绝对 URL 具有更强的可移植性。

  • 在许多其他地方都需要绝对 URL。需要有条件地添加这些内容将增加处理,并引入潜在的 bug (以及与插件的不兼容性)。

线索

  • 相对于什么,我不确定,因为 WordPress 通常在一个子目录中,这意味着我们将 总是需要处理内容,然后添加到路径的其余部分 引入开销

  • 请记住,有两种类型的相对 URL,包括 两者都有注意事项,使得这不可能正确地 实施

  • WordPress 应该(也确实)存储绝对 URL 不需要对内容进行预处理,没有开销,没有歧义 需要重新定位时,它是数据库中的一个全局查找替换


而且,就我个人而言,我不止一次发现主题和插件编码错误,在定义 WP_CONTENT_URL时就会中断。
他们可以设置 不知道,并假设这是真的: URL/wp-content/WhatEver,并且情况并非总是如此。有些东西会在路上被打破。


插件 相对网址(在 < em > edse 的回答中链接)在 动作钩 template_redirect中的一系列过滤器中应用函数 强 > wp_make_link_relative。这是一个相当简单的代码,似乎是一个不错的选择。

<?php wp_make_link_relative( $link ) ?>

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

删除 http 或 https 协议和域。保持路径’/’在开头,所以它不是一个真正的相对链接,而是从 web 根目录开始。

参考资料: Wordpress Codex

我在自己的站点中解决了这个问题,并将其放在 function. 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、脚本等) ,一切正常。

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

我不确定是否所有的链接都是相对的,比如文章,但至少它处理媒体,这可能是大多数人所担心的。