Erzwingen kanonischer URLs mit mehreren benutzerdefinierten Post-Typen

Ich arbeite an einem Projekt mit mehreren benutzerdefinierten Post-Typen, wobei einer der Post-Typen natürlich (aber nicht wirklich im WordPress-Sinne) der “Eltern” der anderen ist. Angenommen, ich habe einen benutzerdefinierten Posttyp namens “book” und einen anderen namens “character” und sage, dass ich die folgende benutzerdefinierte URL-Struktur haben möchte:

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

Somit wäre die kanonische URL für den Beitrag über den Charakter Thing One in dem Buch The Cat In the Hat:

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

Ein Zeichen ist mit einem Buch mit einer Post-Meta-Zeile verknüpft.

Ich habe benutzerdefinierte Umschreibungen erstellt, damit es funktioniert …

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

… aber ich muss auch sicherstellen, dass der ‘Charakter-Beitrag’ in der URL zum ‘Buch’ gehört …

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

Dies kann nicht automatisch passieren: Ich muss in einen Filter oder eine Aktion einhaken, um zu prüfen, ob das Zeichen dem Buch entspricht, und wenn nicht, entweder auf die korrekte, kanonische URL redirect oder 404 erzwingen.

Wo ist der beste Ort, um diesen Check durchzuführen? Meine Auswahl (soweit) sind:

  • Der request – dh die Überprüfung vor der Hauptabfrage wird instanziiert.
  • Die verschiedenen WP_Query-Filter – dh machen WP_Query die Überprüfung für mich durch Hinzufügen einer Post-Meta-Einschränkung.

Ich weiß, dass dies eher eine offene Frage und wahrscheinlich eine Frage des Geschmacks ist, aber jede Einsicht in die meisten Code und database effiziente Art und Weise, Dinge zu tun wäre geschätzt. Vielen Dank.

Solutions Collecting From Web of "Erzwingen kanonischer URLs mit mehreren benutzerdefinierten Post-Typen"

Ich ging mit ähnlichen Adern an untergeordnete Beitragstypen heran, war aber im kanonischen URL-Aspekt nicht so streng; Allerdings stieß ich auf eine ähnliche Situation mit Deeplinking benutzerdefinierte WooCommerce Produkttyp Links.

Ich nutzte den template_redirect Hook, um ein 404 zu pushen, wenn es nicht mit der Route und dem post_type_link , um post_type_link , dass das Meta-Tag für den kanonischen Link und alle the_permalink() und get_permalink() dem beabsichtigten Link entsprachen.

Ein Tipp von der Art, wie ich das empfehlen würde:

 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? } } 

Geändert von der Quelle