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.


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

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;

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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.