¿Agregar parámetros adicionales después del enlace permanente?

16

¿Cómo puedo agregar parámetros adicionales después de un enlace permanente, específicamente si estoy usando un tipo de publicación personalizado?

Por ejemplo, digamos que http://mysite/album/record-namefue el enlace permanente. ¿Cómo puedo hacer que http://mysite/album/record-name/relatedno suba un 404 o redirija?

WordPress no parece invocar la plantilla de publicación si la publicación no existe ... así que no sé cómo hacerlo.

relm
fuente
1
Me acabo de dar cuenta de que puedo hacer mysite / album / record-name /? Type = related pero eso no resuelve mi problema, ya que lo quiero en un buen formato de URL. Estoy pensando que tal vez podría hacer una reescritura en el lado nginx para anular WordPress, pero preferiría manejar esto dentro de WordPress si es posible.
Relm

Respuestas:

17

Puede agregar un punto final a sus URI para manejar solicitudes especiales.

Aquí hay un ejemplo básico como complemento. Para comprender lo que está sucediendo, lea el fantástico tutorial de Christopher Davis Una guía completa (principalmente) de la API de reescritura de WordPress .

<?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;
}
fuxia
fuente
12

Puede hacer esto con el add_rewrite_endpoint de la API de reescritura :

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

En la plantilla puede detectar cuándo está presente su consulta relacionada var:

if( array_key_exists( 'related' , $wp_query->query_vars ) ):
    // current request ends in related
endif;
Milo
fuente
¿Qué significa wpse51444? ¿Es solo una cuerda larga para asegurarse de no chocar con algo?
Hexodus
@Hexodus sí, wpse = wp stackexchange, 51444 es el id de esta pregunta. Puedes cambiar eso a lo que quieras, pero es bueno usar algo que sabes que será único.
Milo
1
Oh, gracias Milo por la aclaración, esto fue muy misterioso;)
Hexodus
@Hexodus No lo encontré misterioso en absoluto.
Nabil Kadimi
No te olvides de limpiar los enlaces permanentes .
Charlie Vieillard
1

para agregar parámetros a la URL de publicación ( enlace permanente), uso 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

T.Todua
fuente