Hai @ jarak:
Pertama-tama saya sarankan Anda mempertimbangkan kembali. Jika Anda tidak memiliki halaman FAQ individu untuk setiap FAQ:
Anda mengurangi permukaan Anda untuk optimasi mesin pencari dan mengurangi potensi lalu lintas yang mungkin Anda dapatkan, dan
Anda membuat seseorang tidak mungkin membagikan FAQ tertentu dengan teman melalui email dan / atau berbagi dengan jaringan mereka di Facebook, Twitter, dll. (Sebagai pengguna saya selalu frustrasi oleh pengembang situs yang melarang saya memiliki URL langsung ke suatu item dan sebaliknya memaksa saya untuk menautkan ke halaman yang mencantumkan semua item.)
Namun, jika Anda masih ingin melakukannya maka lakukan dua hal:
1.) Gunakan 'post_type_link'
kaitnya
Gunakan 'post_type_link'
kait untuk memodifikasi URL seperti pada contoh berikut * (Saya berasumsi tipe posting khusus Anda adalah 'faq'
). Tambahkan berikut ini ke functions.php
file tema Anda :
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'])
Ini adalah peretasan , tetapi peretasan yang diperlukan untuk melakukan apa yang Anda inginkan. Gunakan 'init'
kait untuk unset($wp_rewrite->extra_permastructs['faq'])
. Ini menghapus aturan penulisan ulang yang register_post_type()
menambahkan. Saya menyertakan panggilan register_post_type()
agar saya dapat memberikan contoh lengkap untuk Anda dan orang lain:
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!
}
Itu saja.
Tentu saja penggunaan di atas $wp_rewrite->flush_rules()
dalam sebuah 'init'
hook adalah praktik yang benar - benar buruk dan seharusnya hanya dilakukan sekali jadi saya telah mengimplementasikan plugin lengkap dan mandiri yang dipanggil FAQ_Post_Type
untuk melakukannya dengan benar. Plugin ini menambahkan jenis posting FAQ dengan aturan URL yang Anda inginkan dan menggunakan a register_activation_hook()
untuk menyiram aturan penulisan ulang; Aktivasi jelas merupakan salah satu dari beberapa hal yang memerlukan kode plugin alih-alih kode yang dapat dijalankan dalam functions.php
file tema .
Berikut kode untuk FAQ_Post_Type
plugin; jangan ragu untuk memodifikasi untuk kebutuhan Anda:
<?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'));
}
Anda juga bisa menyimpan aturan flush di dalam 'init'
dengan menggunakan tanda centang untuk nilai opsi jika Anda menginginkannya:
// 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);
}
Pilihanmu.
Ngomong-ngomong, beri tahu saya jika ada kasus penggunaan Anda menemukan bahwa ini tidak mengatasi.