Aggiungere regola di riscrittura per una pagina personalizzata
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:
- Conflitti tra nomi di autori (nomi simili).
- 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?
- ID utente
- Nome autore
- 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.

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.

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

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)

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.

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
