Devi fare tre cose importanti:
- Crea una regola di riscrittura personalizzata per trasformare parti dell'URI in valori passati
index.php.
- Aggiungi
myroutee myargumentalla whitelist delle variabili di query di WordPress, in modo che WordPress non le ignori solo quando compaiono in una stringa di query.
- Svuota le regole di riscrittura.
In primo luogo, raccomanderò invece di scegliere http://www.example.org/myroute/myargumentun prefisso o un suffisso speciale per indicare quando l'URI dovrebbe essere considerato uno di questi "percorsi" speciali. Per il bene di questo esempio, ho scelto il prefisso api, in modo che lo sia http://www.example.org/api/myroute/myargument. Ho scelto apiperché quando ho fatto qualcosa di RESTful, come quello su cui sembra stia lavorando, era per un'API.
Il codice
add_filter( 'rewrite_rules_array', 'my_insert_rewrite_rules' );
add_filter( 'query_vars', 'my_insert_query_vars' );
add_action( 'wp_loaded', 'my_flush_rules' );
// flush_rules() if our rules are not yet included
function my_flush_rules() {
$rules = get_option( 'rewrite_rules' );
if ( ! isset( $rules['api/(.*?)/(.+?)'] ) ) {
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
}
// Adding a new rule
function my_insert_rewrite_rules( $rules ) {
$newrules = array();
$newrules['api/(.*?)/(.+?)'] = 'index.php?myroute=$matches[1]&myargument=$matches[2]';
return $newrules + $rules;
}
// Adding the id var so that WP recognizes it
function my_insert_query_vars( $vars ) {
array_push( $vars, 'myroute', 'myargument' );
return $vars;
}
Ripartizione rapida
È tutto abbastanza semplice. Il modello regex viene aggiunto a un elenco di tutte le regole di riscrittura in WordPress e il modello personalizzato si trova in cima all'elenco. Quando il modello viene abbinato, WordPress smetterà di cercare nell'elenco delle regole di riscrittura e utilizzerà i valori acquisiti del regex al posto dei riferimenti ( $matches[1]e $matches[2]) nella stringa di query passata a index.php.
L'aggiunta delle variabili di query myroutee myargumentalla whitelist fa sì che WordPress presti attenzione a loro anziché scartarle.
Modo alternativo di "spazio dei nomi" del percorso personalizzato
Se si desidera evitare l'utilizzo /api/come prefisso, è possibile utilizzare invece una variabile stringa / campo della query. Per fare una cosa del genere, cambiate regex in qualcosa del genere (.*?)/(.+?)\\?api=1e quindi aggiungete apicome parametro aggiuntivo alla array_push()chiamata effettuata my_insert_query_vars().
Ciò cambierebbe il percorso personalizzato in modo che si inneschi in qualsiasi momento api=1è il primo elemento della stringa di query, ad esempio per cui si innescherebbe http://example.com/anytext/anytext?api=1.
Ignora l'uso del termine "spazio dei nomi" - lo hai usato solo per brevità.
Se non si 'spazio dei nomi' con un prefisso o un suffisso, si finirà con la collisione di schemi URI. Questo perché WordPress non avrà modo di distinguere il tuo modello personalizzato da uno destinato a essere un post o una pagina. Come potrebbe sapere WordPress che myroutenon è una tassonomia, un termine o una pagina principale?
Spero che questo ti aiuti.
my_insert_rewrite_rulesordine di definizione! Inizia prima con la regola più lunga, poi passa al più semplice, altrimenti / api / myroute sovrascriverà / api / myroute / myargument.