Ajouter des paramètres supplémentaires après le permalien?

17

Comment puis-je ajouter des paramètres supplémentaires après un permalien, en particulier si j'utilise un type de publication personnalisé?

Par exemple, disons que http://mysite/album/record-namec'était le permalien. Comment puis-je faire pour http://mysite/album/record-name/relatedne pas activer un 404 ou rediriger?

WordPress ne semble pas appeler le modèle de publication si la publication n'existe pas ... alors je ne sais pas trop comment faire.

relm
la source
1
Je viens de réaliser que je peux faire mysite / album / record-name /? Type = related mais cela ne résout pas mon problème, car je le veux dans un joli format URL. Je pense que je pourrais peut-être faire une réécriture du côté nginx pour remplacer WordPress, mais je préfère gérer cela dans WordPress si possible.
relm

Réponses:

17

Vous pouvez ajouter un point de terminaison à vos URI pour gérer les demandes spéciales.

Voici un exemple basique de plugin. Pour comprendre ce qui se passe, lisez le fantastique tutoriel de Christopher Davis , un (presque) guide complet de l'API de réécriture 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
la source
12

Vous pouvez le faire avec add_rewrite_endpoint de l' API de réécriture :

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

Dans le modèle, vous pouvez détecter la présence de votre variable de requête associée:

if( array_key_exists( 'related' , $wp_query->query_vars ) ):
    // current request ends in related
endif;
Milo
la source
Que signifie wpse51444? Est-ce juste une chaîne assez longue pour s'assurer de ne pas entrer en collision avec quelque chose?
Hexodus du
@Hexodus oui, wpse = wp stackexchange, 51444 est l'identifiant de cette question. Vous pouvez changer cela en tout ce que vous souhaitez, mais il est bon d'utiliser quelque chose que vous savez unique.
Milo
1
Oh merci Milo pour la clearification - c'était très mystérieux;)
Hexodus
@Hexodus Je ne l'ai pas du tout trouvé mystérieux.
Nabil Kadimi
N'oubliez pas de vider les permaliens .
Charlie Vieillard
2

pour ajouter un paramètre à poster une URL (permalien), j'utilise comme ceci:

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

production:

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

T.Todua
la source