Rota de plug-in personalizada no Wordpress

10

Ok, minha pergunta é bem simples. Eu preciso implementar algumas regras de roteamento personalizadas para o meu plugin. Essas rotas levariam apenas um argumento (nada complicado) e se pareceriam com: enlace

E, idealmente, isso chamaria uma classe personalizada e mostraria um modelo personalizado (que poderia acessar diretamente a classe).

Qual é a melhor abordagem para isso? Felicidades

    
por Fran 10.07.2012 / 21:14

2 respostas

12

Você precisa fazer três coisas importantes.

  1. Crie uma regra de reconfiguração personalizada para transformar partes da uri em valores passados para index.php
  2. Adicione myroute e myargument à medida que a consulta vars ao wordpress sabe que eles são válidos Parâmetros $ _GET quando as regras de reconfiguração passam algo para eles
  3. Liberar as regras de reescrita.

Primeiro, vou recomendar que, em vez de http://www.example.org/myroute/myargument , você estabeleça algum tipo de prefixo especial ou sufixo para indicar quando o uri deve ser considerado uma dessas 'rotas' especiais. Para o propósito deste exemplo, escolhi o prefixo api , para que fosse http://www.example.org/api/myroute/myargument . Eu escolhi api porque quando eu fiz algo repousante como o que você parece estar trabalhando, foi para uma API.

O 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;
}

Análise rápida

Tudo é bastante simples, o padrão regex é adicionado a uma lista de todas as regras de reescrita no WordPress, e seu padrão personalizado está na lista. Quando houver uma correspondência com o padrão, o WordPress irá parar de procurar e passar os valores capturados para as referências anteriores na string index.php.

A adição da consulta vars apenas os torna myroute e myargument válidos para index.php.

Modo alternativo de 'namespacing' da sua rota personalizada

Se você quisesse evitar usar /api/ como prefixo, poderia usar uma string de consulta var. Para fazer algo assim, você alteraria o regex para algo como (.*?)/(.+?)\?api=1 e, em seguida, adicionaria api como um parâmetro adicional à função array_push em my_insert_query_vars() .

Isso alteraria a rota personalizada a ser acionada sempre que houver http://example.com/anytext/anytext?json=1 .

Ignore o uso do termo 'namespacing' - use-o apenas por brevidade.

Se você não 'namespace' com um prefixo ou um sufixo, você acabará colidindo padrões uri. Isso ocorre porque o WordPress não terá como distinguir seu padrão personalizado de um destinado a ser um post ou uma página. Como o wordpress saberia se esse 'myroute' não é uma taxonomia, um termo ou uma página pai?

Espero que isso ajude.

    
por eddiemoya 11.07.2012 / 02:28
4

Para expandir um pouco o que eddiemoya fez acima:

Assim como o pôster original desta pergunta, eu quis criar uma reconfiguração personalizada e também fornecer um modelo personalizado para essa página de reescrita. O código do edditmoya me iniciou na direção certa e adicionei uma função extra para servir meu modelo personalizado quando a página é acessada.

O modelo personalizado pode estar localizado em qualquer lugar. No meu caso, ele é armazenado no diretório do plug-in.

Eu também queria apenas verificar se as regras de reescrita precisavam ser liberadas durante a ativação do plug-in, então coloquei isso em um register_activation_hook

Veja abaixo o exemplo completo do que fiz:

ATUALIZADO simplificado com base em conselhos do 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' ) );
    
por Matt Keys 24.09.2014 / 01:14

Tags