Compreendendo o add_rewrite_rule

10

Estou tentando fazer com que add_rewrite_rule trabalhe para extrair um parâmetro de url e passá-lo para a solicitação. Visto um número de posts sobre isso, mas parece que não funciona.

Se um URL começar com uma determinada string, eu gostaria de removê-lo da URL e passá-lo como um parâmetro de consulta.

URL de solicitação de exemplo:

http://domain.com/foo/my_page

Isso seria transformado em

http://domain.com/my_page?param=foo

Se 'foo' não estiver presente, ele deve passar por uma solicitação normal. Essa lógica deve se aplicar a qualquer URL de página ou URL de tipo de postagem personalizada no meu site (basicamente foo / *). Pensar que agiria como uma passagem, se a url tiver 'foo' desmembrado e depois passar para o Wordpress, é normal.

Eu já tenho 'param' como um query_vars permitido.

No total, seria necessário trabalhar para o seguinte:

  
  • / foo / my_page (página)
  •   
  • / foo / my_folder / my_page (subpágina)
  •   
  • / foo / example_type (arquivo de postagem personalizado)
  •   
  • / foo / example_type / example_post (postagem personalizada única)
  •   
    
por Louis W 31.12.2016 / 00:34

2 respostas

6

Ok, recebi exemplos de trabalho para todos os três tipos de solicitações. Demorou um monte de experiências e brincadeiras para que elas funcionassem. Eu acho que Milo é bom em cutucar as pessoas para responder suas próprias perguntas.

Após inúmeras mudanças e atualizações dos permalinks, percebi que era muito mais fácil descobrir os URLs fora do add_rewrite_url e, depois que eles funcionavam, definir a reescrita. Exemplo sendo index.php?param=foo&post_type=example_type .

Outra coisa óbvia, mas adicionando-a aqui, pode ajudar outra pessoa. Você deve definir as regras add_rewrite_rule do tipo de postagem personalizada ANTES de definir suas regras de curinga de página / subpágina. Eu desperdicei um pouco de tempo com essa e acho que é a principal coisa que me fez não entender por que as regras não funcionavam.

Aqui estão as 3 regras que funcionam em todas as minhas necessidades. A regra Página / Subpágina foi combinada em uma única.

// Custom Post Archive
add_rewrite_rule(
    '^foo/example_type/?$',
    'index.php?param=foo&post_type=example_type',
    'top'
    );

// Custom Post Individual
add_rewrite_rule(
    '^foo/example_type/([^/]*)/?$',
    'index.php?param=foo&example_type=$matches[1]',
    'top'
    );

// Pages, Top-Level and Sub-Pages
// This MUST be placed in the code AFTER custom post add_rewrite_rule
add_rewrite_rule(
    '^foo/(.+)/?$',    
    'index.php?param=foo&pagename=$matches[1]',
    'top'
    );

Além disso, o que fiz foi configurar um loop para adicionar várias regras de tipo de postagem personalizadas. Lembre-se, você deve definir o tipo de post personalizado add_rewrite_rule rules ANTES de definir suas regras de curinga de página / subpágina.

$custom_types = array('example_type', 'projects', 'people');

foreach($custom_types as $type) {

    // Custom Post Archive
    add_rewrite_rule(
        '^foo/'.$type.'/?$',
        'index.php?param=foo&post_type='.$type,
        'top'
        );

    // Custom Post Individual
    add_rewrite_rule(
        '^foo/'.$type.'/([^/]*)/?$',
        'index.php?param=foo&'.$type.'=$matches[1]',
        'top'
        );

}

O Analisador de Regravação que o Milo transmitiu foi bastante útil ao tentar entender melhor como as consultas do Wordpress para páginas / posts.

    
por Louis W 05.01.2017 / 16:51
8

Uma regra básica que funcionaria para o seu exemplo:

function wpd_foo_rewrite_rule() {
    add_rewrite_rule(
        '^foo/([^/]*)/?',
        'index.php?pagename=$matches[1]&param=foo',
        'top'
    );
}
add_action( 'init', 'wpd_foo_rewrite_rule' );

Isso leva o que vem depois de foo/ e define isso como pagename para a consulta e, em seguida, param obtém o valor estático foo . Se você precisar de diferentes padrões de URL, precisará de regras extras para cada padrão único. Consulte WP_Query docs para as várias variáveis de consulta que podem ser definidas dentro das regras de reconfiguração. Não se esqueça de liberar as regras de reescrita depois de adicionar novas. Isso pode ser feito visitando a página Configurações de Permalinks.

Agora, está visitando seu URL de exemplo:

http://domain.com/foo/my_page

carregará a página correta, mas não se comportará exatamente como a visita:

http://domain.com/my_page?param=foo

porque ao usar reescritas internas, param é definido dentro do objeto de consulta $wp_query , e não em $_GET superglobal. Se você precisa trabalhar com código que está procurando um valor em $_GET , precisará de uma etapa extra para definir esse valor:

function wpd_foo_get_param() {
    if( false !== get_query_var( 'param' ) ){
        $_GET['param'] = get_query_var( 'param' );
    }
}
add_action( 'parse_query', 'wpd_foo_get_param' );

Outro método a ser considerado é o uso de endpoints, então /foo/ estaria no final das URLs, e não como um prefixo. A vantagem disso é que a add_rewrite_endpoint da API simplifica a adição de todas as regras necessárias, incluindo a habilitação de paginação.

    
por Milo 02.01.2017 / 04:15