맞춤 게시물 유형에 따른 맞춤 분류


29

카테고리가 기본 게시물 (/ % category % / % postname % / permalink 구조의 근거)에서 작동하므로 게시물 유형과 유사한 동작을하는 사용자 지정 분류 체계를 만들고 싶습니다. 또한 www.example.com/custom-post-type/custom-taxonomy-name/post-name으로 표시됩니다. 또한 사용자 정의에 새 게시물을 추가 할 때가 아니라 새 기본 게시물을 추가 할 때만 카테고리 메타 상자가 나타나기를 원합니다. 게시물 유형과 맞춤 분류 체계 상자는 맞춤 게시물 유형에 새 게시물을 추가 할 때만 나타나며 기본 게시물을 새로 추가 할 때는 표시되지 않습니다.

답변:


46

우선 분류 메타 박스를 사용자 정의 게시물 유형에만 표시하려면 사용자 정의 게시물 유형 이름을 register_taxonomy의 인수로 전달하여 분류를 해당 사용자 정의 게시물 유형에만 등록하십시오. 이렇게하면 분류 메타 박스가 맞춤 게시물 유형에만 나타납니다. 사용자 정의 게시물 유형에 카테고리 메타 박스를 표시하지 않으려면 사용자 정의 게시물 유형을 등록하는 동안 용어 카테고리를 인수로 제거하고 대신 'taxonomies'=> array ( 'post_tag', 'your_taxonomy_name')와 같은 분류법 슬러그 이름을 포함하십시오. . 여기 내가 그것을 달성 한 코드가 있습니다. 사용자 정의 게시물 유형 테마 아래에서 슬러그 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');

그런 다음 영구 링크를 변경하려면 다음 기능을 만들었습니다.


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

이제 맞춤 분류 체계를 비워두면 Permlaink가 http://www.example.com/wordpress/themes/other/post-name/이 자동으로됩니다.

마지막으로 관리자 섹션에서 permalink 설정에서 변경 사항 저장을 클릭하여 다시 쓰기를 플러시하는 것을 잊지 마십시오. 그렇지 않으면 404 오류로 리디렉션됩니다. 이것이 도움이되기를 바랍니다.


에코 문제를 사용하여 분류 아카이브에 대한 링크를 출력 할 때 문제가 발생했습니다. get get_the_term_list ($ post-> ID, $ taxonomy, '', ',', ''); 링크는 www.example.com/themes/taxonomy-term이 아닌 www.example.com/taxonomy-term으로 나타납니다. HTACESS 규칙을 작성해야한다고 생각합니다.
Saurabh Goel

+1, 훌륭한 설명, 단계별 설명 및 워드 프레스 3.4.2에서 테스트
Alex Vang

1
궁금한 점이 있습니다. 사용자 정의 게시물 유형을 등록 할 때 분류 체계에 사용자 정의 분류를 추가해야합니까? 추가하지 않고 작동하는 것 같습니다 (이미 사용자 정의 게시물 유형에 분류 체계를 등록한 경우). 그냥 궁금해서
trainoasis

다시 쓰기를 사용하여 URL을 변경하는 동안 CPT UI 플러그인으로 시도했습니다. 모두 좋아 보인다. URL이 모두 정확하고 permalinks를 재설정하지만 실제 게시물에 404가 발생합니다. : (편집 : 전혀 신경 쓰지 않았습니다. 분류 체계에서 계층 구조를 통해 제거하고 항목을 적절한 순서로 저장하고 이제는 게시물 작동합니다
Garconis

1

즉, 맞춤 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.