¿Añadir parámetros extra después del permalink?
¿Cómo puedo añadir parámetros extra después de un permalink, específicamente si estoy usando un tipo de post personalizado?
Por ejemplo, digamos que http://mysite/album/record-name
es el permalink. ¿Cómo puedo hacer que http://mysite/album/record-name/related
no muestre un 404 o se redireccione?
WordPress no parece llamar a la plantilla del post si el post no existe... así que estoy un poco perdido sobre cómo hacer esto.
Puedes añadir un endpoint a tus URIs para manejar solicitudes especiales.
Aquí tienes un ejemplo básico como plugin. Para entender lo que está pasando, lee el fantástico tutorial de Christopher Davis Una guía (casi) completa de la API de reescritura de WordPress.
<?php # -*- coding: utf-8 -*-
/**
* Plugin Name: Ejemplo de Endpoint T5
* Description: Añade un endpoint de enlace permanente a las entradas llamado <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' );
/**
* Maneja las llamadas al endpoint.
*/
function t5_render_epex()
{
if ( ! is_singular() or ! get_query_var( 'epex' ) )
{
return;
}
// Probablemente harás algo más productivo aquí.
$post = get_queried_object();
print '<pre>' . htmlspecialchars( print_r( $post, TRUE ) ) . '</pre>';
exit;
}
add_filter( 'request', 't5_set_epex_var' );
/**
* Asegura que 'get_query_var( 'epex' )' no devuelva solo una cadena vacía si está configurado.
*
* @param array $vars
* @return array
*/
function t5_set_epex_var( $vars )
{
isset( $vars['epex'] ) and $vars['epex'] = true;
return $vars;
}

Puedes hacer esto con la API de Rewrite usando 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 ){
// agregar 'related' al array de variables de consulta reconocidas
$query_vars[] = 'related';
return $query_vars;
}
En la plantilla puedes detectar cuando tu variable de consulta 'related' está presente:
if( array_key_exists( 'related' , $wp_query->query_vars ) ):
// la solicitud actual termina en 'related'
endif;

¿Qué significa wpse51444? ¿Es solo una cadena larga para asegurarse de que no colisione con algo?

@Hexodus sí, wpse = wp stackexchange, 51444 es el id de esta pregunta. Puedes cambiarlo por lo que quieras, pero es bueno usar algo que sepas que será único.

No olvides actualizar los enlaces permanentes.

para agregar un parámetro a la URL de la publicación (enlace permanente), lo hago así:
add_filter( 'post_type_link', 'append_query_string', 10, 2 );
function append_query_string( $url, $post )
{
return $url.'?my_pid='.$post->ID;
}
salida:
http://yoursite.com/pagename?my_pid=12345678
