Salut @daxitude:
Permettez-moi d'abord de vous suggérer de reconsidérer. Si vous n'avez pas de pages de FAQ individuelles pour chaque FAQ:
Vous réduisez votre surface pour l'optimisation des moteurs de recherche et réduisez le trafic potentiel que vous pourriez obtenir, et
Vous empêchez quelqu'un de partager une FAQ spécifique avec un ami par e-mail et / ou de partager avec son réseau sur Facebook, Twitter, etc. (En tant qu'utilisateur, je suis toujours frustré par les développeurs de sites qui me refusent d'avoir une URL directe à un élément et à la place me forcer à créer un lien vers la page qui répertorie tous les éléments.)
Cependant, si vous voulez toujours le faire, faites deux choses:
1.) Utilisez le 'post_type_link'
crochet
Utilisez le 'post_type_link'
crochet pour modifier l'URL comme dans l'exemple suivant * (je suppose que votre type de publication personnalisé est 'faq'
). Ajoutez ce qui suit au functions.php
fichier de votre thème :
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'])
C'est un hack , mais c'est un hack obligatoire pour faire ce que vous voulez. Utilisez un 'init'
crochet pour unset($wp_rewrite->extra_permastructs['faq'])
. Il supprime la règle de réécriture qui register_post_type()
ajoute. J'inclus un appel à register_post_type()
afin que je puisse fournir un exemple complet pour vous et les autres:
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!
}
C'est à peu près ça.
Bien sûr, l'utilisation ci-dessus de $wp_rewrite->flush_rules()
dans un 'init'
hook est vraiment une mauvaise pratique et ne devrait être effectuée qu'une seule fois, j'ai donc implémenté un plugin complet et autonome appelé FAQ_Post_Type
pour le faire correctement. Ce plugin ajoute un type de publication FAQ avec les règles d'URL que vous souhaitez et il utilise un register_activation_hook()
pour vider les règles de réécriture; l'activation étant évidemment l'une des rares choses qui nécessitent du code de plugin au lieu du code qui peut s'exécuter dans le functions.php
fichier d' un thème .
Voici le code du FAQ_Post_Type
plugin; n'hésitez pas à modifier selon vos besoins:
<?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'));
}
Vous pouvez également conserver les règles de vidage à l'intérieur du 'init'
en utilisant une vérification pour une valeur d'option si vous préférez ceci:
// 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);
}
Votre choix.
Quoi qu'il en soit, faites-moi savoir s'il existe des cas d'utilisation, vous découvrez que cela ne résout pas.
<title>
et<h1>Heading</h1>
vous n'en obtiendrez qu'un seul sur une page d'archive, mais vous en avez un chacun pour les pages de FAQ individuelles. Je suis d'accord que tout le contenu de la FAQ est le meilleur sur la page d'archive, mais vous pouvez fournir tout le contenu sur la page principale et une page d' exploration pour ceux qui le souhaitent (qui inclut les moteurs de recherche) , et cela ne fait certainement rien de mal; ajoutez simplement un "Permalien" près de la question FAQ.unset($wp_rewrite->extra_permastructs['faq'])
" que, bien sûr, je soutiens que vous n'utilisez pas. :)