Angepasster Post-Typ, keine Notwendigkeit für eine einzelne Ansicht, plus Permalink-Umschreibungen, die einen Hash in URI enthalten

Wir verwenden CPTs, um eine Seite mit häufig gestellten Fragen auf einer Website zu verwalten, wobei die Frage der Posttitel und die Antwort der Postinhalt ist. Es gibt eine Hauptseite für die FAQs, die alle Beiträge anzeigt (FAQ Archivseite). Mit dieser Struktur brauchen wir wirklich keine einzelne Ansicht für irgendwelche FAQ und möchten sie tatsächlich von der Seitenstruktur weglassen. Um Permalinks zu adressieren, möchten wir sie als etwas wie example.com/faq/#uniqueIdentifier definieren und denken, dass wir den #uniqueIdentifier verwenden werden, um ein div auf der Archivseite mit der Antwort zu finden und in einigen darauf aufmerksam zu machen Mode. Der uniqueIdentifier könnte eine Post-ID, ein FAQ-Titel, Daten aus einer Meta-Box oder etwas anderes sein.

Also lassen Sie mich wiederholen, was ich brauche, um zu erreichen:

(1) schreibe die faq-Permalinks in / faq / # etwas um, und

(2) Stellen Sie sicher, dass alle / faq / -Links zur Archivierungsvorlage routen und nicht einzeln

Ich bin meistens ein Noob, aber ziemlich gut darin, mich durch Dinge zu fummeln. Ich habe noch nie versucht, etwas neu zu schreiben, würde aber eine bestimmte Richtung dafür schätzen.

Vielen Dank.

Solutions Collecting From Web of "Angepasster Post-Typ, keine Notwendigkeit für eine einzelne Ansicht, plus Permalink-Umschreibungen, die einen Hash in URI enthalten"

Hallo @daxitude:

Lassen Sie mich zuerst vorschlagen, dass Sie es noch einmal überdenken. Wenn Sie keine individuellen FAQ-Seiten für jede FAQ haben:

  1. Sie reduzieren Ihre Oberfläche für die Suchmaschinenoptimierung und reduzieren den potenziellen Traffic, den Sie möglicherweise bekommen, und

  2. Sie machen es jemandem unmöglich, eine spezielle FAQ mit einem Freund über E-Mail zu teilen und / oder mit seinem Netzwerk auf Facebook, Twitter usw. zu teilen. (Als Benutzer frustriert mich immer der Site-Entwickler, der mir eine direkte URL verweigert) zu einem Artikel und zwinge mich stattdessen, auf die Seite zu verlinken, die alle Artikel auflistet.)

Wenn Sie dies dennoch tun möchten, tun Sie zwei Dinge:

1.) Benutze den 'post_type_link' Haken

Verwenden Sie den Hook 'post_type_link' , um die URL wie im folgenden Beispiel zu ändern * (Ich 'post_type_link' dass Ihr benutzerdefinierter 'post_type_link' 'faq' ). Fügen Sie der Datei functions.php Ihres Themes Folgendes hinzu:

 add_action('post_type_link','yoursite_post_type_link',10,2); function yoursite_post_type_link($link,$post) { $post_type = 'faq'; if ($post->post_type==$post_type) { $link = get_post_type_archive_link($post_type) ."#{$post->post_name}"; } return $link; } 

2.) unset($wp_rewrite->extra_permastructs['faq'])

