134

我一直发现在 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 定义。

4

9 回答 9

85

我认为这是只有核心开发人员才能/应该回答的问题。我研究并找到了核心票证 #17048:传递到浏览器的 URL 应该是 root-relative。我们可以在哪里找到首席核心开发人员 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,但并非总是如此。一些东西会在这个过程中打破。


插件相对 URLs(链接在edse的 Answerwp_make_link_relative中),在 action hook中的一系列过滤器中template_redirect应用该函数。这是一个非常简单的代码,似乎是一个不错的选择。

于 2013-08-29T16:54:49.487 回答
20
<?php wp_make_link_relative( $link ) ?>

Convert full URL paths to relative paths.

Removes the http or https protocols and the domain. Keeps the path '/' at the beginning, so it isn't a true relative link, but from the web root base.

Reference: Wordpress Codex

于 2014-11-26T04:53:54.957 回答
7

我在我的网站上解决了这个问题,在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、脚本等),一切正常。

于 2017-12-06T11:59:24.147 回答
6

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

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

根相对 URL
将所有 URL 转换为根相对 URL,以便在多个 IP 上托管同一站点,更轻松地进行生产迁移和更好的移动设备测试。

于 2013-06-26T05:32:47.717 回答
1

我一直只是用get_site_url(). 例如:

<img src="<?=get_site_url(); ?>/wp-content/uploads/2021/05/right-arrow-white@2x.png" />
于 2021-06-16T10:58:49.880 回答
0

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

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

于 2020-06-30T14:54:59.097 回答
-3

应该使用get_home_url(),那么你的链接是绝对的,但是如果你改变站点的url它不会影响

于 2014-01-23T15:16:29.887 回答
-4

有一个简单的方法

而不是/pagename/使用index.php/pagename/或者如果您不使用永久链接,请执行以下操作:

邮政

index.php?p=123

index.php?page_id=42

类别

index.php?cat=7

更多信息在这里:http ://codex.wordpress.org/Linking_Posts_Pages_and_Categories

于 2015-02-02T12:04:35.177 回答
-4

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

这是最快的方法..

于 2013-08-26T07:16:16.890 回答