Pagina personalizzata con variabili nell'URL. URL puliti con add_rewrite_rule
Utilizzo WordPress 3.1
Ho una pagina personalizzata con una WP_Query che riceve variabili dinamiche dall'URL. Voglio ottenere variabili sicure e URL puliti.
Esempio:
carpage/?carmodel=honda&location=finland
IN
carpage/honda/finland/
Ho creato una add_rewrite_rule in functions.php e funziona, ma non sono sicuro che sia sicuro usare questo approccio.
Functions.php
function fcars() {
// Aggiunge una regola di riscrittura per l'URL carpage/ con due parametri opzionali
add_rewrite_rule('carpage/[/]?([a-zA-Z-]*)[/]?([a-zA-Z-]*)$', 'index.php?pagename=carpage&var1=$matches[1]&var2=$matches[2]');
// Aggiunge tag di riscrittura per le variabili
add_rewrite_tag('%var1%', '[a-zA-Z]+');
add_rewrite_tag('%var2%', '[a-zA-Z]+');
}
add_action('init', 'fcars');
E nel template personalizzato ottengo le variabili
Qualcuno potrebbe aiutarmi con questo? Come posso renderlo sicuro da usare e questo è il modo giusto in WP3.1?
Qual è il modo corretto per creare add_rewrite_rule in questo caso:
carpage/honda/finland/
(solo trattini e lettere minuscole nell'URL) carpage è la pagina template statica.

Penso che add_rewrite_tag()
non sia necessario e possa essere sostituito aggiungendo le variabili direttamente alle query vars pubbliche:
// Direttamente (nel tuo hook init):
$wp->add_query_var( 'var1' );
$wp->add_query_var( 'var2' );
// Oppure tramite un filter:
add_filter( 'query_vars', 'wpse12965_query_vars' );
function wpse12965_query_vars( $query_vars )
{
$query_vars[] = 'var1';
$query_vars[] = 'var2';
return $query_vars;
}
Inoltre, attualmente permetti uno o due slash davanti ma nessuno alla fine. Penso che tu voglia spostare /?
alla fine della regex. La parte [a-zA-Z-]
per lo slug a volte viene scritta come [^/]
(tutto tranne uno slash), ma in questo caso probabilmente non farà differenza.
Scriverei la rewrite rule così:
add_action( 'init', 'wpse12065_init' );
function wpse12065_init()
{
add_rewrite_rule(
'carpage(/([^/]+))?(/([^/]+))?/?',
'index.php?pagename=carpage&var1=$matches[2]&var2=$matches[4]',
'top'
);
}
Il (/([^/]+))?
rende l'intero gruppo opzionale, quindi /carpage
, /carpage/honda
e /carpage/honda/finland
dovrebbero funzionare, con uno slash opzionale alla fine. Poiché abbiamo bisogno di un gruppo extra per lo /
, le variabili sono nel gruppo di cattura successivo, quindi quello che era $matches[1]
diventa $matches[2]
e $matches[2]
diventa $matches[4]
.
Se vuoi debuggare le tue rewrite rules ti consiglio il mio plugin Rewrite analyzer, ti permette di sperimentare con l'URL e vedere le variabili della query risultanti.
