I currently have an ID of a page that I want to use its permalink as the front of a permastruct of a CPT I’m setting up.
Now I can use get_permalink() but that returns the full URL:
http://www.example.com/imapage/subpage/subsubpage
but all I want to return is imapage/subpage/subsubpage
Is there a function that can do this or do I have to device something that can subtract the non-needed part of the url?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
There’s nothing built in to return the bit you want but it should be as easy as using the home_url() function and removing it’s output from the full url eg:
function get_relative_permalink( $url ) {
return str_replace( home_url(), "", $url );
}
Method 2
There’s actually a core function for this now. wp_make_link_relative($url)
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.
Example
<?php echo wp_make_link_relative('http://localhost/wp_test/sample-page/'); ?>
This will output /wp_test/sample-page/
Example with Post ID
<?php echo wp_make_link_relative(get_permalink( $post->ID )); ?>
Example for current post
<?php echo wp_make_link_relative(get_permalink()); ?>
More about this can be found in the documentation.
Method 3
You won’t be able to use get_permalink() for that.
If you dig into the code for that function in /wp-includes/link-template.php you’ll see why. After the permalink structure is parsed and prepared, the code does this:
$permalink = home_url( str_replace($rewritecode, $rewritereplace, $permalink) );
This is performed immediately after the structure of the link is created and before anything is passed through a useful filter.
So unfortunately, you’ll have to extract the non-needed part of the URL yourself. I’d recommend using the str_replace() function that @sanchothefat suggested.
Method 4
$path = parse_url(get_permalink(...), PHP_URL_PATH); … gives the URL PATH only. This is not relative to blog root but to domain. It’s the absolute URI.
Method 5
$relative_permalink = wp_make_link_relative(get_permalink($post->ID));
wp_make_link_relative( string $link )
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.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0