Pagina personalizzata con variabili nell'URL. URL puliti con add_rewrite_rule

24 mar 2011, 19:11:55
Visualizzazioni: 17.2K
Voti: 8

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.

0
Tutte le risposte alla domanda 1
0
16

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.

24 mar 2011 20:05:00