영구 링크가있는 중첩 된 사용자 정의 게시물 유형


9

authors/books/chapters저자, 서적 및 챕터가 모두 고유 한 사용자 정의 게시물 유형으로 설정된 퍼머 링크가있는 다중 레벨 사용자 정의 게시물 유형 구조를 설정하려고합니다. 예를 들어이 사이트의 일반적인 URL은 다음과 같습니다.example.com/authors/stephen-king/the-shining/chapter-3/

각 장은 한 권의 책에만 속할 수 있으며 각 책은 한 명의 저자 만 속할 수 있습니다. 저자와 책에 CPT 대신 분류법을 사용하는 것을 고려했지만 메타 데이터를 각 항목과 연결해야하며이를 위해 게시 인터페이스를 선호합니다.

각 사용자 정의 게시물을 CPT의 항목 하위 항목으로 한 단계 높이기 만하면됩니다. 예를 들어, "3 장"을 만들고 사용자 지정 메타 상자를 사용하여 "The Shining"을 부모로 할당합니다. "빛나는 것"에는 부모로서 "스티븐 킹"이 있습니다. 이 관계를 만드는 데 아무런 문제가 없었습니다.

CPT 슬러그에 다시 쓰기 태그를 사용하고 있으며 영구 링크가 작동하기를 원하지만 정확하지 않습니다. 다시 쓰기 분석기를 사용하면 다시 쓰기 규칙이 실제로 생성되었지만 올바른 순서가 아닌 것 같으므로 다른 규칙이 먼저 처리됩니다.

여기 내 다시 쓰기 분석기의 스크린 샷이 있습니다.

CPT를 등록하는 방법은 다음과 같습니다.

function cpt_init() {

  $labels = array(
    'name' => 'Authors'
   );

  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
    'rewrite' => array(
        'slug' => 'author',
        'with_front' => FALSE,
    ),
    'with_front' => false,
    'capability_type' => 'post',
    'has_archive' => false, 
    'hierarchical' => true,
    'menu_position' => null,
    'supports' => array( 'title', 'editor' )
  ); 

  register_post_type('authors',$args);

  $labels = array(
    'name' => 'Books'
  );

  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
    'rewrite' => array(
        'slug' => 'author/%authors%',
        'with_front' => FALSE,
    ),
    'with_front' => false,
    'capability_type' => 'post',
    'has_archive' => false, 
    'hierarchical' => true,
    'menu_position' => null,
    'supports' => array( 'title', 'editor' )
  ); 

  register_post_type('books',$args);


  $labels = array(
    'name' => 'Chapters'
   );

  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
    'rewrite' => array(
        'slug' => 'author/%authors%/%books%',
        'with_front' => FALSE,
    ),
    'with_front' => FALSE,
    'capability_type' => 'post',
    'has_archive' => false, 
    'hierarchical' => true,
    'menu_position' => null,
    'supports' => array( 'title', 'editor' )
  ); 

  register_post_type('chapters',$args);

}

add_action( 'init', 'cpt_init' );

저자, 서적 및 챕터가 모두 먼저 일치하도록 다시 쓰기 규칙의 우선 순위를 변경할 수있는 방법이 있습니까?

또한 post_type_link필터 를 추가해야한다는 것을 알고 있지만 처음에는 영구 링크를 얻는 것이 부차적 인 것 같습니다. 해당 필터의 작동 방식에 대한 포괄적 인 개요를 어디에서 찾을 수 있는지 아는 사람이 있다면 감사하겠습니다.


페이지 사용 만 고려 했습니까? 올바른 퍼머 링크 구조를 자동으로 얻을 수 있습니다.
Michael Hampton

나는 그것을 확실히 고려했습니다. 페이지의 문제점은 단일 저자를 위해 100 개의 손자 항목이있을 수 있다는 점인데, 페이지 관리자에서 관리하기가 매우 어렵습니다. 또한 게시물 유형별로 쿼리 할 수 ​​있어야합니다.
Dalton

솔루션을 개발 중이지만 빠른 질문이 있습니다. 각 퍼머 링크 앞에 '저자'가 있어야 하는가? 그것이 stickler 인 것처럼 보이기 때문입니다. WP 작성자 페이지에 사용되는 영구 링크 슬러그이기 때문에 WordPress가 약간 혼란 스럽습니다. '저자'가 필요한 경우 모든 것이 여전히 가능하다고 생각합니다. 더 복잡 할 것입니다.
Rachel Carden