Dies ist ein Hack , aber es ist ein notwendiger Hack, um zu tun, was Sie wollen. Verwenden Sie einen 'init' Hook, um die unset($wp_rewrite->extra_permastructs['faq']) . Es entfernt die Rewrite-Regel, die register_post_type() hinzufügt. Ich nehme einen Anruf bei register_post_type() damit ich ein vollständiges Beispiel für Sie und andere bereitstellen kann:

 add_action('init','yoursite_init'); function yoursite_init() { register_post_type('faq',array( 'labels' => array( 'name' => _x('FAQs', 'post type general name'), 'singular_name' => _x('FAQ', 'post type singular name'), 'add_new' => _x('Add New', 'faq'), 'add_new_item' => __('Add New FAQ'), 'edit_item' => __('Edit FAQ'), 'new_item' => __('New FAQ'), 'view_item' => __('View FAQ'), 'search_items' => __('Search FAQs'), 'not_found' => __('No FAQs found'), 'not_found_in_trash' => __('No FAQs found in Trash'), 'parent_item_colon' => '', 'menu_name' => 'FAQs' ), 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => array('slug'=>'faqs'), 'capability_type' => 'post', 'has_archive' => 'faqs', 'hierarchical' => false, 'supports' => array('title','editor','author','thumbnail','excerpt') )); global $wp_rewrite; unset($wp_rewrite->extra_permastructs['faq']); // Removed URL rewrite for specific FAQ $wp_rewrite->flush_rules(); // THIS SHOULD BE DONE IN A PLUGIN ACTIVATION HOOK, NOT HERE! } 

Das ist alles.

Natürlich ist die obige Verwendung von $wp_rewrite->flush_rules() in einem 'init' Hook wirklich eine schlechte Übung und sollte eigentlich nur einmal gemacht werden, also habe ich ein komplettes und eigenständiges Plugin namens FAQ_Post_Type , um es richtig zu machen. Dieses Plugin fügt einen FAQ-Post-Typ mit den gewünschten URL-Regeln hinzu und verwendet eine register_activation_hook() , um die Rewrite-Regeln zu register_activation_hook() ; Aktivierung ist offensichtlich eines der wenigen Dinge, die Plugin-Code anstelle von Code benötigt, der in der functions.php Datei eines Themes ausgeführt functions.php kann.

Hier ist der Code für das FAQ_Post_Type Plugin; Fühlen Sie sich frei, für Ihre Anforderungen zu modifizieren:

 < ?php /* Plugin Name: FAQ Post Type Description: Answers the question "Custom post type, no need for single view, plus want permalink rewrites that include hash in URI" on WordPress Answers. Plugin URL: http://wordpress.stackexchange.com/questions/12762/custom-post-type-no-need-for-single-view-plus-want-permalink-rewrites-that-incl */ if (!class_exists('FAQ_Post_Type')) { class FAQ_Post_Type { static function on_load() { add_action('post_type_link', array(__CLASS__,'post_type_link'),10,2); add_action('init', array(__CLASS__,'init')); } static function post_type_link($link,$post) { if ('faq'==$post->post_type) { $link = get_post_type_archive_link('faq') ."#{$post->post_name}"; } return $link; } static function init() { register_post_type('faq',array( 'labels' => array( 'name' => _x('FAQs', 'post type general name'), 'singular_name' => _x('FAQ', 'post type singular name'), 'add_new' => _x('Add New', 'faq'), 'add_new_item' => __('Add New FAQ'), 'edit_item' => __('Edit FAQ'), 'new_item' => __('New FAQ'), 'view_item' => __('View FAQ'), 'search_items' => __('Search FAQs'), 'not_found' => __('No FAQs found'), 'not_found_in_trash' => __('No FAQs found in Trash'), 'parent_item_colon' => '', 'menu_name' => 'FAQs' ), 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => array('slug'=>'faqs'), 'capability_type' => 'post', 'has_archive' => 'faqs', 'hierarchical' => false, 'supports' => array('title','editor','author','thumbnail','excerpt'), )); global $wp_rewrite; unset($wp_rewrite->extra_permastructs['faq']); // Remove URL rewrite for specific FAQ } static function activate() { global $wp_rewrite; $wp_rewrite->flush_rules(); } } FAQ_Post_Type::on_load(); register_activation_hook(__FILE__,array('FAQ_Post_Type','activate')); } 

Sie könnten auch die Flush-Regeln innerhalb der 'init' behalten 'init' indem Sie eine Prüfung für einen Optionswert verwenden, wenn Sie dies bevorzugen:

 // Add this code in your 'init' hook at your register_post_type('faq',...) if (!get_option('faq_rewrite_rules_updated')) { global $wp_rewrite; unset($wp_rewrite->extra_permastructs['faq']); // Remove URL rewrite for specific FAQ $wp_rewrite->flush_rules(); update_option('faq_rewrite_rules_updated',true); } 

Deine Entscheidung.

Wie auch immer, lassen Sie mich wissen, wenn es Use-Cases gibt, die Sie nicht adressieren.