Привет @daxitude:
Позвольте мне сначала предложить вам пересмотреть. Если у вас нет отдельных страниц FAQ для каждого FAQ:
Вы уменьшаете свою поверхность для поисковой оптимизации и уменьшаете потенциальный трафик, который вы можете получить, и
Вы лишаете кого-либо возможности делиться определенными часто задаваемыми вопросами с друзьями по электронной почте и / или делиться ими со своей сетью в Facebook, Twitter и т. Д. (Как пользователь, я всегда разочарован разработчиками сайтов, которые запрещают мне иметь прямой URL-адрес к элементу и вместо этого вынудите меня дать ссылку на страницу со списком всех элементов.)
Однако, если вы все еще хотите сделать это, сделайте две вещи:
1.) Используйте 'post_type_link'
крючок
Используйте 'post_type_link'
хук, чтобы изменить URL, как в следующем примере * (я предполагаю, что ваш пользовательский тип записи 'faq'
). Добавьте следующее в functions.php
файл вашей темы :
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'])
Это взлом , но это обязательный взлом, чтобы делать то, что вы хотите. Используйте 'init'
крючок для unset($wp_rewrite->extra_permastructs['faq'])
. Это удаляет правило перезаписи, которое register_post_type()
добавляет. Я включаю вызов, register_post_type()
чтобы я мог предоставить полный пример для вас и других:
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!
}
Вот и все.
Конечно, приведенное выше использование $wp_rewrite->flush_rules()
в 'init'
хуке - это действительно плохая практика, и его нужно делать только один раз, поэтому я реализовал полный и автономный плагин, призванный FAQ_Post_Type
сделать это правильно. Этот плагин добавляет тип поста FAQ с нужными вам правилами URL и использует a register_activation_hook()
для очистки правил перезаписи; очевидно, что активация - это одна из немногих вещей, для которой требуется код плагина вместо кода, который может выполняться в functions.php
файле темы .
Вот код для FAQ_Post_Type
плагина; не стесняйтесь изменять для ваших требований:
<?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'));
}
Вы также можете сохранить правила сброса внутри 'init'
, используя проверку значения параметра, если вы предпочитаете это:
// 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);
}
Твой выбор.
В любом случае, дайте мне знать, если есть варианты использования, которые вы обнаружите, что это не относится.