WordPress.org

Make WordPress Core

Opened 12 months ago

Closed 6 months ago

Last modified 3 months ago

#44564 closed defect (bug) (wontfix)

wp_make_link_relative(home_url()) returns empty

Reported by: Fleuv Owned by:
Milestone: Priority: normal
Severity: normal Version: 4.9.7
Component: Permalinks Keywords: close
Focuses: Cc:

Description

According to the documentation of the function wp_make_link_relative():

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.

Regarding, keeping the path '/' at the beginning. This isn't necessarily true when there isn't a path after the web root base (e.g. with the homepage URL this is often the case) resulting in an empty string to be returned.

Consider the test case in the code block below for a WordPress installation what uses the web root base. Thus I can confirm this bug to exists on installation locations such as: http://example.com/ or http://subdomain.example.com/ but not on http://example.com/subdirectory/

The following code will return an empty string.

<?php
echo wp_make_link_relative(home_url());

The expected result is: '/'

Attachments (1)

patch.diff (495 bytes) - added by Fleuv 12 months ago.
Wrap the output of wp_make_link_relative() with trailingslashit() this also does SEO adding a slash to a links without a slash.

Download all attachments as: .zip

Change History (8)

#1 @Fleuv
12 months ago

According to the regex |^(https?:)?//[^/]+(/?.*)|i used in the function, the function should only return empty when the string what passed to it is the web root base and doesn't contain a trailing slash.

@Fleuv
12 months ago

Wrap the output of wp_make_link_relative() with trailingslashit() this also does SEO adding a slash to a links without a slash.

#2 @Fleuv
12 months ago

  • Keywords needs-testing added

#3 in reply to: ↑ description ; follow-up: @SergeyBiryukov
12 months ago

  • Keywords close added; needs-patch removed

Hi @Fleuv, thanks for the ticket!

The following code will return an empty string.

<?php
echo wp_make_link_relative(home_url());

The expected result is: '/'

That's because home_url() generally does not have a trailing slash.

This should work as expected:

echo wp_make_link_relative( home_url( '/' ) );

#4 in reply to: ↑ 3 @Fleuv
11 months ago

Replying to SergeyBiryukov:

That's because home_url() generally does not have a trailing slash.

Same goes for site_url(). Although it is confusing to note "Keeps the path '/' at the beginning" in the documentation if that isn't always true.

Last edited 11 months ago by Fleuv (previous) (diff)

#5 @SergeyBiryukov
11 months ago

  • Keywords close removed

wp_make_link_relative() does keep the slash at the beginning if it's originally there in the passed URL. If not, there is nothing to keep :) See also #26819.

I can see how it's confusing though. Maybe it should add the slash if it's missing after removing the protocol and domain, but be smart enough not to touch the path if it's already relative.

Or, since it's supposed to return a root-relative path rather than a "true" relative path, maybe always adding the missing slash would be expected.

That said, it's not used in core since 2.5, we should search the plugin repo to see how it's used.

Last edited 11 months ago by SergeyBiryukov (previous) (diff)

#6 @Fleuv
6 months ago

  • Keywords close added; needs-testing removed
  • Resolution set to wontfix
  • Status changed from new to closed

Oke thank you for the reply. I will check for an empty string and add the slash manually.

#7 @netweb
6 months ago

  • Milestone Awaiting Review deleted
Note: See TracTickets for help on using tickets.