Get page permalink without wpurl

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 5

  • 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 );
    }
    

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


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


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



Related Questions