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.Para ampliar un poco lo que eddiemoya hizo arriba:
Al igual que el póster original de esta pregunta, quería crear una reescritura personalizada y también entregar una plantilla personalizada para esa página de reescritura. El código de edditmoya me ayudó a comenzar en la dirección correcta, y agregué una función adicional para servir mi plantilla personalizada cuando se accede a la página.
La plantilla personalizada podría ubicarse en cualquier lugar, en mi caso, se almacena en el directorio de complementos.
También solo quería verificar si las reglas de reescritura debían eliminarse durante la activación del complemento, así que lo puse en un register_activation_hook
Vea a continuación el ejemplo completo de lo que hice:
ACTUALIZADO simplificado en base a los consejos de milo
fuente
add_rewrite_endpoint
, lo que generará la regla para usted y agregará la consulta var de una vez. Además, si está agregando sus propias reglas de reescritura, sugiero laadd_rewrite_rule
función en lugar de filtrarrewrite_rules_array
.