죄송합니다. 저자가 내장 된 WP 저자 슬러그와 충돌한다는 것을 몰랐습니다. 아니요, 필요하지 않습니다. 무엇이든 될 수 있습니다. CPT이기 때문에 거기에 무언가 가 필요하다고 생각 했지만 쉽게 "작가"나 다른 것이 될 수 있습니다.
Dalton

혼란이 실제로 '슬러그'를 기본 슬러그로 공유하는 CPT에 있다는 것을 깨달았습니다. CPT '저자'의 슬러그로 'author'를 설정 한 다음 CPT '장'에 대해 'author / % author %'를 설정하고 CPT 'chapters에 대해'author / % author % / % book % '를 설정하십시오 ', 그러면 WordPress는'도서 '에 대한 게시물과'챕터 '에 대한 게시물은 문자 적으로'저자 '에 대한 계층 적 하위 게시물이라고 생각합니다. 말이 돼? 내 테스트에서 '저자'를 CPT '저자'의 기본으로 유지할 수 있으며 제대로 작동합니다. 이전 질문을 다음과 같이 바꾸십시오. '저자'가 필요합니까? 아니면 슬러그가 % author %로 시작할 수 있습니까?
Rachel Carden

답변:


11

당신은 영구 링크의 기본 슬러그, 즉로 '저자'를 유지하려면 example.com/authors/stephen-king/ 의 '저자'CPT에 대한 example.com/authors/stephen-king/the-shining/ 에 대한 '장'CPT 및 example.com/authors/stephen-king/the-shining/chapter-3/ '챕터'CPT에 대해 WordPress는 거의 모든 것이 '저자'게시물 또는 '저자의 계층 적 자식'이라고 생각합니다 '포스트가 아니기 때문에 워드 프레스는 궁극적으로 매우 혼란스러워집니다.

그렇게 말하면, 매우 기본적인 해결책이 있지만, permalink 구조가 항상 같은 순서를 따르는 한, 즉 'authors'라는 단어는 항상 저자 슬러그가 뒤 따르고 항상 책 슬러그가 뒤 따릅니다. 챕터 슬러그로 가면 좋을 것입니다.

이 솔루션에서는 'chapters'및 'books'에 대한 사용자 정의 게시물 유형 정의에서 다시 쓰기 슬러그를 정의 할 필요는 없지만 'authors'다시 쓰기 슬러그를 단순히 'authors'로 설정하고 함수에 다음 코드를 배치하십시오. 다시 쓰기 규칙을 "플러시"합니다.

add_action( 'init', 'my_website_add_rewrite_tag' );
function my_website_add_rewrite_tag() {
    // defines the rewrite structure for 'chapters', needs to go first because the structure is longer
    // says that if the URL matches this rule, then it should display the 'chapters' post whose post name matches the last slug set
    add_rewrite_rule( '^authors/([^/]*)/([^/]*)/([^/]*)/?','index.php?chapters=$matches[3]','top' );
    // defines the rewrite structure for 'books'
    // says that if the URL matches this rule, then it should display the 'books' post whose post name matches the last slug set
    add_rewrite_rule( '^authors/([^/]*)/([^/]*)/?','index.php?books=$matches[2]','top' );   
}

// this filter runs whenever WordPress requests a post permalink, i.e. get_permalink(), etc.
// we will return our custom permalink for 'books' and 'chapters'. 'authors' is already good to go since we defined its rewrite slug in the CPT definition.
add_filter( 'post_type_link', 'my_website_filter_post_type_link', 1, 4 );
function my_website_filter_post_type_link( $post_link, $post, $leavename, $sample ) {
    switch( $post->post_type ) {

        case 'books':

            // I spoke with Dalton and he is using the CPT-onomies plugin to relate his custom post types so for this example, we are retrieving CPT-onomy information. this code can obviously be tweaked with whatever it takes to retrieve the desired information.
            // we need to find the author the book belongs to. using array_shift() makes sure only one author is allowed
            if ( $author = array_shift( wp_get_object_terms( $post->ID, 'authors' ) ) ) {
                if ( isset( $author->slug ) ) {
                    // create the new permalink
                    $post_link = home_url( user_trailingslashit( 'authors/' . $author->slug . '/' . $post->post_name ) );
                }
            }

            break;

        case 'chapters':

            // I spoke with Dalton and he is using the CPT-onomies plugin to relate his custom post types so for this example, we are retrieving CPT-onomy information. this code can obviously be tweaked with whatever it takes to retrieve the desired information.
            // we need to find the book it belongs to. using array_shift() makes sure only one book is allowed
            if ( $book = array_shift( wp_get_object_terms( $post->ID, 'books' ) ) ) {

                // now to find the author the book belongs to. using array_shift() makes sure only one author is allowed
                $author = array_shift( wp_get_object_terms( $book->term_id, 'authors' ) );

                if ( isset( $book->slug ) && $author && isset( $author->slug ) ) {
                    // create the new permalink
                    $post_link = home_url( user_trailingslashit( 'authors/' . $author->slug . '/' . $book->slug . '/' . $post->post_name ) );
                }

            }

            break;

    }
    return $post_link;
}

