Relative URLs in WordPress

I think this is the kind of question only a core developer could/should answer. I’ve researched and found the core ticket #17048: URLs delivered to the browser should be root-relative. Where we can find the reasons explained by Andrew Nacin, lead core developer. He also links to this [wp-hackers] thread. On both those links, these are the key quotes on why WP doesn’t use relative URLs:

Core ticket:

  • 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] thread

  • 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.


And, on a personal note, more than once I’ve found theme and plugins bad coded that simply break when WP_CONTENT_URL is defined.
They don’t know this can be set and assume that this is true: WP.URL/wp-content/WhatEver, and it’s not always the case. And something will break along the way.


The plugin Relative URLs (linked in edse‘s Answer), applies the function wp_make_link_relative in a series of filters in the action hook template_redirect. It’s quite a simple code and seems a nice option.

Leave a Comment