Xin chào @daxitude:
Hãy để tôi đầu tiên đề nghị bạn xem xét lại. Nếu bạn không có các trang Câu hỏi thường gặp riêng cho mỗi Câu hỏi thường gặp:
Bạn giảm bề mặt của mình để tối ưu hóa công cụ tìm kiếm và giảm lưu lượng tiềm năng mà bạn có thể nhận được
Bạn khiến ai đó không thể chia sẻ Câu hỏi thường gặp cụ thể với bạn bè qua email và / hoặc chia sẻ với mạng của họ trên Facebook, Twitter, v.v. (Là người dùng, tôi luôn cảm thấy thất vọng bởi các nhà phát triển trang web không cho phép tôi có URL trực tiếp đến một mục và thay vào đó buộc tôi phải liên kết đến trang liệt kê tất cả các mục.)
Tuy nhiên, nếu bạn vẫn muốn làm như vậy thì hãy làm hai điều:
1.) Sử dụng 'post_type_link'
móc
Sử dụng 'post_type_link'
hook để sửa đổi URL như trong ví dụ sau * (Tôi giả sử loại bài đăng tùy chỉnh của bạn là 'faq'
). Thêm phần sau vào functions.php
tệp của chủ đề của bạn :
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'])
Đây là một hack , nhưng nó là một hack bắt buộc để làm những gì bạn muốn. Sử dụng một 'init'
cái móc để unset($wp_rewrite->extra_permastructs['faq'])
. Nó loại bỏ quy tắc viết lại mà register_post_type()
thêm. Tôi đang bao gồm một cuộc gọi đến register_post_type()
để tôi có thể cung cấp một ví dụ hoàn chỉnh cho cả bạn và những người khác:
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!
}
Đó là về nó.
Tất nhiên, việc sử dụng $wp_rewrite->flush_rules()
trong 'init'
hook ở trên là một thực tế tồi tệ và thực sự chỉ nên được thực hiện một lần vì vậy tôi đã triển khai một plugin hoàn chỉnh và khép kín được gọi FAQ_Post_Type
để thực hiện đúng. Plugin này thêm một loại bài đăng FAQ với các quy tắc URL mà bạn muốn và nó sử dụng một register_activation_hook()
để xóa các quy tắc viết lại; kích hoạt rõ ràng là một trong số ít những thứ yêu cầu mã plugin thay vì mã có thể chạy trong functions.php
tệp của một chủ đề .
Đây là mã cho FAQ_Post_Type
plugin; vui lòng sửa đổi cho các yêu cầu của bạn:
<?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'));
}
Bạn cũng có thể giữ các quy tắc tuôn ra bên trong 'init'
bằng cách sử dụng kiểm tra giá trị tùy chọn nếu bạn thích điều này:
// 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);
}
Lựa chọn của bạn.
Dù sao, hãy cho tôi biết nếu có trường hợp sử dụng mà bạn phát hiện ra rằng điều này không giải quyết.