Ruta de complemento personalizada en Wordpress

10

Bien, entonces mi pregunta es bastante simple. Necesito implementar algunas reglas de enrutamiento personalizadas para mi complemento. Esas rutas solo tomarían un argumento (así que nada complicado) y se verían como: enlace

E idealmente, esto llamaría una clase personalizada y mostraría una plantilla personalizada (que podría acceder directamente a la clase).

¿Cuál es el mejor enfoque para esto? Saludos

    
pregunta Fran 10.07.2012 - 21:14

2 respuestas

12

Necesitas hacer 3 cosas importantes.

  1. Cree una regla de reescritura personalizada para convertir partes del uri en valores pasados a index.php
  2. 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
  3. 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.

    
respondido por el eddiemoya 11.07.2012 - 02:28
4

Para ampliar un poco lo que hizo eddiemoya 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 hizo comenzar en la dirección correcta, y agregué una función adicional para mostrar mi plantilla personalizada cuando se accede a la página.

La plantilla personalizada podría ubicarse en cualquier lugar, en mi caso, está almacenada en el directorio del complemento.

También quise comprobar si las reglas de reescritura debían eliminarse durante la activación del complemento, así que lo puse en un registro_activation_hook

Vea a continuación el ejemplo completo de lo que hice:

ACTUALIZADO simplificado según los consejos de milo

class Your_Class
{

    public function init()
    {
        add_filter( 'template_include', array( $this, 'include_template' ) );
        add_filter( 'init', array( $this, 'rewrite_rules' ) );
    }

    public function include_template( $template )
    {
        //try and get the query var we registered in our query_vars() function
        $account_page = get_query_var( 'account_page' );

        //if the query var has data, we must be on the right page, load our custom template
        if ( $account_page ) {
            return PATH_TO_PLUGIN_TEMPLATES_DIR . 'register.php';
        }

        return $template;
    }

    public function flush_rules()
    {
        $this->rewrite_rules();

        flush_rewrite_rules();
    }

    public function rewrite_rules()
    {
        add_rewrite_rule( 'account/(.+?)/?$', 'index.php?account_page=$matches[1]', 'top');
        add_rewrite_tag( '%account_page%', '([^&]+)' );
    }

}

add_action( 'plugins_loaded', array( new Your_Class, 'init' ) );

// One time activation functions
register_activation_hook( PATH_TO_PLUGIN_FILE, array( new Your_Class, 'flush_rules' ) );
    
respondido por el Matt Keys 24.09.2014 - 01:14

Lea otras preguntas en las etiquetas