¿Añadir parámetros extra después del permalink?

8 may 2012, 02:44:24
Vistas: 28.9K
Votos: 18

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

1
Comentarios

Me acabo de dar cuenta de que puedo hacer http://misitio/album/nombre-del-disco/?type=related pero eso no resuelve mi problema, ya que lo quiero en un formato de URL agradable. Estoy pensando que tal vez podría hacer un rewrite en el lado de nginx para anular WordPress, pero preferiría manejar esto dentro de WordPress si es posible.

relm relm
8 may 2012 02:50:27
Todas las respuestas a la pregunta 3
0
19

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;
}
8 may 2012 03:24:23
5
12

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;
8 may 2012 03:23:25
Comentarios

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

Hexodus Hexodus
15 nov 2013 16:14:57

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

Milo Milo
15 nov 2013 16:39:11

Oh, gracias Milo por la aclaración - esto era muy misterioso ;)

Hexodus Hexodus
15 nov 2013 17:05:04

@Hexodus No lo encontré misterioso en absoluto.

Nabil Kadimi Nabil Kadimi
22 nov 2014 01:57:37

No olvides actualizar los enlaces permanentes.

Charlie Vieillard Charlie Vieillard
26 oct 2016 11:54:32
0

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

1 abr 2014 16:59:49