问题描述

我一直在 Wordpress 中发现图像,文件,链接等都插入到 WordPress 中,绝对 URL 而不是相对 URL 。相对 URL 更方便切换域名,在 http 和 https 之间进行更改。今天我发现如果您使用相对 URL 定义 WP_CONTENT_URL,那么当您将文件插入到帖子中时,它们使用 src 的相对 url 而不是绝对 URL 。只是我一直想要的!但官方 Wordpress 文档说您应该使用完整的 URI,如果您正在定义 WP_CONTENT_URL 。

WordPress codex says

Set WP_CONTENT_URL to the full URI of this directory (no trailing slash), e.g.

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

当我使用相对网址 (例如,

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

但是使用相对 URI 有什么问题吗?我只是认为 Wordpress 的原因一定是说明它应该用一个完整的 URI 来定义。

最佳解决方案

我认为这只是一个核心开发者可以/应该回答的问题。我研究发现核心票#17048:URLs delivered to the browser should be root-relative 。在哪里可以找到主要核心开发商 Andrew Nacin 解释的原因。他还链接到 this [wp-hackers] thread 。在这两个链接上,这些是为什么 WP 不使用相对 URL 的关键报价:

核心票:

  • Root-relative URLs aren’t really proper. /path/ might not be WordPress, it might be outside of the install. So really it’s not much different than an absolute URL.

  • Any relative URLs also make it significantly more difficult to perform transformations when the install is moved. The find-replace is going to be necessary in most situations, and having an absolute URL is ironically more portable for those reasons.

  • absolute URLs are needed in numerous other places. Needing to add these in conditionally will add to processing, as well as introduce potential bugs (and incompatibilities with plugins).

[wp-hackers] 线程

  • Relative to what, I’m not sure, as WordPress is often in a subdirectory, which means we’ll always need to process the content to then add in the rest of the path. This introduces overhead.

  • Keep in mind that there are two types of relative URLs, with and without the leading slash. Both have caveats that make this impossible to properly implement.

  • WordPress should (and does) store absolute URLs. This requires no pre-processing of content, no overhead, no ambiguity. If you need to relocate, it is a global find-replace in the database.


而且,在个人笔记中,我发现主题和插件不好的代码,当
WP_CONTENT_URL
被定义时就会中断。他们不知道这可以设置,并假设这是真的:WP.URL /wp-content /WhatEver,并不总是这样。有些事情会一路冲破。


插件 Relative URLs(在 edse 的答案中链接),将 wp_make_link_relative 功能应用于动作钩 template_redirect 中的一系列过滤器。这是一个很简单的代码,似乎是一个不错的选择。

次佳解决方案

<?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

第三种解决方案

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

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

Root Relative URLs
Converts all URLs to root-relative URLs for hosting the same site on multiple IPs, easier production migration and better mobile device testing.

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。