Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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.

share|improve this question
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. –  xsphere May 7 '12 at 23:50

3 Answers 3

up vote 10 down vote accepted

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' ) )
    {
        return;
    }

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


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;
}
share|improve this answer

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
endif;
share|improve this answer
    
+1 because you were faster than me. :) –  toscho May 8 '12 at 0:36
    
What does wpse51444 mean? Is this just a longish string to make sure to not collide with something? –  Hexodus Nov 15 '13 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 Nov 15 '13 at 14:39
1  
Oh Thank you Milo for clearification - this was very mysterious ;) –  Hexodus Nov 15 '13 at 15:05

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

output:

http://yoursite.com/pagename?my_pid=12345678

share|improve this answer

Your Answer

 
discard

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.