Como criar rotas de URL personalizadas?


50

Eu tenho um requisito muito peculiar, espero que eu possa explicar sem ser muito confuso. Eu criei um modelo de página onde listo algumas propriedades que recebo de um arquivo XML externo, até agora sem problemas, digamos que a URL seja assim:

http://www.example.com/properties/

Cada propriedade possui um link que deve redirecionar o usuário para uma página "Propriedade única" que exibe mais informações sobre ela. Fiquei me perguntando se existe uma maneira de fazer o link como este:

http://www.example.com/properties/123

Onde 123seria o ID da propriedade. Portanto, se eu tiver o URL como properties/some_idquero poder carregar um arquivo de exibição (como os arquivos single.phpou page.php), mas específico para essa condição de URL.

Isso é possível?

Respostas:


57

Adicione isso ao functions.php do seu tema ou coloque-o em um plugin .

add_action( 'init', 'wpse26388_rewrites_init' );
function wpse26388_rewrites_init(){
    add_rewrite_rule(
        'properties/([0-9]+)/?$',
        'index.php?pagename=properties&property_id=$matches[1]',
        'top' );
}

add_filter( 'query_vars', 'wpse26388_query_vars' );
function wpse26388_query_vars( $query_vars ){
    $query_vars[] = 'property_id';
    return $query_vars;
}

Isso adiciona uma regra de reescrita que direciona solicitações para /properties/qualquer combinação de números a seguir ao nome da página properties, com o property_idconjunto de consultas var . Não deixe de visitar sua página de configurações de links permanentes e salvar para liberar regras de reescrita, para que essa nova regra seja incluída.

No seu page-properties.phpmodelo, get_query_var('property_id')retornará o ID da propriedade se ele tiver sido definido; caso contrário, mostrará a página de propriedades padrão.


4
Isso estava PERTO de trabalhar para mim, mas eu precisava adicionar: add_filter ('init', 'flushRules'); função flushRules () {global $ wp_rewrite; $ wp_rewrite-> flush_rules (); }
tooshel 13/11/2012

19
@tooshel você definitivamente não deseja liberar regras em todas as solicitações, é uma operação cara e atrasará o seu site. você só precisa liberar as regras uma vez, na ativação do plug-in ou apenas visitando a página de configurações de links permanentes.
Milo

Sim, eu entendi. . . mas quando você está testando, é bom que esteja lá!
`` tooshel

3
Uma regexp de URL de reescrita mais inteligente pode ser ^properties/([0-9]+)/?. Caso contrário, ele corresponderia a algo comoexample/properties/1
Ryan Taylor

@RyanTaylor você tem certeza disso? não captura example/properties/1quando eu testo.
Milo

9

Outra maneira de fazer isso:

add_action('init', function() {
    add_rewrite_rule( '^properties/([0-9]+)/?',
                      'index.php?pagename=properties&property_id=$matches[1]',
                      'top' );
}, 10, 0);

add_action('init', function() {
    add_rewrite_tag( '%property_id%', '([^&]+)' );
}, 10, 0);

API de reescrita de codex / adicionar regra de reescrita

API de reescrita do codex / adicionar tag de reescrita


2
A resposta aceita funciona com 4.7 (e 4.8), sem saber por que você acha que não. Seu código está essencialmente fazendo a mesma coisa; add_rewrite_tagadiciona a consulta var à mesma matriz que o query_varsfiltro.
Milo

@Milo provavelmente não funcionou para mim, mas eu não tenho mais um 4.7 à mão, então não posso verificar. Vou editar minha resposta.
Christian Lescuyer

@Milo Embora eu pessoalmente prefira reescrever a tag, mas ainda testei a resposta aceita e ela funciona. Apenas alguns gostos pessoais, no entanto.
Jack Johansson

11
As tags de reescrita do @JackJohansson são necessárias quando você a usa em uma permastruct . É apenas um bit extra de dados que o WordPress nunca usa nesse caso.
Milo

tanto as regras podem ser adicionados ao mesmo método, terminando em um produto de limpeza e função mais útil para voltar e descobrir se a fazer o trabalho de manutenção
eballeste
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.