Devi fare tre cose importanti:
- Crea una regola di riscrittura personalizzata per trasformare parti dell'URI in valori passati
index.php
.
- Aggiungi
myroute
e myargument
alla 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/myargument
un 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 api
perché 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 myroute
e myargument
alla 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=1
e quindi aggiungete api
come 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 myroute
non è una tassonomia, un termine o una pagina principale?
Spero che questo ti aiuti.
my_insert_rewrite_rules
ordine di definizione! Inizia prima con la regola più lunga, poi passa al più semplice, altrimenti / api / myroute sovrascriverà / api / myroute / myargument.