Phân loại tùy chỉnh cụ thể cho một loại bài tùy chỉnh


29

Tôi muốn tạo một phân loại tùy chỉnh hoạt động tương tự như loại bài đăng như một danh mục hoạt động với một bài đăng mặc định (trên cơ sở /% danh mục% /% cấu trúc postname% / permalink) để các bài đăng trong các loại bài đăng tùy chỉnh hiển thị dưới dạng www.example.com/custom-post-type/custom-taxonomy-name/post-name Ngoài ra tôi muốn hộp meta danh mục chỉ xuất hiện khi chúng tôi thêm bài đăng mặc định mới chứ không phải khi chúng tôi thêm bài đăng mới trong tùy chỉnh loại bài đăng và hộp phân loại tùy chỉnh chỉ xuất hiện khi chúng tôi thêm một bài đăng mới trong loại bài đăng tùy chỉnh chứ không phải khi chúng tôi thêm một bài đăng mặc định mới.

Câu trả lời:


46

Trước hết, nếu bạn muốn chỉ hiển thị metabox phân loại cho loại bài đăng tùy chỉnh thì hãy đăng ký phân loại chỉ loại bài đăng tùy chỉnh đó bằng cách chuyển tên loại bài đăng tùy chỉnh làm đối số trong register_taxonomy. Bằng cách này, metabox phân loại chỉ xuất hiện cho loại bài tùy chỉnh. Nếu bạn không muốn hiển thị metabox danh mục cho loại bài đăng tùy chỉnh thì hãy xóa danh mục thuật ngữ làm đối số trong khi đăng ký loại bài đăng tùy chỉnh và thay vào đó bao gồm tên sên phân loại như 'phân loại' => mảng ('post_tag', 'your_taxonomy_name') . Đây là mã làm thế nào tôi đạt được điều đó. Tôi đã đăng ký phân loại tùy chỉnh với các chủ đề slug theo các chủ đề theo loại bài đăng tùy chỉnh


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');

Sau đó, để thay đổi permalink tôi đã tạo ra chức năng sau đây


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);

Sau đó, tôi đã đăng ký một loại bài đăng tùy chỉnh với các chủ đề sên như dưới đây


//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
}  

Có một vài điều bạn phải nhớ trong khi đăng ký bài tùy chỉnh. thay đổi tham số has_archive thành tên sên loại bài tùy chỉnh và một tên khác là thay đổi tên sên viết lại thành 'slug' => 'custom_post_type_slug /% taxonomy_slug%

Bây giờ khi bạn thêm một loại bài đăng mới trong trang loại bài viết ... bạn sẽ thấy permalink là http://www.example.com/wordpress/theme/%theme_c Ab% / post-name / . Nếu phân loại tùy chỉnh cho bài đăng này không được chọn thì permalink sẽ vẫn là http://www.example.com/wordpress/theme/%theme_clists%/post-name/ sau đó sẽ hiển thị một yêu cầu xấu. Để sửa lỗi này, chúng tôi tạo một thuật ngữ mặc định trong phân loại tùy chỉnh. (giống như chưa được phân loại trong danh mục) Thêm phần này vào hàm.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 );

Bây giờ khi phân loại tùy chỉnh bị bỏ trống, permlaink sẽ tự động trở thành http://www.example.com/wordpress/theme/other/post-name/ .

Cuối cùng, đừng quên viết lại bằng cách nhấp vào lưu thay đổi trong cài đặt permalink trong phần quản trị nếu không bạn sẽ được chuyển hướng đến lỗi 404. Hy vọng điều này sẽ giúp bạn.


Xin chào, tôi gặp sự cố ... khi chúng tôi xuất liên kết đến kho lưu trữ phân loại bằng cách sử dụng echo get_the_term_list ($ post-> ID, $ taxonomy, '', ',', ''); sau đó liên kết xuất hiện dưới dạng www.example.com/taxonomy-term chứ không phải www.example.com/theme/taxonomy-term. Tôi nghĩ rằng chúng ta cần phải viết một quy tắc HTACESS cho nó.
Saurabh Goel

+1, giải thích tuyệt vời, theo từng bước một và nó hoạt động, đã được thử nghiệm trên WordPress 3.4.2
Alex Vang

1
Tôi đã tự hỏi: bạn có phải thêm phân loại tùy chỉnh vào mảng phân loại khi đăng ký một loại bài tùy chỉnh không? Bởi vì nó dường như đang hoạt động mà không cần thêm nó vào đó (nếu bạn đã đăng ký phân loại cho loại bài đăng tùy chỉnh). Chỉ tò mò thôi.
đào tạo

Đã thử điều này với plugin CPT UI trong khi vẫn sử dụng ghi lại của bạn để thay đổi URL. Tất cả có vẻ tốt. Tất cả các URL đều chính xác và tôi đặt lại permalinks, nhưng các bài đăng thực tế đang ném 404. :( EDIT: nevermind. Tôi đã duyệt và xóa Phân cấp khỏi phân loại và cũng đảm bảo lưu mọi thứ theo đúng thứ tự, và bây giờ các bài đăng dường như hoạt động. Yah!
Garconis

1

tức là đăng ký phân loại MY_NEW_CARSStùy chỉnh cho các loại bài tùy chỉnh:

$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
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.