Hacer cumplir las URL canónicas con múltiples tipos de publicaciones personalizadas

4

Estoy trabajando en un proyecto con varios tipos de publicaciones personalizadas, donde uno de los tipos de publicación es naturalmente (pero no en el sentido de WordPress) el "padre" de las otras. Por ejemplo, supongamos que tengo un tipo de publicación personalizada llamada 'libro' y otra llamada 'carácter', y digo que quiero tener la siguiente estructura de URL personalizada:

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

Por lo tanto, la URL canónica para la publicación sobre el personaje Thing One en el libro The Cat In the Hat sería:

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

Un carácter está asociado a un libro con una fila de meta de publicación.

He creado reescrituras personalizadas para que funcionen ...

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

... pero también necesito asegurarme de que la 'publicación del personaje' en la URL pertenezca al 'libro' ...

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

Esto no puede suceder automáticamente: tengo que enlazar con un filtro o una acción para verificar si el personaje coincide con el libro, y si no, redirigir a la URL canónica correcta o forzar una 404.

¿Dónde está el mejor lugar para llevar a cabo esta verificación? Mis opciones (hasta ahora) son:

  • El filtro request , es decir, la comprobación antes de que se cree una instancia de la consulta principal.
  • Los distintos filtros WP_Query, es decir, hacen que WP_Query haga la comprobación por mí agregando una restricción de meta de publicación.

Me doy cuenta de que esta es más bien una pregunta abierta y probablemente una cuestión de gustos, pero se agradecería cualquier información sobre la forma más eficiente de código y base de datos de hacer las cosas. Gracias.

    
pregunta Chris Carson 26.11.2012 - 16:28

1 respuesta

1

Abordé tipos de publicaciones subordinadas con una vena similar pero no fue tan estricto en el aspecto de la URL canónica; sin embargo, me encontré con una situación similar con el enlace personalizado tipo de producto WooCommerce .

Aproveché el gancho template_redirect para empujar un 404 si no coincidía con la ruta y el post_type_link para asegurar que la meta etiqueta para el enlace canónico y todas las referencias the_permalink() y get_permalink() coincidieran con el enlace deseado.

Un fragmento de la forma en que recomendaría manejar esto:

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 de fuente

    
respondido por el codearachnid 20.03.2014 - 21:09

Lea otras preguntas en las etiquetas