맞춤 게시물 유형과 분류 재 작성 구조를 혼합 하시겠습니까?


30

기본적으로 맞춤 게시물 유형을 사용하여 용어집을 만들고 싶습니다. 설정하는 데 문제가있어 원하는 방식으로 다시 작성합니다. 나는 그것을 좋아합니다 :

주요 용어집 URL : http://example.com/glossary/

문자 A로 시작되는 용어집 : http://example.com/glossary/a/

단일 용어집의 URL : http://example.com/glossary/a/atomic/

실제로 아래 코드를 사용 하여이 작업을 수행했지만 매우 어색한 방법이며 페이지를 볼 때 잘못된 템플릿이 호출되어 어딘가에서 작동하지 않는 것으로 알고 있습니다. http://example.com/glossary/를 제외하고 archive-sumo-glossary-term.php가 예상대로 호출되는 경우 다른 두 가지는 내 테마에서 index.php를 활성화합니다.

여기에 ( functions.php테마에서) 간다 :

add_action('init', 'create_glossary');
function create_glossary()
{
    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => true
        )
    );

    register_taxonomy
    (
        'sumo-glossary-letter',
        'sumo-glossary-term',
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => false
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ($post->post_type == 'sumo-glossary-term')
    {
        $permalink = str_replace('glossary/', 'glossary/' . $post->post_name[0] . '/', $post_link);
    }
    return $permalink;
}

add_rewrite_rule('^glossary/([^/]*)?$','index.php?glossary-letter=$matches[1]','top');
add_rewrite_rule('^glossary/([^/]*)/([^/]*)?$','index.php?glossary-term=$matches[2]','top');

답변:


30

template_include또는 관련 필터를 사용하여 호출 할 템플릿을 항상 재정의 할 수 있지만이 경우 사용자 정의 아카이브에 더 큰 문제가 숨겨 질 수 있습니다.

내가 이해했듯이 다음 구조를 사용하려고합니다.

  • /glossary/모든 sumo-glossary-term게시물 의 보관 페이지 여야합니다.
  • /glossary/[letter]/분류 체계의 용어와 게시물에 대한 아카이브 페이지 여야합니다 [letter]sumo-glossary-letter분류
  • /glossary/[letter]/[term-name]/개별 sumo-glossary-term게시물 이어야합니다

즉, 첫 번째는 템플릿 archive-sumo-glossary-term.php을로드하고 두 번째는로드 taxonomy-sumo-glossary-letter.php하고 세 번째는로드 single-sumo-glossary-term.php합니다.

나는 WordPress 3.2에서 분류법 다시 쓰기 슬러그와 게시물 유형에 대한 다시 쓰기 슬러그 및 아카이브 슬러그를 명시 적으로 설정하고 다른 다시 쓰기 규칙은 없습니다. 또한 우선 순위가 올바른지 확인하기 위해 분류 체계를 먼저 등록하고 그 후에 포스트 유형을 등록했습니다 (그렇지 않으면 /glossary/f/page/2용어집 page2 페이지 대신 용어가 용어로 이동 함 f).

add_action('init', 'create_glossary');
function create_glossary()
{

    register_taxonomy
    (
        'sumo-glossary-letter',
        array(),
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => array(
                'slug' => 'glossary',
            ),
        )
    );

    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary/%sumo-glossary-letter%',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => 'glossary',
            'taxonomies' => array( 'sumo-glossary-letter' ),
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ( false !== strpos( $post_link, '%sumo-glossary-letter%' ) ) {
        $glossary_letter = get_the_terms( $post->ID, 'sumo-glossary-letter' );
        $post_link = str_replace( '%sumo-glossary-letter%', array_pop( $glossary_letter )->slug, $post_link );
    }
    return $post_link;
}

나는 내일 그것을 시도하고 그것이 속임수인지 알아 내고 여기로 돌아올 것이다. 감사!
maryisdead

좋아, 내일은 아니고… 거의 완벽하게 작동했습니다! 고맙습니다! 작동하지 않는 것은 /glossary/입니다. 404 ( archive-sumo-glossary-term.php설정)를 제공합니다. 어떤 아이디어? WP 3.0.1을 고수하고 버전 문제 일 수 있습니다. 업그레이드 할 수있을 때 다시 테스트해야합니다. 어쨌든, 그것은 대부분 작동하고 있으며 지금은 반드시 필요하지 않으며 /glossary/문자 A로 리디렉션 할 필요가 없습니다 . 다시 감사합니다!
maryisdead

안녕하세요 @maryisdead, 나는 똑같은 문제가 있었고 똑같은 해결책을 찾았지만 똑같은 문제가 남아 있습니다. 어떻게 / glossary를 사용하여 archive-glossery.php 템플릿으로 이동합니까? 나는 방금 대답을 찾았습니다 'has_archive' => 'glossary'. 대신 has_archive => true Jan이 그의 대답에 그 방법을 가지고 있음을 알았지 만 원래 코드에는 그렇게하지 않았습니다. 그 부분을 업데이트 했습니까? 내가 변경하자마자 그것은 나를 위해 일하기 시작했다
Jeff

안녕 제프! 예, 그 부분을 업데이트했습니다. 다시 확인했지만 여전히 작동하지 않습니다. 문제가되는 WordPress 설치가 여전히 최신 버전 (3.0.1)이 아니기 때문에 여전히 문제의 근원 일 수 있습니다.
maryisdead

WP 3.2.1을 사용하는 동일한 문제입니다. 여전히 해결책이 없습니까?
Richard B

0

개인적으로 사용하지는 않았지만 "add_rewrite_rule"

http://codex.wordpress.org/Rewrite_API/add_rewrite_rule

또한 변경 한 후에는 영구 링크를 저장하는 것을 잊지 마십시오.


실제로을 사용 add_rewrite_rule하고 코드를 맨 아래로 스크롤하십시오. :-) 지금까지는 잘 작동하고 있습니다.이 방법으로 잘못된 템플릿을 호출하기 만합니다.
maryisdead 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.