อนุกรมวิธานที่กำหนดเองเฉพาะสำหรับประเภทโพสต์ที่กำหนดเอง


29

ฉันต้องการสร้าง taxonomy ที่กำหนดเองซึ่งมีลักษณะคล้ายกับประเภทโพสต์เป็นหมวดหมู่ที่ทำงานกับโพสต์เริ่มต้น (บนพื้นฐานของ /% หมวดหมู่% /% โครงสร้างชื่อ postname% / Permalink) เพื่อให้โพสต์ในประเภทโพสต์ที่กำหนดเอง แสดงเป็น www.example.com/custom-post-type/custom-taxonomy-name/post-name นอกจากนี้ฉันต้องการให้กล่องเมตาหมวดหมู่ปรากฏเฉพาะเมื่อเราเพิ่มโพสต์เริ่มต้นใหม่และไม่ใช่เมื่อเราเพิ่มโพสต์ใหม่ในที่กำหนดเอง ประเภทโพสต์และกล่อง taxonomy ที่กำหนดเองจะปรากฏเฉพาะเมื่อเราเพิ่มโพสต์ใหม่ในประเภทโพสต์ที่กำหนดเองและไม่เมื่อเราเพิ่มโพสต์เริ่มต้นใหม่

คำตอบ:


46

ก่อนอื่นถ้าคุณต้องการแสดง taxonomy metabox เฉพาะกับชนิดโพสต์ที่กำหนดเองจากนั้นลงทะเบียน taxonomy เฉพาะประเภทโพสต์ที่กำหนดเองนั้นโดยส่งชื่อโพสต์ประเภทกำหนดเองเป็นอาร์กิวเมนต์ใน register_taxonomy โดยการทำเช่นนี้ taxonomy metabox จะปรากฏเฉพาะกับประเภทโพสต์ที่กำหนดเอง หากคุณไม่ต้องการแสดงประเภท metabox ประเภทโพสต์ที่กำหนดเองแล้วลบหมวดหมู่คำว่าเป็นอาร์กิวเมนต์ในขณะที่ลงทะเบียนประเภทโพสต์ที่กำหนดเองและรวมถึงชื่อกระสุนอนุกรมวิธานเช่น 'taxonomies' => อาร์เรย์ ('post_tag', 'your_taxonomy_name') . นี่คือรหัสที่ฉันได้รับ ฉันได้ลงทะเบียน taxonomy แบบกำหนดเองด้วย slug themes_categories ภายใต้ธีมประเภทโพสต์ที่กำหนดเอง


function themes_taxonomy() {  
    register_taxonomy(  
        'themes_categories',  //The name of the taxonomy. Name should be in slug form (must not contain capital letters or spaces). 
        'themes',        //post type name
        array(  
            'hierarchical' => true,  
            'label' => 'Themes store',  //Display name
            'query_var' => true,
            'rewrite' => array(
                'slug' => 'themes', // This controls the base slug that will display before each term
                'with_front' => false // Don't display the category base before 
            )
        )  
    );  
}  
add_action( 'init', 'themes_taxonomy');

จากนั้นให้เปลี่ยน Permalink ฉันได้สร้างฟังก์ชั่นต่อไปนี้


