Compreendendo add_rewrite_rule

11

Estou tentando add_rewrite_ruletrabalhar para extrair um parâmetro do URL e passá-lo para a solicitação. Visto várias postagens sobre isso, mas não consigo fazê-lo funcionar.

Se um URL começar com uma determinada string, gostaria de removê-lo e transmiti-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 como uma solicitação normal. Essa lógica deve se aplicar a qualquer URL da página ou tipo personalizado de postagem no meu site (basicamente foo / *). Pensando que funcionaria como uma passagem, se o URL tiver 'foo', retire-o e depois passe-o para o Wordpress para a coisa normal.

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

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

  • / foo / minha_página (página)
  • / foo / minha_pasta / minha_página (subpágina)
  • / foo / example_type (arquivo de postagem personalizado)
  • / foo / example_type / example_post (postagem individual personalizada)
Louis W
fonte
qualquer URL, significando postagens, categorias, tags etc., não apenas o pagetipo de postagem ou qualquer página? e as páginas pai / filho na hierarquia?
Milo
@ Mililo eu esclareci isso para você. Estou usando apenas páginas e tipos de postagem personalizados (arquivamento e páginas únicas).
Louis W

Respostas:

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 pega o que vem depois foo/e define isso como pagenamepara a consulta e, em seguida, paramobtém o valor estático foo. Se você precisar de diferentes padrões de URL, precisará de regras extras para cada padrão exclusivo. Consulte os WP_Querydocumentos para os vários vars de consulta que podem ser definidos dentro das regras de reescrita. Não se esqueça de liberar regras de reescrita depois de adicionar novas. Isso pode ser feito visitando a página Configurações de links permanentes.

Agora, visite seu URL de exemplo:

http://domain.com/foo/my_page

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

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

porque ao usar reescritas internas, paramé definido no $wp_queryobjeto de consulta, não na $_GETsuperglobal. Se você precisar trabalhar com o código que procura um valor $_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 considerar é o uso de pontos de extremidade, portanto, /foo/seria no final dos URLs, e não como um prefixo. A vantagem disso é que a API add_rewrite_endpointsimplifica a adição de todas as regras necessárias, incluindo a ativação da paginação.

Milo
fonte
Obrigado pela explicação completa. Parece próximo, funciona para páginas, mas me dá um erro 404 para arquivo de postagem personalizado e URLs únicos.
Louis W
bem, sim, como eu disse, você precisa adicionar regras adicionais que correspondam a cada um desses padrões. Não sei como são esses URLs na sua configuração.
Milo
Eu tenho um tipo de página personalizado chamado 'projetos', que possui um arquivo e páginas únicas. Você pode dar um exemplo disso, e eu posso fazer todos os outros.
Louis W
Além disso, parece não funcionar para subpáginas.
Louis W
11
Edite sua pergunta para adicionar um exemplo de cada padrão de URL que precisa de uma regra. Não estou realmente preocupado com a minha resposta ser aceita, às vezes posso enganar as pessoas para responderem às suas próprias perguntas, dando-lhes algo para começar.
Milo
6

Ok, recebi exemplos de trabalho para todos os três tipos de solicitações. Foram necessárias muitas experiências e brincadeiras para fazê-los funcionar. Eu acho que Milo é bom em convencer as pessoas a responderem suas próprias perguntas.

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

Outra coisa óbvia, mas adicioná-lo aqui para que possa ajudar outra pessoa. Você deve definir as regras customizadas do tipo de postagem add_rewrite_rule ANTES de definir suas regras de curinga de página / subpágina. Eu perdi bastante tempo com isso e acho que é a principal coisa que estava me fazendo não entender por que as regras não funcionaram.

Aqui estão as três 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 de que você deve definir as regras personalizadas do tipo de postagem add_rewrite_rule 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 Rewrite Analyzer, que Milo repassou, foi bastante útil ao tentar entender melhor como o Wordpress consulta páginas / posts.

Louis W
fonte
Atrasado para o show, mas posso dar um ping em você para outro exemplo? Veja bem, eu não entendo totalmente o parâmetro $ tag do add_rewrite_rule. Não tenho idéia do que isso significa. Também não entendo o exemplo usando pagename = $ fósforos [1] '. HÃ??? Eu tenho um URL como domain.com/detail?id=2&it=3. Quero que a página seja domain.com/detail/2-3/. Você está disposto?
Debbie Kurth