Hallo @daxitude:
Lassen Sie mich zunächst vorschlagen, dass Sie es sich noch einmal überlegen. Wenn Sie nicht für jede FAQ eine eigene FAQ-Seite haben:
Sie reduzieren Ihre Oberfläche für die Suchmaschinenoptimierung und reduzieren den potenziellen Verkehr, den Sie möglicherweise erhalten, und
Sie machen es jemandem unmöglich, eine bestimmte FAQ per E-Mail mit einem Freund zu teilen und / oder mit seinem Netzwerk auf Facebook, Twitter usw. zu teilen. (Als Benutzer bin ich immer frustriert von Website-Entwicklern, die mir keine direkte URL erlauben zu einem Artikel und zwinge mich stattdessen, auf die Seite zu verlinken, auf der alle Artikel aufgelistet sind.)
Wenn Sie dies dennoch tun möchten, gehen Sie wie folgt vor:
1.) Verwenden Sie den 'post_type_link'
Haken
Verwenden Sie den 'post_type_link'
Hook, um die URL wie im folgenden Beispiel * zu ändern (ich gehe davon aus, dass Ihr benutzerdefinierter Beitragstyp lautet 'faq'
). Fügen Sie der functions.php
Datei Ihres Themas 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 erforderlicher Hack, um das zu tun, was Sie wollen. Verwenden Sie einen 'init'
Haken, um unset($wp_rewrite->extra_permastructs['faq'])
. Es entfernt die Umschreiberegel, die register_post_type()
hinzugefügt wird. Ich füge einen Anruf hinzu, register_post_type()
damit ich Ihnen und anderen ein vollständiges Beispiel geben 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 $wp_rewrite->flush_rules()
in einem 'init'
Hook eine wirklich schlechte Praxis und sollte wirklich nur einmal durchgeführt werden, also habe ich ein vollständiges und in sich geschlossenes Plugin implementiert, das aufgerufen wird FAQ_Post_Type
, es richtig zu machen. Dieses Plugin fügt einen FAQ-Beitragstyp mit den gewünschten URL-Regeln hinzu und verwendet a register_activation_hook()
, um die Umschreiberegeln zu leeren. Die Aktivierung ist offensichtlich eines der wenigen Dinge, die Plugin-Code anstelle von Code erfordern, der in der functions.php
Datei eines Themas ausgeführt werden kann.
Hier ist der Code für das FAQ_Post_Type
Plugin. Fühlen Sie sich frei, für Ihre Anforderungen zu ändern:
<?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önnen die Flush-Regeln möglicherweise auch innerhalb 'init'
von beibehalten, indem Sie einen Optionswert prüfen, 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 Anwendungsfälle gibt, bei denen Sie feststellen, dass dies nicht der Fall ist.