WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

This is the code I am using:

<?php echo str_replace( home_url(), '', get_permalink($post->ID) ); ?>

What it does is output the permalink as a relative URL i.e. only the slug. For instance, if the permalink is http://example.com/2012/01/post-title/, the relative URL output by the code would look like /2012/01/post-title/.

Problem: All Posts and Pages show the right permalink, which is great. But all other pages (including Home, Search and Archives) show the relative URL of the first post and not that of the respective pages. Any idea why? What am I doing wrong here?

Reference: Get page permalink without wpurl

EDIT: Here's what else I've tried:

In functions.php

function get_relative_permalink( $url ) {
    $url = get_permalink();
    return str_replace( home_url(), "", $url );

In header.php

<link rel="alternate" hreflang="en-IN" href="http://in.example.com/<?php echo get_relative_permalink(); ?>" />

Same problem with this as well. But this one shows a not-so-informative error too.

share|improve this question
Where exactly are you trying this code....?? Are you using global $post before your above code? – Joshua Abenazer Aug 28 '12 at 13:31
@JoshuaAbenazer I am using the code as it is in my header.php file — looks like that's the wrong way of doing it. I will edit my question to reflect whatelse I've tried, so that you can help me better. – its_me Aug 28 '12 at 13:35
Can I ask why you'd want this? – Tom J Nowell Aug 28 '12 at 13:37
@TomJNowell Hey. I need to use a different domain for this markup: <link rel="alternate" hreflang="en-IN" href="http://in.example.com/2012/01/post-title/" /> — but the actual permalink is like this: http://example.com/2012/01/post-title/. (Reading this will give you a better idea of what I am doing.) – its_me Aug 28 '12 at 13:41
up vote 5 down vote accepted

Use $_SERVER['REQUEST_URI'] instead of get_permalink() to grab the current URL.

e.g. for example.com/test/page echo $_SERVER['REQUEST_URI']; prints /test/page

share|improve this answer
Works perfectly!!! Small correction — the second code is missing a quote. echo $_SERVER['REQUEST_URI']; — and thanks! – its_me Aug 28 '12 at 13:51
lol thanks for the headsup on the quote – Tom J Nowell Aug 28 '12 at 14:04
@TomJNowell If I am not mistaken, $_SERVER['REQUEST_URI'] will give you the current URL, which may be a problem if it is a paginated post, meaning that /test/page/2 will be grabbed while using get_permalink() would be the solution for this issue. Am I making sense? – Christine Cooper Jun 10 '14 at 18:36
Which is similar to what the original authors issue was, I would have to do some testing, but you can always add your own answer and if it works I'll upvote =] – Tom J Nowell Jun 10 '14 at 20:34

I use

str_replace(home_url(), '', get_permalink()); 

If site root is not /

share|improve this answer
Nope, doesn't work when WP is in a subdirectory... – Nabil Kadimi Dec 27 '14 at 8:17

This works for me:

function force_relative_url ($url)
    return preg_replace ('/^(http)?s?:?\/\/[^\/]*(\/?.*)$/i', '$2', '' . $url);

To use it on a permalink:

$relative_permalink = force_relative_url (get_permalink ($post->ID));
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.