web-dev-qa-db-fra.com

Application d'URL canoniques avec plusieurs types de publication personnalisés

Je travaille sur un projet comportant plusieurs types de publication personnalisés, l'un des types de publication étant naturellement (mais pas réellement au sens de WordPress) le "parent" des autres. Par exemple, disons que j'ai un type de publication personnalisé appelé "livre" et un autre appelé "caractère", et que je souhaite avoir la structure d'URL personnalisée suivante:

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

Ainsi, l'URL canonique de l'article sur le caractère Thing One du livre The Cat In the Hat serait:

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

Un personnage est associé à un livre avec une rangée de méta.

J'ai créé des réécritures personnalisées pour que cela fonctionne ...

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

... mais je devrais aussi m'assurer que la "publication de personnage" dans l'URL appartient au "livre" ...

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

Cela ne peut pas se produire automatiquement: je dois me connecter à un filtre ou à une action pour vérifier si le personnage correspond au livre, sinon, rediriger vers la bonne URL canonique ou forcer une 404.

Où est le meilleur endroit pour effectuer cette vérification? Mes choix (jusqu'à présent) sont:

  • Le filtre request - c’est-à-dire une vérification avant l’instanciation de la requête principale.
  • Les différents filtres WP_Query - c’est-à-dire que WP_Query effectue la vérification pour moi en ajoutant une contrainte post-méta.

Je sais que c’est une question plutôt ouverte et probablement une question de goût, mais toute idée de la manière la plus efficace de faire des choses avec du code et des bases de données serait appréciée. Merci.

4
Chris Carson

J'ai abordé le type de poste subordonné avec une veine similaire mais je n'étais pas aussi strict sur l'aspect canonique de l'URL; Cependant, je me suis retrouvé dans une situation similaire avec le type de produit personnalisé WooCommerce deeplinking/ links.

J'ai utilisé le crochet template_redirect pour pousser un 404 s'il ne correspondait pas à la route et le post_type_link pour garantir que la balise méta du lien canonique et que toutes les références the_permalink() et get_permalink() correspondaient au lien souhaité.

Un extrait de la façon dont je recommanderais de gérer ceci:

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?

    }
}

Modifié à partir de source

1
codearachnid