Como impor URLs canônicas com vários tipos de post personalizado

4

Estou trabalhando em um projeto com vários tipos de post personalizado, onde um dos tipos de post é naturalmente (mas não no sentido WordPress) o 'pai' dos outros. Por exemplo, digamos que eu tenha um tipo de postagem personalizado chamado "livro" e outro chamado "caractere" e diga que quero ter a seguinte estrutura de URL personalizada:

books/[book-name]/characters/[character-name]

Assim, o URL canônico para o post sobre o personagem Thing One no livro The Cat In the Hat seria:

 books/cat-in-the-hat/characters/thing-one

Um personagem está associado a um livro com uma meta-linha.

Eu criei reescritas personalizadas para que funcione ...

add_rewrite_rule (
    '^books/([^\/]+)/characters/([^\/]+)/?$',
    'index.php?book=$matches[1]&character=$matches[2]&post_type=character'
);

... mas também preciso ter certeza de que a "postagem de caractere" na URL pertence ao "livro" ...

books/cat-in-the-hat/characters/thing-one     //good
books/anna-karenina/characters/count-vronsky  //good
books/anna-karenina/characters/thing-one      //bad

Isso não pode acontecer automaticamente: tenho que me conectar a um filtro ou a uma ação para verificar se o caractere corresponde ao livro e, caso contrário, redirecionar para o URL canônico correto ou forçar um 404.

Onde é o melhor lugar para realizar essa verificação? Minhas escolhas (até agora) são:

  • O filtro request , ou seja, verificar antes de a consulta principal ser instanciada.
  • Os vários filtros WP_Query - ou seja, fazem WP_Query fazer a verificação para mim, adicionando uma restrição pós-meta.

Eu percebo que esta é uma questão em aberto e, provavelmente, uma questão de gosto, mas qualquer insight sobre o código mais eficiente e maneira de banco de dados de fazer as coisas seria apreciado. Obrigado.

    
por Chris Carson 26.11.2012 / 16:28

1 resposta

1

Eu abordei tipos de post subordinado com uma veia semelhante, mas não era tão rigoroso quanto ao aspecto do URL canônico; no entanto, me deparei com uma situação parecida com os links tipo de produto WooCommerce .

Eu aproveitei o gancho template_redirect para enviar um 404 se ele não corresponder à rota e o post_type_link para garantir que a meta tag para o link canônico e todas as referências the_permalink() e get_permalink() correspondam ao link pretendido.

Um snippit do jeito que eu recomendaria para lidar com isso:

add_action( 'template_redirect', 'wp20140320_template_redirect' );
public function wp20140320_template_redirect(){
    global $wp_query, $post;

    // the character post type has the book id set as meta?
    // or could set as post_parent if you don't have characters heirarchical
    $book_id = get_post_meta( $post->ID, '_book_id', true );

    // compare_parent_slug_to_id to check required $book_id against set parent book slug
    if( $post->post_type == 'character' && ! compare_parent_slug_to_id( $book_id ) ){

        // set is_404 since post type is character and parent slug does not match set
        $wp_query->is_404 = true;
        status_header(404);
        include get_404_template();
        exit; // maybe a better way to gracefully exit?

    }
}

Modificado da fonte

    
por codearachnid 20.03.2014 / 21:09