【问题标题】:Relative URLs in WordPressWordPress 中的相对 URL
【发布时间】:2013-06-15 18:18:57
【问题描述】:

我一直发现在 WordPress 中使用绝对 URL 而不是相对 URL 将图像、文件、链接等插入 WordPress 是令人沮丧的。相对 url 更方便切换域名,在 http 和 https 之间切换等。今天我发现如果你用相对 url 定义 WP_CONTENT_URL 那么当你将文件插入帖子时,他们使用相对 url 作为 src 而不是绝对 url .正是我一直想要的!但是官方的 WordPress 文档说如果你定义 WP_CONTENT_URL,你应该使用 完整的 URI

WordPress codex says:

将 WP_CONTENT_URL 设置为该目录的完整 URI(无尾随 斜线),例如

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

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

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

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

【问题讨论】:

  • 我想答案是审核它在 WP 代码和您正在使用的插件代码中的所有使用情况,以确保它们都不会假定它不是完整的 URL,但是我想不出有什么理由让我无法接受。
  • 试试这个插件wordpress.org/plugins/relative-url 或阅读这可能对你有帮助deluxeblogtips.com/2012/06/relative-urls.html
  • @Krishna:如果我们可以在 wp-config 中输入相对 URL,为什么还需要插件?问题的重点是找出在 wp-config 中使用相对 URL 是否会导致问题。
  • 当我不得不触摸 wordpress 时我哭了。
  • @TonyCronin 很高兴它不是 Drupal。

标签: wordpress


【解决方案1】:

我一直只使用get_site_url()。例如:

