Aggiungere regola di riscrittura per una pagina personalizzata

19 gen 2012, 18:41:32
Visualizzazioni: 15.4K
Voti: 4

Stavo cercando di creare una pagina specifica per ogni autore con un URL personalizzato e funzionava bene, ma quando ho creato questo URL non teneva conto di due fattori:

  1. Conflitti tra nomi di autori (nomi simili).
  2. Aggiungere l'opzione di paginazione alla pagina dell'autore (per i suoi post pubblicati).

Ecco la mia regola iniziale:

function add_my_rule() {    
    global $wp; 
    $wp->add_query_var('args');   
    add_rewrite_rule('writer\/(.*)','index.php?pagename=writer&args=$matches[1]','top'); 
    /* globale $wp_rewrite;
    $wp_rewrite->flush_rules(); */
}
add_action('init', 'add_my_rule'); 

Funzionava correttamente per un URL come:

www.myblog.com/writer/umesh-awasthi ,

ma potrebbero esserci più autori con lo stesso nome e questo creerebbe problemi. Quindi ho pensato di creare un URL per l'autore come fa Stack Overflow:

www.myblog.com/writer/001/umesh-awasthi dove 001 è l'ID utente che sarà sempre univoco.

Il secondo problema riguarda la paginazione: riesco a creare la paginazione nella pagina dell'autore, ma quando l'utente clicca sulla seconda pagina l'URL diventa:

http://localhost/blog/wordpress/writer/umesh-awasthi/page/2/ quindi, secondo la mia regola di riscrittura, otterrei questi dati come parametro umesh-awasthi/page/2, il che significa che la mia query non funzionerà perché si aspetterà il nome dell'autore come umesh-awasthi e invece otterrà umesh-awasthi/page/2.

La mia domanda è: posso riscrivere la regola in modo da ottenere i dati in tre variabili diverse?

  1. ID utente
  2. Nome autore
  3. Numero di pagina (se esiste)

Essendo nuovo a WordPress e alle regole di riscrittura, non sono sicuro di come ottenere questo risultato. Grazie in anticipo.

0
Tutte le risposte alla domanda 1
6
function add_my_rule() {    
    global $wp; 
    $wp->add_query_var('args');   
    $wp->add_query_var('arg_username');
    add_rewrite_rule('writer/([0-9]+)/([^/]*)/page/([0-9]+)','index.php?pagename=writer&args=$matches[1]&arg_username=$matches[2]&paged=$matches[3]','top');
    add_rewrite_rule('writer/([0-9]+)/([^/]*)','index.php?pagename=writer&args=$matches[1]&arg_username=$matches[2]','top');
    /*global $wp_rewrite;
    $wp_rewrite->flush_rules();*/
}
add_action('init', 'add_my_rule');

Questo dovrebbe fare al caso tuo. Una regola di riscrittura per writer/id_utente/username (l'username non viene utilizzato nella regola di riscrittura ma è necessario per farla funzionare). La seconda regola di riscrittura è la stessa ma aggiunge l'impaginazione.


MODIFICA: aggiunto arg_username nel codice sopra.

19 gen 2012 20:43:00
Commenti

questo non funziona come previsto, utilizzando la regola sopra ottengo solo l'user-id e non il nome dello scrittore, ciò significa che per www.myblog.com/writer/001/umesh-awasthi la regola sopra mi restituisce solo 001 e non il nome dello scrittore

Umesh Awasthi Umesh Awasthi
20 gen 2012 18:44:00

Funziona come ho detto nella mia risposta. Se hai l'ID utente non ti serve il nome utente. Se vuoi entrambi puoi aggiungere un altro queryvar (come arg_username) e aggiungerlo alla rewriterule: add_rewrite_rule('writer/([0-9]+)/([^/]*)','index.php?pagename=writer&args=$matches[1]&arg_username=$matches[2]','top'); (cambialo anche nell'altra rewriterule)

Rob Vermeer Rob Vermeer
20 gen 2012 18:48:20

forse sto facendo qualcosa di sbagliato per mancanza di conoscenza ma add_rewrite_rule('writer/([0-9]+)/([^/]*)','index.php?pagename=writer&args=$matches[1]','top'); add_rewrite_rule('writer/([0-9]+)/([^/]*)','index.php?pagename=writer&args=$matches[1]&arg_username=$matches[2]','top'); add_rewrite_rule('writer/([0-9]+)/([^/]*)/page/([0-9]+)','index.php?pagename=writer&args=$matches[1]&arg_username=$matches[2]&paged=$matches[3]','top'); la regola ancora non mi restituisce il nome dell'autore.

Umesh Awasthi Umesh Awasthi
20 gen 2012 18:57:01

Ho modificato la mia risposta.

Rob Vermeer Rob Vermeer
20 gen 2012 19:00:26

Sfortunatamente il valore di $paged risulta sempre 0, ho persino cambiato il valore in $page_num e aggiunto questo alla mia funzione $wp->add_query_var('paged_num'); ma nulla ha funzionato

Umesh Awasthi Umesh Awasthi
20 gen 2012 19:24:04

Colpa mia, controlla la risposta aggiornata (la regola di riscrittura per paged doveva essere in cima).

Rob Vermeer Rob Vermeer
20 gen 2012 19:31:28
Mostra i restanti 1 commenti