Adicionar parâmetros extras após o link permanente?

16

Como posso adicionar parâmetros extras após um link permanente, especificamente se estou usando um tipo de postagem personalizado?

Por exemplo, digamos que http://mysite/album/record-namefoi o link permanente. Como faço para http://mysite/album/record-name/relatednão ativar um 404 ou redirecionar?

O WordPress não parece chamar o modelo de postagem, se a postagem não existir ... então, estou um pouco perdida em como fazer isso.

relm
fonte
11
Acabei de perceber que posso fazer meu site / álbum / nome do registro /? Type = relacionado, mas isso não resolve o meu problema, pois eu o quero em um bom formato de URL. Acho que talvez eu pudesse reescrever no lado nginx para substituir o WordPress, mas prefiro lidar com isso no WordPress, se possível.
Relm

Respostas:

17

Você pode adicionar um terminal aos seus URIs para lidar com solicitações especiais.

Aqui está um exemplo básico como plugin. Para entender o que está acontecendo, leia o fantástico tutorial de Christopher Davis A (Principalmente) Guia completo para a API de reescrita do 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
fonte
12

Você pode fazer isso com o 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;
}

No modelo, você pode detectar quando a sua consulta relacionada var está presente:

if( array_key_exists( 'related' , $wp_query->query_vars ) ):
    // current request ends in related
endif;
Milo
fonte
O que significa wpse51444? Isso é apenas uma corda longa para ter certeza de não colidir com alguma coisa?
Hexodus
@ Hexodus sim, wpse = wp stackexchange, 51444 é o ID desta pergunta. Você pode mudar isso para o que quiser, mas é bom usar algo que você sabe que será único.
Milo
11
Oh Obrigado Milo para clearification - isso foi muito misteriosa;)
Hexodus
@ Hexodus, não achei nada misterioso.
Nabil Kadimi
Não se esqueça de liberar os links permanentes .
26616 Charlie Vieillard
1

para adicionar parâmetro para postar url (link permanente), eu uso assim:

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

resultado:

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

T.Todua
fonte