<img src="<?=get_site_url(); ?>/wp-content/uploads/2021/05/right-arrow-white@2x.png" />

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 默认情况下,“文件的完整 URL 路径”选项不会出现在媒体设置中。 wp-config 中是否有一些设置可以激活它?
    • @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文件中或通过一些代码sn-p插件,它应该具有相同的效果。
    【解决方案3】:

    我认为这是只有核心开发人员才能/应该回答的问题。我研究并找到了核心票#17048:URLs delivered to the browser should be root-relative。我们可以在哪里找到首席核心开发人员 Andrew Nacin 解释的原因。他还链接到this [wp-hackers] thread。在这两个链接上,这些是关于为什么 WP 不使用相对 URL 的关键引号:

    核心票:

    • 相对于根的 URL 并不正确。 /path/ 可能不是 WordPress,它可能在安装之外。所以实际上它与绝对 URL 并没有太大区别。

    • 任何相对 URL 也会使安装移动时执行转换变得更加困难。在大多数情况下,查找替换将是必要的,具有讽刺意味的是,由于这些原因,具有绝对 URL 更便于移植。

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

    [wp-hackers] 线程

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

    • 请记住,相对 URL 有两种类型,带和不带 前导斜线。两者都有警告,使这不可能正确 实施。

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


    而且,就个人而言,我不止一次发现主题和插件编码错误,在定义 WP_CONTENT_URL 时会简单地中断。
    他们不知道可以设置并假设这是真的:WP.URL/wp-content/WhatEver,但事实并非如此总是这样。并且在此过程中会出现一些问题。


    插件Relative URLs(链接到edse's Answer)在series of filters in the action hook template_redirect 中应用函数wp_make_link_relative。这是一个相当简单的代码,似乎是一个不错的选择。

    【讨论】:

    • 好消息。我总是使用根相对路径,以便可以毫无问题地部署到 dev.mysite.com -> qa.mysite.com -> www.mysite.com 甚至 www.anothersite.com。不幸的是,WP 在设计时没有考虑到这一点。由于设置 WP_CONTENT_URL 似乎并不打算(即使它允许)设置相对 url,所以该插件似乎是最好的选择。是否有测试用例设置WP_CONTENT_URL时插件中断但使用插件时工作正常?
    • Wordpress 从来都不是为合适的网站设计的,它总是一个快速的黑客攻击,由没有思考或跳出框框的黑客编写的(很明显从这里的引文来看)。您可以移动网站的唯一方法是它是否正确使用相对和/或根相对 URL。绝对 URL 绝对阻止它。
    • 我创建了可以设置为存在于子域、根或子文件夹中的站点。它不是很难。我觉得有原因基本上是在说“我们很久以前就建立了这个,这个变化会破坏很多,所以我们不会修复它。”
    • 仍然认为开发人员的理由都不成立。硬编码的 url 与相对的 url 有相同的问题,这只是原始开发人员在他们的“坏习惯”工具包中的另一种非常糟糕的做法......在 wordpress 中有很多这样的做法,这就是为什么它被多次分叉以删除这些问题。
    • "如果需要重新定位,就是在数据库中全局查找-替换。"。根据文档,这会破坏 GUID,从而破坏整个站点。另请注意,数据库中的某些 URL 具有反斜杠转义的斜杠。但是......如果绝对需要绝对 URL,为什么开发人员不使用像 {BASE_URL} 这样的占位符?当您切换到 (https!) 产品站点时,“{BASE_URL}/wp-content/”可能比 "http://dev.example.com/subdir/wp-content" 更方便一点。 “哦,我从不写 PI,我总是写 3.141592653589793238462643383279 - 在代码中更容易找到”。是的。
    【解决方案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、脚本等),一切正常。

    【讨论】:

      【解决方案5】:

      有一个简单的方法

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

      发帖

      index.php?p=123
      

      页面

      index.php?page_id=42
      

      类别

      index.php?cat=7
      

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

      【讨论】:

      • 这没有回答问题。
      【解决方案6】:
      <?php wp_make_link_relative( $link ) ?>
      

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

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

      参考:Wordpress Codex

      【讨论】:

      • 你把那个 php sn-p 放在哪里?
      • 真正的答案。谢谢!
      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

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

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

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

        【讨论】:

        • 如果只需要在 wp-config 文件中配置一个常量,为什么还需要一个插件呢?除非它提供了一种解决方案来避免使WP_CONTENT_URL 成为相对的特定陷阱,并且不会屈服于它自己的方法的任何陷阱。我想知道的是,将WP_CONTENT_URL 设为相对是否确实存在已知的陷阱。
        • 以正斜杠 /wp-content/some-file.jpg 开头的 URL 是绝对路径而不是相对路径。没有可能的混乱。正是在 绝对 URL 中包含协议和域名,这使得 WordPress 毫无根据地毫无用处。要将 WP 站点从 dev 部署到 staging 到 live,我必须在数据库转储中的域名上运行查找和替换脚本。我认为问题在于它是为编辑生产中的内容而设计的,它适用于博客(这是它的用途),但不适用于许多商业网站。
        • dude.com/bob/jane 与 /bob/jane 有什么混淆? #严重 #badpractice
        • @Ade,请在相对路径上做功课。您认为 /wp-content/some-file.jpg 是一条绝对路径是不正确的。对于将来阅读您的评论的其他人,请注意,网络相对路径是从路径中排除协议和域的路径。因此,/wp-content/some-file.jpgwp-content/some-file.jpg 都是相对的,第一个示例中的前导/ 用于引用帐户持有者或服务器的可访问根目录。
        • @Pegues 好的,我发现许多来源(有些在 SO)使用术语“绝对路径”而不是“绝对 url”。它也被称为“根相对”路径。虽然语义和术语当然很重要,但要点仍然是它们彼此根本不同。相对于根具有绝对 url 的所有一致性优势。除非有我不知道的其他原因。
        【解决方案9】:

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

        这是最快的方法..

        【讨论】:

        • 请记住,您还需要替换序列化 PHP 字符串中的域名。 This handy search and replace tool 似乎是标准的做事方式(GitHub 存储库 here)。这由我使用的 Capistrano 部署解决方案使用,例如capistrano-wp,并且似乎工作得很好。官方Moving WordPress Codex page上也有引用。
        • 这种方法很混乱而且容易出错。如果我们可以通过在 wp-config 中使用相对 URL 来避免它,那不是更好吗?问题的重点是找出在 wp-config 中使用相对 URL 是否会导致问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-29
        • 1970-01-01
        • 2017-09-21
        • 2017-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多