Olá @daxitude:
Deixe-me primeiro sugerir que você reconsidere. Se você não possui páginas de perguntas frequentes individuais para cada pergunta frequente:
Você reduz sua superfície para otimizar o mecanismo de pesquisa e reduz o tráfego potencial que pode receber, e
Você impossibilita que alguém compartilhe uma FAQ específica com um amigo por e-mail e / ou compartilhe com sua rede no Facebook, Twitter etc. (Como usuário, eu sempre fico frustrado com os desenvolvedores de sites que não permitem que eu tenha um URL direto para um item e forçar-me a vincular à página que lista todos os itens.)
No entanto, se você ainda deseja fazer isso, faça duas coisas:
1.) Use o 'post_type_link'
gancho
Use o 'post_type_link'
gancho para modificar o URL como no exemplo a seguir * (suponho que seu tipo de postagem personalizado seja 'faq'
). Adicione o seguinte ao functions.php
arquivo do seu 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'])
Este é um hack , mas é necessário para fazer o que você deseja. Use um 'init'
gancho para unset($wp_rewrite->extra_permastructs['faq'])
. Ele remove a regra de reescrita que é register_post_type()
adicionada. Estou incluindo uma chamada para register_post_type()
que eu possa fornecer um exemplo completo para você e outras pessoas:
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!
}
É sobre isso.
É claro que o uso acima de $wp_rewrite->flush_rules()
em um 'init'
gancho é uma prática muito ruim e só deve ser feita uma vez, então eu implementei um plug-in completo e independente chamado FAQ_Post_Type
para fazer o certo. Este plug-in adiciona um tipo de postagem FAQ com as regras de URL que você deseja e usa a register_activation_hook()
para liberar as regras de reescrita; a ativação é obviamente uma das poucas coisas que requer código de plug-in em vez de código que pode ser executado no functions.php
arquivo de um tema .
Aqui está o código para o FAQ_Post_Type
plugin; sinta-se à vontade para modificar para suas necessidades:
<?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'));
}
Você também pode manter as regras de liberação dentro 'init'
de uma verificação de um valor de opção, se preferir:
// 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);
}
Sua escolha.
De qualquer forma, deixe-me saber se há casos de uso que você descobrir que isso não soluciona.
<title>
e<h1>Heading</h1>
você receberá apenas uma delas em uma página de arquivo, mas cada uma para as páginas individuais das Perguntas frequentes. Concordo que todo o conteúdo das perguntas frequentes é o melhor na página de arquivo, mas você pode fornecer todo o conteúdo da página principal e uma página detalhada para aqueles que o desejam (que inclui mecanismos de pesquisa) , e certamente não prejudica nada; basta adicionar um "link permanente" próximo à pergunta da FAQ.unset($wp_rewrite->extra_permastructs['faq'])
" que, é claro, estou argumentando que você não usa. :)