CPT-onomies 플러그인에 대해 더 알아보기


이것은 완벽하게 작동합니다, 감사합니다! 방금 배운 것 같아요 CPT-onomies 플러그인도 정말 멋집니다. wordpress.org/extend/plugins/cpt-onomies
Dalton

"라이브러리"가 커짐에 따라 몇 가지 장애물을 겪을 수 있다는 느낌이 들지만 이미 염두에 두어야 할 코드가 있으므로 알려주세요.
Rachel Carden

@RachelCarden 두 권의 책이 제목은 같지만 저자가 다른 경우 어떻게합니까? 다시 작성된 URL에 충돌이 있습니다! 이 문제를 어떻게 해결합니까?
Segfault

1
@Segfault 모든 저자 슬러그를 검색하여 재 작성 규칙에 하드 코딩 할 수 있도록해야합니다 : foreach ($ author_slugs as $ author_slug) {add_rewrite_rule ( '^ authors /'. $ author_slug. '/ ([ ^ /] *) / ([^ /] *) /? ','index.php? authors = '. $ author_slug.'& chapters = $ matches [2] ','top '); add_rewrite_rule ( '^ authors /'. $ author_slug. '/([^/]*)/?','index.php?authors='. $ author_slug. '& books = $ matches [1]', 'top') ; }
Rachel Carden 2016 년

당신이 사용할 수있는 @Segfault get_terms ()를 사용하면 CPT-onomy, 또는 사용하는 경우, get_posts ()를 포스트 이름 / 굼벵이를 검색 할 수 있습니다.
Rachel Carden

4

그런 시나리오에 대한 개인적인 경험은 없지만 Randy Hoyt는 지난 주말 WordCamp San Fran에서 "하위 포스트 유형"에 대해 발표 한 내용을 발표했습니다.

다음은 프리젠 테이션 슬라이드 및 하위 게시물 유형으로 작업하기 위해 작성한 플러그인에 대한 링크가 포함 된 강연에 대한 그의 페이지입니다. http://randyhoyt.com/wordpress/subordinate-post-types/


고마워, 이것은 좋은 자원처럼 보입니다. 이것이 손자 관계를 지원하는지 여부는 확실하지 않지만 (내 테스트에서는 보이지 않지만) 실제로는 permalinks에 도움이되지 않습니다. 나는 이미 아이 / 부모 관계를 설정하는 방법을 알아 냈지만 (이것은 꽤 좋은 방법이지만) 영구 링크는 실제로 내가 겪고있는 문제입니다.
Dalton

1

규칙은 추가 permastruct가 추가되는 순서로 WP_Rewrite의 extra_rules_top에 추가됩니다. 따라서 게시 유형을 등록하는 순서를 전환하면 장 다시 쓰기가 먼저 일치하도록 생성 된 다시 쓰기 규칙의 순서가 전환됩니다. 그러나 다른 post_types에서 query_var를 사용하고 있기 때문에 wp_query는 원하는 장과 일치시키기 전에 쿼리 된 게시물 이름 중 하나와 일치 할 수 있습니다.

부모 저자 및 부모님 책의 자리 표시자를 나타내는 새 다시 쓰기 태그를 만듭니다.

add_rewrite_tag('%parent-book%', '([^/]+)', 'parent_book=');

이 작업을 수행 할 때 'parent_book'을 공개하려면 'query_vars'를 필터링해야합니다. 그런 다음 pre_get_posts에 필터를 추가하여 parent_book query_var로 설정된 이름을 post_id로 변환하고 'post_parent'로 설정해야합니다.


언급 한 필터에 대한 코드 예제를 제공해 주시겠습니까? 또한 손자 CPT에 대한 재 작성 태그는 어떤 모양입니까?
Dalton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.