Ciao @daxitude:
Vorrei prima suggerirti di riconsiderare. Se non hai singole pagine FAQ per ogni FAQ:
Riduci la superficie per l'ottimizzazione dei motori di ricerca e riduci il potenziale traffico che potresti ottenere e
Rendi impossibile per qualcuno condividere una FAQ specifica con un amico via e-mail e / o condividere con la propria rete su Facebook, Twitter, ecc. (Come utente sono sempre frustrato dagli sviluppatori del sito che non mi permettono di avere un URL diretto a un elemento e invece forzami a collegarmi alla pagina che elenca tutti gli elementi.)
Tuttavia, se vuoi ancora farlo, fai due cose:
1.) Utilizzare il 'post_type_link'
gancio
Utilizza l' 'post_type_link'
hook per modificare l'URL come nell'esempio seguente * (suppongo che il tuo tipo di post personalizzato sia 'faq'
). Aggiungi quanto segue al functions.php
file del tuo tema :
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'])
Questo è un trucco , ma è un trucco necessario per fare quello che vuoi. Usa un 'init'
gancio per unset($wp_rewrite->extra_permastructs['faq'])
. Rimuove la regola di riscrittura che register_post_type()
aggiunge. Sto includendo una chiamata per register_post_type()
poter fornire un esempio completo sia per te che per gli altri:
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!
}
Questo è tutto.
Ovviamente l'uso sopra di $wp_rewrite->flush_rules()
in un 'init'
hook è davvero una cattiva pratica e dovrebbe davvero essere fatto solo una volta, quindi ho implementato un plugin completo e autonomo chiamato FAQ_Post_Type
per farlo bene. Questo plug-in aggiunge un tipo di post FAQ con le regole URL desiderate e utilizza a register_activation_hook()
per svuotare le regole di riscrittura; l'attivazione è ovviamente una delle poche cose che richiede il codice plugin anziché il codice che può essere eseguito nel functions.php
file di un tema .
Ecco il codice per il FAQ_Post_Type
plugin; sentiti libero di modificare per le tue esigenze:
<?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'));
}
Puoi anche mantenere le regole di flush all'interno 'init'
di usando un controllo per un valore di opzione se preferisci questo:
// 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);
}
La tua scelta.
Comunque, fammi sapere se ci sono casi d'uso che scopri che questo non risolve.