WordPress rewrite rules

Algumas vezes, na construção de um site em WordPress, você pode precisar criar algum tipo de estrutura fora da hierarquia padrão do WordPress e seus arquivos de template. No WP 3.0 com os post types personalizados, isso se tornou uma necessidade ainda mais frequente.

Você pode precisar, por exemplo, criar uma página com a listagens dos posts do tipo livros que você criou no seu código.

Este tutorial vai mostrar o funcionamento básico da classe WP_Rewrite() do WordPress que te ajuda a criar URLs customizadas e usá-las para extrair informações (sem precisar usar ?variavel=valor) ou para redirecionar para um arquivo de template criado por você.

Existem outras maneiras de interagir com essa classe, e aqui vou mostrar apenas uma. Por isso é sempre bom dar uma olhada na documentção completa depois.

Primeiro crie uma função que irá criar as suas regras e associe ela a um hook. Neste primeiro exemplo, vamos criar uma página de listagem para um custom post type.

1
2
3
4
5
6
7
8
9
10
11
function cria_minhas_regras$wp_rewrite 
 
    $new_rules = array
        "livros$" => 'index.php?meu_template=livros',
    ;
 
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
 

 
add_action'generate_rewrite_rules', 'cria_minhas_regras';

No código acima estou criando uma regra que diz que sempre que minha URL for meusite/livros, ele será direcionado para o index.php com uma variável meu_template setada com o valor livros. Note que este é o index.php da raíz do WordPress, e não do tema ativo.

As regras são definidas usando uma expressão regular. Se você não conhece expressões regulares, vá atrás pois são muito úteis. Vamos montar algumas regras mais complexas aqui só para termos de exemplo:

1
2
3
4
5
6
7
function cria_minhas_regras$wp_rewrite 
    $new_rules = array
        "livros$" => 'index.php?meu_template=livros',
        "livros/autor/([^/]+)$" => 'index.php?meu_template=livros&autor=' . $wp_rewrite->preg_index1,
    ;
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;

Agora adicionamos uma regra nova. Se a URL vier meusite/livros/autor/qualquercoisa, o WordPress vai criar uma variável chamada autor e colocar essa qualquercoisa como seu valor.

Note que é preciso saber alguma coisa de expressões regulares, pois elas são a base da construção das regras. Explicar expressões regulares nesse artigo o deixaria muito extenso. Por isso, apenas para constar, vale dizer que essa expressão regular entre parênteses quer dizer: um grupo de um ou mais caracteres que não tenha o caractere /. Os parênteses servem para capturar e depois serem acessados pelo método preg_index() ali na frente. Se houver mais de uma captura na mesma expressão, basta ir passando os valores 2, 3, etc para este método.

Seguindo adiante, precisamos registrar essas variáveis que criamos nas variáveis públicas da classe WP_Query, para que possamos acessá-las através da função get_query_var().

1
2
3
4
5
6
7
function registrar_query_vars$public_query_vars 
    $public_query_vars = "meu_template";
    $public_query_vars = "autor";
    return $public_query_vars;

 
add_filter'query_vars', 'registrar_query_vars';

Pronto. Agora você pode acessar esses valores no seu código, usando, por exemplo:

1
$meu_template = get_query_var'meu_template';

Em alguns casos, isso já vai ser suficiente, pois tudo o que você precisa é pegar algumas variáveis e aí no próprio arquivo functions do seu tema você se resolve. Mas você pode fazer também um redirecionamento para forçar o WordPress a usar um arquivo de template diferente do seu tema, que esteja fora da hierarquia do WordPress. Para isso, faça o seguinte:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function template_redirect_intercept
    global $wp_query;
 
    // verifica a variável
    if  $wp_query->get'meu_template' == 'livros'  
 
        // se tiver o valor que queremos, usa o nosso template
        if file_exists TEMPLATEPATH . '/tpl_livros.php'  
            include TEMPLATEPATH . '/tpl_livros.php' ;
            exit;
        
    

 
add_action'template_redirect', 'template_redirect_intercept';

E é isso. Agora crie o arquivo tpl_livros.php no seu tema e seja feliz.

Nota importantíssima: o hook generate_rewrite_rules onde colocamos nossa função para criar as novas regras é chamado quando você salva as configurações de Links Permanentes. É preciso que seus links permanentes estejam configurados para alguma coisa diferente da padrão e o módulo rewrite do apache esteja funcionando corretamente, com o arquivo .htaccess criado.

Nota importantíssima 2: Cada vez que você mudar alguma coisa no código das suas regras, é preciso salvar novamente a configuração de Links Permanentes para atualizar as regras. Isso acontece porque o WordPress guarda essas regras no banco, e não adianta simplesmente gerá-las dinamicamente no código. Você pode contornar isso, chamando na mão a função $wp_rewrite->flush_rules(), mas não é uma boa idéia chamar essa função toda vez que o site é carregado, pois ela é meio pesada.

Rewrite Rules rules!