โพสต์ที่กำหนดเองประเภทเดียว - {กำหนดเอง} .php ไม่ทำงาน


18

ฉันสร้างประเภทโพสต์ที่กำหนดเองโดยใช้ชื่อเครื่อง special_media_post และ wordpress นั้นไม่เห็น single-special_media_post.php ฉันกำลังแพ้อย่างสมบูรณ์ มันทำให้การเริ่มต้นเพื่อ index.php

นี่คือรหัสของฉันสำหรับประเภทโพสต์ที่กำหนดเองและ taxonomies:

//Post and Taxonomy stuff
//Register Custom Post Type
function special_media_post() {
$labels = array(
    'name'                => _x( 'Media Posts', 'Post Type General Name', 'text_domain' ),
    'singular_name'       => _x( 'Media Post', 'Post Type Singular Name', 'text_domain' ),
    'menu_name'           => __( 'Media Post', 'text_domain' ),
    'parent_item_colon'   => __( 'Media Post:', 'text_domain' ),
    'all_items'           => __( 'All Media Posts', 'text_domain' ),
    'view_item'           => __( 'View Media Post', 'text_domain' ),
    'add_new_item'        => __( 'Add New Media Post', 'text_domain' ),
    'add_new'             => __( 'New Media Post', 'text_domain' ),
    'edit_item'           => __( 'Edit Media Post', 'text_domain' ),
    'update_item'         => __( 'Update Media Post', 'text_domain' ),
    'search_items'        => __( 'Search Media Posts', 'text_domain' ),
    'not_found'           => __( 'No media posts found', 'text_domain' ),
    'not_found_in_trash'  => __( 'No media posts found in Trash', 'text_domain' ),
);

$rewrite = array(
    'slug'                => 'mediapost',
    'with_front'          => true,
    'pages'               => true,
    'feeds'               => true,
);

$args = array(
    'label'               => __( 'mediapost', 'text_domain' ),
    'description'         => __( 'Post Type for Media', 'text_domain' ),
    'labels'              => $labels,
    'supports'            => array( 'title', 'editor', 'custom-fields', ),
    'taxonomies'          => array( 'year', 'type' ),
    'hierarchical'        => false,
    'public'              => true,
    'show_ui'             => true,
    'show_in_menu'        => true,
    'show_in_nav_menus'   => true,
    'show_in_admin_bar'   => true,
    'menu_position'       => 5,
    'can_export'          => true,
    'has_archive'         => true,
    'exclude_from_search' => false,
    'publicly_queryable'  => true,
    'query_var'           => 'mediapost',
    'rewrite'             => $rewrite,
    'capability_type'     => 'page',
);

register_post_type( 'special_media_post', $args );
}

// Register Custom Taxonomy
function media_year()  {
$labels = array(
    'name'                       => _x( 'Years', 'Taxonomy General Name', 'text_domain' ),
    'singular_name'              => _x( 'Year', 'Taxonomy Singular Name', 'text_domain' ),
    'menu_name'                  => __( 'Year', 'text_domain' ),
    'all_items'                  => __( 'All Years', 'text_domain' ),
    'parent_item'                => __( 'Parent Year', 'text_domain' ),
    'parent_item_colon'          => __( 'Parent Year:', 'text_domain' ),
    'new_item_name'              => __( 'New Year Name', 'text_domain' ),
    'add_new_item'               => __( 'Add New Year', 'text_domain' ),
    'edit_item'                  => __( 'Edit Year', 'text_domain' ),
    'update_item'                => __( 'Update Year', 'text_domain' ),
    'separate_items_with_commas' => __( 'Separate years with commas', 'text_domain' ),
    'search_items'               => __( 'Search years', 'text_domain' ),
    'add_or_remove_items'        => __( 'Add or remove years', 'text_domain' ),
    'choose_from_most_used'      => __( 'Choose from the most used yearss', 'text_domain' ),
);

$rewrite = array(
    'slug'                       => 'year',
    'with_front'                 => true,
    'hierarchical'               => true,
);

$capabilities = array(
    'manage_terms'               => 'manage_categories',
    'edit_terms'                 => 'manage_categories',
    'delete_terms'               => 'manage_categories',
    'assign_terms'               => 'edit_posts',
);

$args = array(
    'labels'                     => $labels,
    'hierarchical'               => true,
    'public'                     => true,
    'show_ui'                    => true,
    'show_admin_column'          => true,
    'show_in_nav_menus'          => true,
    'show_tagcloud'              => true,
    'query_var'                  => 'year',
    'rewrite'                    => $rewrite,
    'capabilities'               => $capabilities,
);

register_taxonomy( 'year', 'special_media_post', $args );
}

