Come creare percorsi URL personalizzati?


50

Ho un requisito molto particolare, spero di poterlo spiegare senza essere troppo confuso. Ho creato un modello di pagina in cui elenco alcune proprietà che ottengo da un file XML esterno, finora nessun problema, supponiamo che l'URL sia così:

http://www.example.com/properties/

Ogni proprietà ha un collegamento che dovrebbe reindirizzare l'utente a una pagina "Proprietà singola" che visualizza ulteriori informazioni al riguardo. Mi chiedevo se c'è un modo per rendere il collegamento in questo modo:

http://www.example.com/properties/123

Dove 123sarebbe l'id della proprietà. Quindi, se ho l'URL come, properties/some_idvoglio essere in grado di caricare un file di visualizzazione (come i file single.phpo page.php) ma specifico per questa condizione URL.

È possibile?

Risposte:


57

Aggiungi questo al function.php del tuo tema o mettilo in un plugin .

add_action( 'init', 'wpse26388_rewrites_init' );
function wpse26388_rewrites_init(){
    add_rewrite_rule(
        'properties/([0-9]+)/?$',
        'index.php?pagename=properties&property_id=$matches[1]',
        'top' );
}

add_filter( 'query_vars', 'wpse26388_query_vars' );
function wpse26388_query_vars( $query_vars ){
    $query_vars[] = 'property_id';
    return $query_vars;
}

Ciò aggiunge una regola di riscrittura che indirizza le richieste a /properties/qualsiasi combinazione di numeri che seguono il nome di pagina properties, con il property_idset var di query . Assicurati di visitare la pagina delle impostazioni dei permalink e di salvare per scaricare le regole di riscrittura, quindi questa nuova regola verrà inclusa.

Nel page-properties.phpmodello, get_query_var('property_id')verrà restituito l'id della proprietà se è stato impostato, in caso contrario verrà mostrata la pagina delle proprietà predefinite.


4
Questo è stato CHIUSO per me, ma ho dovuto aggiungere: add_filter ('init', 'flushRules'); funzione flushRules () {global $ wp_rewrite; $ wp_rewrite-> flush_rules (); }
tooshel

19
@tooshel sicuramente non vuoi svuotare le regole su ogni richiesta, è un'operazione costosa e rallenterà il tuo sito in una scansione. devi scaricare le regole una sola volta, all'attivazione del plug-in o semplicemente visitando la pagina delle impostazioni dei permalink.
Milo,

Sì, ho capito. . . ma quando stai testando è bello che sia lì dentro!
tooshel

3
Potrebbe essere una riscrittura più intelligente dell'URL regexp ^properties/([0-9]+)/?. Altrimenti corrisponderebbe a qualcosa del genereexample/properties/1
Ryan Taylor,

@RyanTaylor ne sei sicuro? non cattura example/properties/1quando lo collaudo.
Milo,

9

Un altro modo per farlo:

add_action('init', function() {
    add_rewrite_rule( '^properties/([0-9]+)/?',
                      'index.php?pagename=properties&property_id=$matches[1]',
                      'top' );
}, 10, 0);

add_action('init', function() {
    add_rewrite_tag( '%property_id%', '([^&]+)' );
}, 10, 0);

Codice Rewrite API / aggiungi regola di riscrittura

Codex Riscrivi API / aggiungi tag riscrivi


2
La risposta accettata funziona con 4.7 (e 4.8), non so perché pensi che non lo faccia. Il tuo codice essenzialmente sta facendo la stessa cosa, add_rewrite_tagaggiunge la query var allo stesso array del query_varsfiltro.
Milo,

@Milo probabilmente non ha funzionato per me, ma non ho più un 4.7 a portata di mano, quindi non posso controllare. Modificherò la mia risposta.
Christian Lescuyer l'

@Milo Anche se preferisco personalmente riscrivere il tag, ma ancora testato la risposta accettata e funziona. Solo alcuni gusti personali, però.
Jack Johansson

1
I tag di riscrittura di @JackJohansson sono necessari quando lo si utilizza in un permastruct . Sono solo un po 'di dati in più che WordPress non usa mai in questo caso.
Milo,

entrambe le regole possono essere aggiunte allo stesso metodo, finendo in una funzione più pulita e utile per tornare a capire se fare lavori di manutenzione
eballeste
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.