Aggiungi parametri extra dopo il permalink?


16

Come posso aggiungere parametri extra dopo un permalink, in particolare se sto usando un tipo di post personalizzato?

Ad esempio, supponiamo che http://mysite/album/record-namefosse il permalink. Come posso fare per http://mysite/album/record-name/relatednon alzare un 404 o reindirizzare?

WordPress non sembra richiamare il modello di post se il post non esiste ... quindi sono un po 'perplesso su come farlo.


1
Ho appena realizzato che posso fare mysite / album / record-name /? Type = related ma questo non risolve il mio problema, come lo voglio in un bel formato URL. Sto pensando che potrei forse fare una riscrittura sul lato nginx per sovrascrivere WordPress, ma preferirei gestirlo in WordPress se possibile.
relm

Risposte:


17

È possibile aggiungere un endpoint agli URI per gestire richieste speciali.

Ecco un esempio di base come plugin. Per capire cosa sta succedendo leggi il fantastico tutorial di Christopher Davis Una (per lo più) guida completa all'API di riscrittura di 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

Puoi farlo con add_rewrite_endpoint dell'API di riscrittura :

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

Nel modello è possibile rilevare quando è presente la query correlata var:

if( array_key_exists( 'related' , $wp_query->query_vars ) ):
    // current request ends in related
endif;

Cosa significa wpse51444? È solo una lunga stringa per assicurarsi di non scontrarsi con qualcosa?
Esodo

@Hexodus yes, wpse = wp stackexchange, 51444 è l'id di questa domanda. Puoi cambiarlo in qualsiasi cosa tu voglia, ma è bene usare qualcosa che sai sarà unico.
Milo,

1
Oh, grazie Milo per la clearificazione - questo era molto misterioso;)
Esodo

@Hexodus Non l'ho trovato affatto misterioso.
Nabil Kadimi,

Non dimenticare di lavare i permalink .
Charlie Vieillard,

1

per aggiungere un parametro al post url (permalink), uso così:

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

produzione:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.