// Register Custom Taxonomy
function media_type()  {
$labels = array(
    'name'                       => _x( 'Types', 'Taxonomy General Name', 'text_domain' ),
    'singular_name'              => _x( 'Type', 'Taxonomy Singular Name', 'text_domain' ),
    'menu_name'                  => __( 'Type', 'text_domain' ),
    'all_items'                  => __( 'All Types', 'text_domain' ),
    'parent_item'                => __( 'Parent Type', 'text_domain' ),
    'parent_item_colon'          => __( 'Parent Type:', 'text_domain' ),
    'new_item_name'              => __( 'New Type Name', 'text_domain' ),
    'add_new_item'               => __( 'Add New Type', 'text_domain' ),
    'edit_item'                  => __( 'Edit Type', 'text_domain' ),
    'update_item'                => __( 'Update Type', 'text_domain' ),
    'separate_items_with_commas' => __( 'Separate types with commas', 'text_domain' ),
    'search_items'               => __( 'Search types', 'text_domain' ),
    'add_or_remove_items'        => __( 'Add or remove types', 'text_domain' ),
    'choose_from_most_used'      => __( 'Choose from the most used types', 'text_domain' ),
);

$rewrite = array(
    'slug'                       => 'type',
    'with_front'                 => true,
    'hierarchical'               => true,
);

$capabilities = array(
    'manage_terms'               => 'manage_categories',
    'edit_terms'                 => 'manage_categories',
    'delete_terms'               => 'manage_categories',
    'assign_terms'               => 'edit_posts',
);

$args = array(
    'labels'                     => $labels,
    'hierarchical'               => true,
    'public'                     => true,
    'show_ui'                    => true,
    'show_admin_column'          => true,
    'show_in_nav_menus'          => true,
    'show_tagcloud'              => true,
    'query_var'                  => 'media_type',
    'rewrite'                    => $rewrite,
    'capabilities'               => $capabilities,
);

register_taxonomy( 'type', 'special_media_post', $args );
}

// Hook into the 'init' action
add_action( 'init', 'special_media_post', 0 );

// Hook into the 'init' action
add_action( 'init', 'media_year', 0 );

// Hook into the 'init' action
add_action( 'init', 'media_type', 0 );

หากมีสิ่งอื่นที่คุณต้องการเห็นฉันสามารถวางมันได้ แต่มันก็ไม่เห็นด้วยซ้ำถ้าฉันใส่ echo 'Hello World' ในนั้น ดังนั้นจึงไม่เห็นเพียง single-special_media_post.php หรือ archive-special_media_post.php

คำตอบ:


57

ไปที่หน้าลิงก์ (ซึ่งจะล้างข้อมูล) และตรวจสอบอีกครั้ง WordPress อาจต้องถูกสะกิดให้จดจำการเพิ่มลำดับชั้นของคุณ


