Necesitas hacer 3 cosas importantes.
- Cree una regla de reescritura personalizada para convertir partes del uri en valores pasados a index.php
- Agregar
myroute
y myargument
como vars de consulta a wordpress sabe que son parámetros $ _GET válidos cuando las reglas de reescritura pasan algo a ellos
- Eliminar las reglas de reescritura.
Primero, voy a recomendar que, en lugar de http://www.example.org/myroute/myargument
, establezca algún tipo de prefijo o sufijo especial para indicar cuándo debe considerarse el uri una de estas 'rutas' especiales. Por el bien de este ejemplo, he elegido el prefijo api
, de modo que sea http://www.example.org/api/myroute/myargument
. Elegí la API porque cuando hice algo relajante como en lo que parece que estás 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 de expresiones regulares se agrega a una lista de todas las reglas de reescritura en WordPress, y su patrón personalizado se encuentra al final de la lista. Cuando hay una coincidencia con el patrón, WordPress dejará de buscar y pasará los valores capturados a las referencias posteriores en la cadena index.php.
Agregar las variables de consulta solo las hace myroute
y myargument
válidas para que index.php las maneje.
Forma alternativa de 'espacios' en su ruta personalizada
Si quisiera evitar el uso de /api/
como prefijo, podría usar una cadena de consulta var. Para hacer algo así, cambiarías la expresión regular a algo como (.*?)/(.+?)\?api=1
y luego agregarías api
como un parámetro adicional a la función array_push
en my_insert_query_vars()
.
Eso cambiaría la ruta personalizada que se activará en cualquier momento que haya http://example.com/anytext/anytext?json=1
.
Ignore el uso del término 'espacio de nombres' - simplemente lo usé por brevedad.
Si no 'espacio de nombres' con un prefijo o un sufijo, terminarás con patrones de uri en colisión. Esto se debe a que WordPress no tendrá manera de distinguir su patrón personalizado de uno destinado a ser una publicación o página. ¿Cómo sabría wordpress si 'myroute' no es una taxonomía, un término o una página principal?
Espero que esto ayude.