Debes hacer tres cosas importantes:
- Cree una regla de reescritura personalizada para convertir partes del URI en valores pasados a
index.php
.
- Agregue
myroute
y myargument
a la lista blanca de variables de consulta de WordPress, para que WordPress no solo las ignore cuando aparecen en una cadena de consulta.
- Vaciar las reglas de reescritura.
En primer lugar, voy a recomendar que, en lugar de hacerlo http://www.example.org/myroute/myargument
, se decida por algún tipo de prefijo o sufijo especial para indicar cuándo el URI debe considerarse una de estas 'rutas' especiales. Por el bien de este ejemplo, he elegido el prefijo api
, para que así sea http://www.example.org/api/myroute/myargument
. Elegí api
porque cuando hice algo RESTful, como en lo que parece estar trabajando, fue para una API.
El código
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;
}
Desglose rápido
Todo es bastante sencillo. El patrón regex se agrega a una lista de todas las reglas de reescritura en WordPress, y su patrón personalizado está en la parte superior de la lista. Cuando el patrón coincide, WordPress dejará de mirar a través de la lista de reglas de reescritura, y usará los valores capturados de la expresión regular en lugar de las referencias ( $matches[1]
y $matches[2]
) en la cadena de consulta pasada index.php
.
Agregar las variables de consulta myroute
y myargument
la lista blanca solo hace que WordPress les preste atención en lugar de descartarlas.
Manera alternativa de 'espaciar nombres' en su ruta personalizada
Si desea evitar su uso /api/
como prefijo, puede utilizar una variable / campo de cadena de consulta en su lugar. Para hacer algo así, debe cambiar la expresión regular a algo así (.*?)/(.+?)\\?api=1
y luego agregarla api
como un parámetro adicional a la array_push()
llamada realizada my_insert_query_vars()
.
Eso cambiaría la ruta personalizada para que se active en cualquier momento api=1
es el primer elemento de la cadena de consulta, por ejemplo, se activaría para http://example.com/anytext/anytext?api=1
.
Ignore el uso del término 'espacio de nombres', solo lo usé por brevedad.
Si no 'espacio de nombres' con un prefijo o sufijo, terminará con patrones de URI colisionantes. Esto se debe a que WordPress no tendrá forma de distinguir su patrón personalizado de uno destinado a ser una publicación o página. ¿Cómo sabría WordPress que myroute
no se trata de una taxonomía, término o página principal?
Espero que esto ayude.
my_insert_rewrite_rules
siguiente orden de definición. Comience con la regla más larga primero y luego trabaje hasta la más simple, de lo contrario / api / myroute anulará / api / myroute / myargument.