2
ว้าว! ทำงานเหมือนมีเสน่ห์เสียเวลา 1 ชั่วโมง :(
Mohammed Sufian

5

เปลี่ยนรหัส

จาก:

 'has_archive'         => true,

ถึง :

 'has_archive'         => false,

จากนั้นไปที่หน้า Permalink เปลี่ยนเป็นค่าเริ่มต้นและกลับไปที่ "Permalink"

% postname% /

ตอนนี้มันควรจะทำงาน

เหตุผลที่ไม่ไปหน้าเดียว - {custom_post_type} .php เป็นเพราะ has_archive เมื่อ has_archive ตั้งค่าเป็นจริงมันจะมองหาไฟล์เก็บถาวร - {custom_post_type} .php แทนที่จะเป็นหน้าเดียว

หวังว่ามันจะใช้ได้


1
ฉันไม่แน่ใจว่าเป็นเรื่องจริง มุมมองโพสต์เดียวคือมุมมองโพสต์เดียวไม่ว่าชนิดโพสต์รองรับมุมมองดัชนีที่เก็บถาวรหรือไม่
Chip Bennett

วิธีการแก้ปัญหาที่ฉันโพสต์นี้เป็นวิธีที่ฉันแก้ไขปัญหาของฉันในรูปแบบการพัฒนาตนเองของฉัน เมื่อหน้าประเภทโพสต์เดียวของฉันตอนนี้จะแสดงสิ่งที่ฉันต้องการที่จะเห็น
Wesley Cheung

3
เป็นไปได้ว่าการแก้ไขไม่สามารถรีเซ็ตโครงสร้างลิงก์ถาวรซึ่งจะเป็นการล้างกฎการเขียนซ้ำ
Chip Bennett

2
การตั้งค่า 'has_archive' ไม่มีผลกับ wheter หรือไม่แม่แบบ {post_type} .php เดียวจะถูกใช้สำหรับคำขอเดียว
จูลส์

ทำงานเหมือนจับใจ ขอบใจเพื่อน!
user1202416

1

เป็นวิธีปฏิบัติที่ดีที่ใช้register_activation_hook()และregister_deactivation_hook()เมื่อสร้างประเภทเนื้อหาใหม่

ดูเหมือนว่าเนื้อหาใหม่ที่สดใหม่จะไม่สามารถเขียนใหม่ได้เสมอ เพื่อหลีกเลี่ยงปัญหานี้ให้ใส่ใน register_activation_hook () โทรกลับflush_rewrite_rules()และฟังก์ชั่นการลงทะเบียนเนื้อหาใหม่ของคุณ ฉันไม่รู้ว่าทำไม แต่การทำเช่นนี้ดูเหมือนจะหลีกเลี่ยงปัญหานี้ ดู:

register_activation_hook( __FILE__, 'your_active_hook' );

function your_active_hook() {
    special_media_post();
    flush_rewrite_rules();
}

0

ฉันคัดลอกรหัสของคุณล้างกฎการเขียนซ้ำผ่านทางผู้ดูแลระบบและตอนนี้ชุดรูปแบบใช้แม่แบบที่ถูกต้องเมื่อฉันไปที่ Media Post

คุณต้องล้างข้อมูลกฎการเขียนซ้ำครั้งเดียวโดยใช้ตะขอ after_switch_theme สิ่งนี้จะทำให้แน่ใจว่ากฎการเขียนซ้ำถูกลบโดยอัตโนมัติหลังจากที่ผู้ใช้เปิดใช้งานธีม

คุณสามารถใช้รหัสนี้ (ส่งตรงจาก Codex):

add_action( 'init', 'theme_prefix_cpt_init' );
function theme_prefix_cpt_init() {
    register_post_type( ... );
}

function theme_prefix_rewrite_flush() {
    flush_rewrite_rules();
}
add_action( 'after_switch_theme', 'theme_prefix_rewrite_flush' );

โปรดศึกษา WordPress Codex สำหรับข้อมูลเพิ่มเติม: http://codex.wordpress.org/Function_Reference/register_post_type

แก้ไข: ในกรณีเช่นนี้ปลั๊กอินตรวจสอบกฎการเขียนซ้ำมีประโยชน์มากเพราะช่วยให้คุณเห็นกฎที่เชื่อมต่อกับประเภทโพสต์ที่กำหนดเองของคุณ: http://wordpress.org/extend/plugins/rewrite-rules-inspector/

โปรดทราบว่าสถานที่ที่แนะนำให้ใส่ประเภทโพสต์ที่กำหนดเองคือปลั๊กอินไม่ใช่ชุดรูปแบบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.