Wordpress中的相对URL

Aid*_*ran 95 wordpress

我总是发现在Wordpress中令人沮丧的是,图像,文件,链接等都是用绝对URL而不是相对URL插入到WordPress中的.相对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');
Run Code Online (Sandbox Code Playgroud)

当我使用相对URL时,似乎工作正常,例如

define( 'WP_CONTENT_URL', '/my-content-folder');
Run Code Online (Sandbox Code Playgroud)

但使用相对URI有问题吗?我只是认为Wordpress必须有一个理由说它应该用完整的URI定义.

bra*_*ilo 61

我认为这只是一个核心开发人员可以/应该回答的问题.我研究并找到了核心票#17048:传递给浏览器的URL应该是root-relative.我们可以在哪里找到主要核心开发人员Andrew Nacin解释的原因.他还链接到这个[wp-hackers]线程.在这两个链接上,这些是WP不使用相对URL的关键引号:

核心票:

  • 根相对URL并不合适./path/可能不是WordPress,它可能在安装之外.所以它真的与绝对URL没什么不同.

  • 移动安装时,任何相对URL也会使执行转换变得更加困难.在大多数情况下,find-replace是必要的,并且由于这些原因,具有绝对URL具有讽刺意义的更具可移植性.

  • 许多其他地方都需要绝对URL.需要有条件地添加这些将增加处理,以及引入潜在的错误(和插件不兼容).

[wp-hackers]主题

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

  • 请记住,有两种类型的相对URL,包含和不包含前导斜杠.两者都有警告,这使得无法正确实施.

  • WordPress应该(并且确实)存储绝对URL.这不需要预处理内容,不需要开销,也不需要模糊.如果需要重定位,则它是数据库中的全局查找替换.


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


插件相对URL(在edse的答案中链接),在action钩子wp_make_link_relative中的一系列过滤器中template_redirect应用该函数.这是一个非常简单的代码,似乎是一个不错的选择.

  • 好消息.我总是使用根相对路径,以便我可以部署到dev.mysite.com - > qa.mysite.com - > www.mysite.com甚至www.anothersite.com,没有任何问题.不幸的是,WP并没有考虑到这一点.由于设置`WP_CONTENT_URL`似乎并不打算(即使它允许)设置相对URL,插件似乎是最好的选择.是否存在设置`WP_CONTENT_URL时插件中断但在使用插件时工作正常的测试用例? (13认同)
  • Wordpress从来就不适用于正确的网站,它始终是一个快速的黑客,由黑客写的(显然来自这里的引言)没有想到或在盒子外面看.移动网站的唯一方法是,如果它正确使用相对和/或根相对URL.绝对URL绝对阻止它. (11认同)
  • 我创建了可以设置为存在于子域,根或子文件夹中的站点.它不是很难.我觉得有理由基本上说"我们很久以前就已经建了这个,这个改变会破坏很多,所以我们不会修复它." (7认同)
  • 仍然认为没有一个开发商的理由是有效的。硬编码的 url 与相对的 url 有相同的问题,这只是原始开发人员在他们的“坏习惯”工具包中的另一种非常糟糕的做法……wordpress 中有很多这样的问题,这就是为什么它被多次分叉以删除这些问题。 (6认同)
  • “如果需要重新定位,就是在数据库中进行全局查找-替换”。根据文档,这会破坏 GUID,从而破坏整个站点。另请注意,数据库中的某些 URL 具有反斜杠转义的斜杠。但是...如果绝对需要绝对 URL,为什么 schtonk 开发人员不使用像 {BASE_URL} 这样的占位符呢?当您切换到 (https!) prod 站点时,“{BASE_URL}/wp-content/”可能比“http://dev.example.com/subdir/wp-content”更方便一点。“哦,我从不写 PI,我总是写 3.141592653589793238462643383279 - 更容易在代码中找到”。是的。 (5认同)
  • 相对路径从不以`/`开头,相对URI(供在<a>中使用)从不以'http://'开头。 (2认同)

dav*_*rey 13

<?php wp_make_link_relative( $link ) ?>
Run Code Online (Sandbox Code Playgroud)

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

删除http或https协议和域.保持路径'/'在开头,因此它不是真正的相对链接,而是来自Web根目录.

参考:Wordpress Codex

  • 你把那个 php 片段放在哪里? (3认同)

dan*_*are 6

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

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

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

  • 如果只需要在wp-config文件中配置一个常量,为什么插件甚至是必要的呢?除非它提供了一个解决方案,以避免使'WP_CONTENT_URL`相对的特定陷阱,并且不会因为它自己的方法而陷入任何陷阱.我想知道的是,如果确实存在使'WP_CONTENT_URL`相对的已知缺陷. (5认同)
  • 以正斜杠 `/wp-content/some-file.jpg` 开头的 URL 是**绝对路径**而不是相对路径。没有任何可能的混淆。正是在 *absolute URL* 中包含了协议和域名,使得 WordPress 在没有理由的情况下毫无用处。要将 WP 站点从 dev 部署到 staging 到 live,我必须在数据库转储中的域名上运行查找和替换脚本。我认为的麻烦在于它是为编辑内容而设计的*生产*,适用于博客(这是它的目的),但不适用于许多商业网站。 (3认同)
  • @Ade,请在相对路径上做功课。您关于“/wp-content/some-file.jpg”是绝对路径的说法是错误的。对于将来阅读您评论的其他人,请注意 Web 相对路径是从路径中排除协议和域的路径。因此,“/wp-content/some-file.jpg”和“wp-content/some-file.jpg”都是相对的,第一个示例中的前导“/”具有引用可访问根目录的目的帐户持有人或服务器。 (2认同)

ike*_*tuz 6

我在我的网站上解决了这个问题,在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);

}
Run Code Online (Sandbox Code Playgroud)

我拿了一个插件的一部分,把它切成碎片并制作了这个。它替换了我网站中的所有链接(菜单、CSS、脚本等),并且一切正常。