How can I add extra parameters after a permalink, specifically if I'm using a custom post type?

For example, let's say http://mysite/album/record-name was the permalink. How can I make http://mysite/album/record-name/related not turn up a 404 or redirect?

WordPress doesn't seem to call up the post template if the post doesn't exist... so I'm at a bit of a loss how to do this.

  • 1
    I just realized I can do mysite/album/record-name/?type=related but that doesn't solve my issue, as I want it in a nice URL format. I'm thinking I could maybe do a rewrite on the nginx side to overrride WordPress, but I would rather handle this within WordPress if possible.
    – relm
    Commented May 7, 2012 at 23:50

3 Answers 3


You can add an endpoint to your URIs to handle special requests.

Here is a basic example as plugin. To understand what's going on read Christopher Davis's fantastic tutorial A (Mostly) Complete Guide to the WordPress Rewrite API.

<?php # -*- coding: utf-8 -*-
 * Plugin Name: T5 Endpoint Example
 * Description: Adds a permalink endpoint to posts named <code>epex</code>

add_action( 'init', 't5_add_epex' );

function t5_add_epex()
    add_rewrite_endpoint( 'epex', EP_PERMALINK );

add_action( 'template_redirect', 't5_render_epex' );

 * Handle calls to the endpoint.
function t5_render_epex()
    if ( ! is_singular() or ! get_query_var( 'epex' ) )

    // You will probably do something more productive.
    $post = get_queried_object();
    print '<pre>' . htmlspecialchars( print_r( $post, TRUE ) ) . '</pre>';

add_filter( 'request', 't5_set_epex_var' );

 * Make sure that 'get_query_var( 'epex' )' will not return just an empty string if it is set.
 * @param  array $vars
 * @return array
function t5_set_epex_var( $vars )
    isset( $vars['epex'] ) and $vars['epex'] = true;
    return $vars;

You can do this with the Rewrite API's add_rewrite_endpoint:

add_action( 'init', 'wpse51444_endpoint' );
function wpse51444_endpoint(){
    add_rewrite_endpoint( 'related', EP_ALL );

add_filter( 'query_vars', 'wpse51444_query_vars' );
function wpse51444_query_vars( $query_vars ){
    // add related to the array of recognized query vars
    $query_vars[] = 'related';
    return $query_vars;

In the template you can detect when your related query var is present:

if( array_key_exists( 'related' , $wp_query->query_vars ) ):
    // current request ends in related
  • What does wpse51444 mean? Is this just a longish string to make sure to not collide with something?
    – Hexodus
    Commented Nov 15, 2013 at 14:14
  • @Hexodus yes, wpse = wp stackexchange, 51444 is the id of this question. You can change that to anything you'd like, but it's good to use something you know will be unique.
    – Milo
    Commented Nov 15, 2013 at 14:39
  • 1
    Oh Thank you Milo for clearification - this was very mysterious ;)
    – Hexodus
    Commented Nov 15, 2013 at 15:05
  • @Hexodus I didn't find it mysterious at all. Commented Nov 21, 2014 at 23:57
  • Don't forget to flush the permalinks. Commented Oct 26, 2016 at 8:54

to add parameter to post url (permalink), i use like this:

add_filter( 'post_type_link', 'append_query_string', 10, 2 );
function append_query_string( $url, $post ) 
    return $url.'?my_pid='.$post->ID;



Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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