function filter_post_type_link($link, $post)
{
    if ($post->post_type != 'themes')
        return $link;

    if ($cats = get_the_terms($post->ID, 'themes_categories'))
        $link = str_replace('%themes_categories%', array_pop($cats)->slug, $link);
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

จากนั้นฉันลงทะเบียนประเภทโพสต์ที่กำหนดเองด้วยธีมกระสุนด้านล่าง


//Registering Custom Post Type Themes
add_action( 'init', 'register_themepost', 20 );
function register_themepost() {
    $labels = array(
        'name' => _x( 'Themes', 'my_custom_post','custom' ),
        'singular_name' => _x( 'Theme', 'my_custom_post', 'custom' ),
        'add_new' => _x( 'Add New', 'my_custom_post', 'custom' ),
        'add_new_item' => _x( 'Add New ThemePost', 'my_custom_post', 'custom' ),
        'edit_item' => _x( 'Edit ThemePost', 'my_custom_post', 'custom' ),
        'new_item' => _x( 'New ThemePost', 'my_custom_post', 'custom' ),
        'view_item' => _x( 'View ThemePost', 'my_custom_post', 'custom' ),
        'search_items' => _x( 'Search ThemePosts', 'my_custom_post', 'custom' ),
        'not_found' => _x( 'No ThemePosts found', 'my_custom_post', 'custom' ),
        'not_found_in_trash' => _x( 'No ThemePosts found in Trash', 'my_custom_post', 'custom' ),
        'parent_item_colon' => _x( 'Parent ThemePost:', 'my_custom_post', 'custom' ),
        'menu_name' => _x( 'Themes Posts', 'my_custom_post', 'custom' ),
    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => false,
        'description' => 'Custom Theme Posts',
        'supports' => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'revisions', 'post-formats', 'custom-fields' ),
        'taxonomies' => array( 'post_tag','themes_categories'),
        'show_ui' => true,
        'show_in_menu' => true,
        'menu_position' => 5,
        'menu_icon' => get_stylesheet_directory_uri() . '/functions/panel/images/catchinternet-small.png',
        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'query_var' => true,
        'can_export' => true,
        'rewrite' => array('slug' => 'themes/%themes_categories%','with_front' => FALSE),
        'public' => true,
        'has_archive' => 'themes',
        'capability_type' => 'post'
    );  
    register_post_type( 'themes', $args );//max 20 charachter cannot contain capital letters and spaces
}  

มีบางสิ่งที่คุณต้องจำไว้ขณะลงทะเบียนโพสต์ที่กำหนดเอง เปลี่ยนพารามิเตอร์ has_archive เป็นชื่อตัวบุ้งชนิดโพสต์ที่กำหนดเองและอีกอันคือเปลี่ยนชื่อตัวบุ้งเขียนใหม่เป็น 'slug' => 'custom_post_type_slug /% taxonomy_slug%

ตอนนี้เมื่อคุณเพิ่มประเภทโพสต์ใหม่ในหน้าประเภทเขียนโพสต์ ... คุณจะเห็นความคิดเห็นเป็น http://www.example.com/wordpress/themes/%themes_categories%/post-name/ หากไม่ได้เลือกอนุกรมวิธานที่กำหนดเองสำหรับโพสต์นี้ลิงก์ถาวรจะยังคงอยู่http://www.example.com/wordpress/themes/%themes_categories%/post-name/ซึ่งจะแสดงคำขอที่ไม่ดี เพื่อแก้ไขสิ่งนี้เราสร้างคำเริ่มต้นในอนุกรมวิธานที่กำหนดเอง (เช่นเดียวกับไม่มีการจัดหมวดหมู่ในหมวดหมู่) เพิ่มสิ่งนี้ไปยัง functions.php

function default_taxonomy_term( $post_id, $post ) {
    if ( 'publish' === $post->post_status ) {
        $defaults = array(
            'themes_categories' => array( 'other'),   //

            );
        $taxonomies = get_object_taxonomies( $post->post_type );
        foreach ( (array) $taxonomies as $taxonomy ) {
            $terms = wp_get_post_terms( $post_id, $taxonomy );
            if ( empty( $terms ) && array_key_exists( $taxonomy, $defaults ) ) {
                wp_set_object_terms( $post_id, $defaults[$taxonomy], $taxonomy );
            }
        }
    }
}
add_action( 'save_post', 'default_taxonomy_term', 100, 2 );

ตอนนี้เมื่อ taxonomy ที่กำหนดเองถูกปล่อยให้ว่าง permlaink จะกลายเป็น http://www.example.com/wordpress/themes/other/post-name/ โดยอัตโนมัติ

ในที่สุดอย่าลืมที่จะล้างเขียนใหม่โดยคลิกที่บันทึกการเปลี่ยนแปลงในการตั้งค่า Permalink ในส่วนผู้ดูแลระบบมิฉะนั้นคุณจะถูกเปลี่ยนเส้นทางไป 404 ข้อผิดพลาด หวังว่านี่จะช่วยคุณได้


