영구 링크에서 사용자 정의 게시물 유형에 카테고리 추가


22

나는 사람들이 이전에 이것을 요청했고 사용자 정의 게시물 유형을 추가하는 한 멀리 가고 permalink를 다시 작성한다는 것을 알고 있습니다.

문제는 계속 사용하고 싶은 340 개의 기존 범주가 있다는 것입니다. 나는 / category / subcategory / postname을 볼 수있었습니다

이제 customposttype / postname 슬러그가 있습니다. 카테고리를 선택하면 더 이상 퍼머 링크에 표시되지 않습니다 ... 관리자의 퍼머 링크 설정을 다른 것으로 변경하지 않았습니다.

누락되었거나이 코드에 추가해야하는 것이 있습니까?

function jcj_club_post_types() {
    register_post_type( 'jcj_club', array(
        'labels' => array(
            'name' => __( 'Jazz Clubs' ),
            'singular_name' => __( 'Jazz Club' ),
            'add_new' => __( 'Add New' ),
            'add_new_item' => __( 'Add New Jazz Club' ),
            'edit' => __( 'Edit' ),
            'edit_item' => __( 'Edit Jazz Clubs' ),
            'new_item' => __( 'New Jazz Club' ),
            'view' => __( 'View Jazz Club' ),
            'view_item' => __( 'View Jazz Club' ),
            'search_items' => __( 'Search Jazz Clubs' ),
            'not_found' => __( 'No jazz clubs found' ),
            'not_found_in_trash' => __( 'No jazz clubs found in Trash' ),
            'parent' => __( 'Parent Jazz Club' ),
        ),
        'public' => true,
        'show_ui' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'menu_position' => 5,
        'query_var' => true,
        'supports' => array( 
            'title',
            'editor',
            'comments',
            'revisions',
            'trackbacks',
            'author',
            'excerpt',
            'thumbnail',
            'custom-fields',
        ),
        'rewrite' => array( 'slug' => 'jazz-clubs-in', 'with_front' => true ),
        'taxonomies' => array( 'category','post_tag'),
        'can_export' => true,
    )
);

2
이것은 어리석은 질문 일지 모르지만 다시 작성해 보셨습니까?
kristina childs

최근에 나는이 문제에 직면 해있다. 해결되었습니다! [# 188834] [1] [1] : wordpress.stackexchange.com/questions/94817/…
maheshwaghmare

답변:


16

사용자 지정 게시물 유형 다시 쓰기 규칙을 추가 할 때 다루어야 할 2 가지 공격 지점이 있습니다.

다시 쓰기 규칙

재 작성 규칙이 생성 될 때 발생합니다 wp-includes/rewrite.php에서 WP_Rewrite::rewrite_rules(). WordPress에서는 게시물, 페이지 및 다양한 유형의 아카이브와 같은 특정 요소에 대한 다시 쓰기 규칙을 필터링 할 수 있습니다. 당신이 볼 경우 부분은 사용자 정의 포스트 유형의 이름이어야합니다. 표준 게시물 규칙을 없애지 않는 한 필터를 사용할 수도 있습니다 .posttype_rewrite_rulesposttypepost_rewrite_rules

다음으로 실제로 재 작성 규칙을 생성하는 함수가 필요합니다.

// add our new permastruct to the rewrite rules
add_filter( 'posttype_rewrite_rules', 'add_permastruct' );

function add_permastruct( $rules ) {
    global $wp_rewrite;

    // set your desired permalink structure here
    $struct = '/%category%/%year%/%monthnum%/%postname%/';

    // use the WP rewrite rule generating function
    $rules = $wp_rewrite->generate_rewrite_rules(
        $struct,       // the permalink structure
        EP_PERMALINK,  // Endpoint mask: adds rewrite rules for single post endpoints like comments pages etc...
        false,         // Paged: add rewrite rules for paging eg. for archives (not needed here)
        true,          // Feed: add rewrite rules for feed endpoints
        true,          // For comments: whether the feed rules should be for post comments - on a singular page adds endpoints for comments feed
        false,         // Walk directories: whether to generate rules for each segment of the permastruct delimited by '/'. Always set to false otherwise custom rewrite rules will be too greedy, they appear at the top of the rules
        true           // Add custom endpoints
    );

    return $rules;
}

플레이하기로 결정한 경우 여기서주의해야 할 것은 '워크 디렉토리'부울입니다. Permastruct의 각 세그먼트에 대해 다시 쓰기 규칙을 생성하며 다시 쓰기 규칙이 일치하지 않을 수 있습니다. WordPress URL이 요청되면 다시 쓰기 규칙 배열이 위에서 아래로 확인됩니다. 일치하는 것이 발견 되 자마자, 예를 들어 당신의 permastruct가 욕심있는 일치와 같은 경우, 당신이 겪은 모든 것을로드 할 것입니다. for /%category%/%postname%/및 walk 디렉토리가 있으면 /%category%/%postname%/AND와 /%category%/일치하는 다시 쓰기 규칙이 출력 됩니다. 너무 일찍 발생하면 망가진 것입니다.

퍼머 링크

이것은 포스트 유형 퍼머 링크를 구문 분석하고 퍼머 스트 (예 : '/ % year % / % monthnum % / % postname % /')를 실제 URL로 변환하는 기능입니다.

다음 부분은에서 get_permalink()찾을 수 있는 함수 의 버전이되는 간단한 예입니다 wp-includes/link-template.php. 사용자 지정 게시물 퍼머 링크는로 수정 된 get_post_permalink()버전입니다 get_permalink(). get_post_permalink()필터링 post_type_link하여 커스텀 영구 구조를 만드는 데 사용하고 있습니다.

// parse the generated links
add_filter( 'post_type_link', 'custom_post_permalink', 10, 4 );

function custom_post_permalink( $permalink, $post, $leavename, $sample ) {

    // only do our stuff if we're using pretty permalinks
    // and if it's our target post type
    if ( $post->post_type == 'posttype' && get_option( 'permalink_structure' ) ) {

        // remember our desired permalink structure here
        // we need to generate the equivalent with real data
        // to match the rewrite rules set up from before

        $struct = '/%category%/%year%/%monthnum%/%postname%/';

        $rewritecodes = array(
            '%category%',
            '%year%',
            '%monthnum%',
            '%postname%'
        );

        // setup data
        $terms = get_the_terms($post->ID, 'category');
        $unixtime = strtotime( $post->post_date );

        // this code is from get_permalink()
        $category = '';
        if ( strpos($permalink, '%category%') !== false ) {
            $cats = get_the_category($post->ID);
            if ( $cats ) {
                usort($cats, '_usort_terms_by_ID'); // order by ID
                $category = $cats[0]->slug;
                if ( $parent = $cats[0]->parent )
                    $category = get_category_parents($parent, false, '/', true) . $category;
            }
            // show default category in permalinks, without
            // having to assign it explicitly
            if ( empty($category) ) {
                $default_category = get_category( get_option( 'default_category' ) );
                $category = is_wp_error( $default_category ) ? '' : $default_category->slug;
            }
        }

        $replacements = array(
            $category,
            date( 'Y', $unixtime ),
            date( 'm', $unixtime ),
            $post->post_name
        );

        // finish off the permalink
        $permalink = home_url( str_replace( $rewritecodes, $replacements, $struct ) );
        $permalink = user_trailingslashit($permalink, 'single');
    }

    return $permalink;
}

언급했듯이 이것은 사용자 지정 다시 쓰기 규칙 세트와 퍼머 링크를 생성하기위한 매우 간단한 경우이며, 특히 유연하지는 않지만 시작하기에 충분해야합니다.

부정 행위

나는 당신이 어떤 사용자 정의 게시물 유형에 대한 permastructs를 정의 할 수있는 플러그인을 작성했지만, 당신이 가지고있는 사용자 정의 분류법에 대해 %category%내 플러그인이 지원 %custom_taxonomy_name%하는 게시물에 대한 permalink 구조에서 사용할 수있는 것처럼 분류 custom_taxonomy_name의 이름이 어디에 있습니까 ? %club%.

계층 적 / 비 계층 적 분류 체계에서 예상대로 작동합니다.

http://wordpress.org/extend/plugins/wp-permastructure/


1
플러그인은 훌륭하지만 플러그인없이 질문의 문제를 해결하는 방법을 설명 할 수 있습니까?
Eugene Manuilov

나는 그것을 해결하기위한 플러그인이 훌륭하다는 것에 동의하지만 (나는 북마크를 하고이 Q에 대해 처음으로 떠올랐다) 대답 은 문제가 무엇이고 플러그인이 그것을 어떻게 극복했는지에 대한 간략한 요약에서 도움이 될 것입니다. :)
Rarst

@EugeneManuilov 좋아요, 긴 답변입니다. 저도 기본 사항까지 제거했습니다!
sanchothefat

첫 번째 $permalink = home_url(...로 무시되고 $permalink = user_trailingslashit(...사용되지 않은 것처럼 보입니다 . 아니면 뭔가 빠졌습니까? $post_link심지어 정의되지 않았습니다. 그랬어 야 했어 $permalink = user_trailingslashit( $permalink, 'single' );?
Ian Dunn

캐치 좋은, 그것은해야 $permalink하지 $post_link. 건배 :)
sanchothefat

1

해결책을 찾았습니다!

사용자 정의 게시물 유형에 대한 계층 적 영구 링크를 설정하려면 사용자 정의 게시물 유형 Permalinks ( https://wordpress.org/plugins/custom-post-type-permalinks/ ) 플러그인을 설치하십시오.

등록 된 게시물 유형을 업데이트하십시오. 도움말 센터로 게시물 유형 이름이 있습니다

function help_centre_post_type(){
    register_post_type('helpcentre', array( 
        'labels'            =>  array(
            'name'          =>      __('Help Center'),
            'singular_name' =>      __('Help Center'),
            'all_items'     =>      __('View Posts'),
            'add_new'       =>      __('New Post'),
            'add_new_item'  =>      __('New Help Center'),
            'edit_item'     =>      __('Edit Help Center'),
            'view_item'     =>      __('View Help Center'),
            'search_items'  =>      __('Search Help Center'),
            'no_found'      =>      __('No Help Center Post Found'),
            'not_found_in_trash' => __('No Help Center Post in Trash')
                                ),
        'public'            =>  true,
        'publicly_queryable'=>  true,
        'show_ui'           =>  true, 
        'query_var'         =>  true,
        'show_in_nav_menus' =>  false,
        'capability_type'   =>  'page',
        'hierarchical'      =>  true,
        'rewrite'=> [
            'slug' => 'help-center',
            "with_front" => false
        ],
        "cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",
        'menu_position'     =>  21,
        'supports'          =>  array('title','editor', 'thumbnail'),
        'has_archive'       =>  true
    ));
    flush_rewrite_rules();
}
add_action('init', 'help_centre_post_type');

그리고 여기에 분류 분류가 있습니다

function themes_taxonomy() {  
    register_taxonomy(  
        'help_centre_category',  
        'helpcentre',        
        array(
            'label' => __( 'Categories' ),
            'rewrite'=> [
                'slug' => 'help-center',
                "with_front" => false
            ],
            "cptp_permalink_structure" => "/%help_centre_category%/",
            'hierarchical'               => true,
            'public'                     => true,
            'show_ui'                    => true,
            'show_admin_column'          => true,
            'show_in_nav_menus'          => true,
            'query_var' => true
        ) 
    );  
}  
add_action( 'init', 'themes_taxonomy');

이것은 당신의 permalink를 작동시키는 라인입니다.

"cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",

당신은 제거 %post_id%하고 유지할 수 있습니다/%help_centre_category%/%postname%/"

대시 보드에서 영구 링크를 플러시하는 것을 잊지 마십시오.


+1 가장 간단한 해결책은이 플러그인을 사용하는 것입니다. wordpress.org/plugins/custom-post-type-permalinks 는 완벽하게 작동합니다
Jules

예, 그러나 단일 맞춤 게시물 유형이 있지만 단일 테마에 여러 맞춤 게시물 유형이있는 경우 위의 해결책입니다. 또한 게시물 유형 슬러그와 동일하게 카테고리 슬러그를 변경합니다.
Varsha Dhadge

1

해결책을 찾았습니다 !!!

(끝없는 연구 후. 나는 다음과 같은 CUSTOM POST TYPE 퍼머 링크를 가질 수있다 :
example.com/category/sub_category/my-post-name

여기 코드 (functions.php 또는 플러그인) :

//===STEP 1 (affect only these CUSTOM POST TYPES)
$GLOBALS['my_post_typesss__MLSS'] = array('my_product1','....');

//===STEP 2  (create desired PERMALINKS)
add_filter('post_type_link', 'my_func88888', 6, 4 );

function my_func88888( $post_link, $post, $sdsd){
    if (!empty($post->post_type) && in_array($post->post_type, $GLOBALS['my_post_typesss']) ) {  
        $SLUGG = $post->post_name;
        $post_cats = get_the_category($id);     
        if (!empty($post_cats[0])){ $target_CAT= $post_cats[0];
            while(!empty($target_CAT->slug)){
                $SLUGG =  $target_CAT->slug .'/'.$SLUGG; 
                if  (!empty($target_CAT->parent)) {$target_CAT = get_term( $target_CAT->parent, 'category');}   else {break;}
            }
            $post_link= get_option('home').'/'. urldecode($SLUGG);
        }
    }
    return  $post_link;
}

// STEP 3  (by default, while accessing:  "EXAMPLE.COM/category/postname"
// WP thinks, that a standard post is requested. So, we are adding CUSTOM POST
// TYPE into that query.
add_action('pre_get_posts', 'my_func4444',  12); 

function my_func4444($q){     
    if ($q->is_main_query() && !is_admin() && $q->is_single){
        $q->set( 'post_type',  array_merge(array('post'), $GLOBALS['my_post_typesss'] )   );
    }
    return $q;
}

-2

코드에 몇 가지 오류가 있습니다. 기존 코드를 정리했습니다.

<?php
function jcj_club_post_types() {
  $labels = array(
    'name' => __( 'Jazz Clubs' ),
    'singular_name' => __( 'Jazz Club' ),
    'add_new' => __( 'Add New' ),
    'add_new_item' => __( 'Add New Jazz Club' ),
    'edit' => __( 'Edit' ),
    'edit_item' => __( 'Edit Jazz Clubs' ),
    'new_item' => __( 'New Jazz Club' ),
    'view' => __( 'View Jazz Club' ),
    'view_item' => __( 'View Jazz Club' ),
    'search_items' => __( 'Search Jazz Clubs' ),
    'not_found' => __( 'No jazz clubs found' ),
    'not_found_in_trash' => __( 'No jazz clubs found in Trash' ),
    'parent' => __( 'Parent Jazz Club' ),
    );
  $args = array(
    'public' => true,
    'show_ui' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'menu_position' => 5,
    'query_var' => true,
    'supports' => array( 'title','editor','comments','revisions','trackbacks','author','excerpt','thumbnail','custom-fields' ),
    'rewrite' => array( 'slug' => 'jazz-clubs-in', 'with_front' => true ),
    'has_archive' => true
    );
  register_post_type( 'jcj_club', $args );
  }
add_action( 'init','jcj_club_post_types' );
?>

위의 코드로 코드를 바꾸고 작동하는지 확인하십시오. 더 궁금한 점이 있으면 답장을 보내 주시면 도와 드리겠습니다.

편집하다:

나는 내가 빠진 것을 알아 차렸다 'has_archive' => true.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.