สวัสดีฉันมีปัญหา ... เมื่อเราแสดงลิงก์ไปยังที่เก็บถาวร taxonomy โดยใช้ echo get_the_term_list ($ post-> ID, $ taxonomy, '', ',', ''); ลิงก์จะปรากฏเป็น www.example.com/taxonomy-term ไม่ใช่ www.example.com/themes/taxonomy-term ฉันคิดว่าเราต้องเขียนกฎ HTACESS
Saurabh Goel

+1, คำอธิบายที่ดี, ทำตามขั้นตอนและใช้งานได้ทดสอบบน WordPress 3.4.2
อเล็กซ์วัง

1
ฉันสงสัยว่า: คุณต้องเพิ่มอนุกรมวิธานที่กำหนดเองในอาร์เรย์ของ taxonomies เมื่อลงทะเบียนประเภทโพสต์ที่กำหนดเองหรือไม่? เนื่องจากดูเหมือนว่าจะทำงานโดยไม่เพิ่มที่นั่นด้วย (ถ้าคุณลงทะเบียน taxonomy ให้กับประเภทโพสต์ที่กำหนดเองแล้ว) แค่สงสัย.
trainoasis

พยายามทำสิ่งนี้ด้วยปลั๊กอิน CPT UI ในขณะที่ยังคงใช้การเขียนซ้ำเพื่อเปลี่ยน URL ทุกอย่างดูดี URL นั้นถูกต้องทั้งหมดและฉันรีเซ็ต Permalinks แต่โพสต์จริง ๆ มีการส่ง 404 :( แก้ไข: ไม่เป็นไรฉันผ่านและลบลำดับชั้นจากอนุกรมวิธานและทำให้แน่ใจว่าได้บันทึกสิ่งต่าง ๆ ตามลำดับที่เหมาะสมและตอนนี้โพสต์ ดูเหมือนจะทำงานแล้ว Yah!
Garconis

1

เช่นลงทะเบียน taxonomy ที่MY_NEW_CARSSกำหนดเองสำหรับประเภทโพสต์ที่กำหนดเอง:

$my_taxon_name  = 'MY_NEW_CARSS';
$my_post_types  = array('SUB_CAT_1','SUB_CAT_2','SUB_CAT_3');


//REGISTER CUSTOM TAXONOMY ( http://codex.wordpress.org/Function_Reference/register_taxonomy )
//If you aim to register HIERARCHICAL(Parent-ed) post type, read this warning: https://codex.wordpress.org/Function_Reference/register_post_type#hierarchical
add_action( 'init', 'my_f32' ); function my_f32() { 
    register_taxonomy( $GLOBALS['my_taxon_name'], array(), 
        array( 
            'label'=>$GLOBALS['my_taxon_name'],     'public'=>true, 'show_ui'=>true,  'show_admin_column'=>true,   'query_var'=>true,
            'hierarchical'=>true,   'rewrite'=>array('with_front'=>true,'hierarchical'=>true),  
             ));
}

//REGISTER CUSTOM POST TYPE ( http://codex.wordpress.org/Function_Reference/register_post_type )
add_action( 'init', 'myf_63' );function myf_63() { 

    foreach ($GLOBALS['my_post_types'] as $each_Type)       {
            register_post_type( $each_Type, 
                array( 
                    'label'=>$each_Type,     'labels' => array('name'=>$each_Type.' pagess', 'singular_name'=>$each_Type.' page'),        'public' => true,   'publicly_queryable'=> true,      'show_ui'=>true,      'capability_type' => 'post',      'has_archive' => true,      'query_var'=> true,     'can_export' => true,                   //'exclude_from_search' => false,     'show_in_nav_menus' => true,  'show_in_menu' => 'edit.php?post_type=page',//true,     'menu_position' => 5,
                    'hierarchical' =>true,
                    'supports' =>array( 'page-attributes', 'title', 'editor', 'thumbnail' ), 
                    'rewrite' => array('with_front'=>true, ),     //    'rewrite' => array("ep_mask"=>EP_PERMALINK ...) OR    'permalink_epmask'=>EP_PERMALINK, 
                ));

            register_taxonomy_for_object_type('category',$each_Type);       //standard categories
            register_taxonomy_for_object_type($GLOBALS['my_taxon_name'] ,$each_Type);   //Custom categories
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.