페이지처럼 작동하도록 계층 적 사용자 정의 게시물 유형 퍼머 링크 가져 오기


16

사용자 정의 게시물 유형 영구 링크에 대한 모든 질문을 파헤 쳤지 만 대부분 사용자 정의 분류법 다시 작성에 문제가 있거나 flush_rewrite_rules ()가 누락 된 것 같습니다. 그러나 필자의 경우에는 메타 박스 등의 속성에 대한 적절한 "지원"을 사용하여 계층 적 (부모-자식 관계를 지정할 수 있음)으로 설정된 사용자 정의 게시물 유형 (분류 없음) 만 사용하고 있습니다. 다시 쓰기 규칙을 수천 가지 방법으로 플러시했습니다. 다른 퍼머 링크 구조를 시도했습니다. 그러나 자식 URL은 항상 404입니다.

원래 "parent"및 "child"요소 (p2p 사용)에 대해 독립적 인 사용자 지정 게시물 유형이 있었으며 "parental"그룹화를 위해 분류법을 사용하는 데 아무런 어려움이 없었을 것입니다. 그러나 클라이언트의 경우 페이지와 같이 관리자에 "게시물"이 표시 될 때 계층 구조를 시각화하는 것이 가장 쉽습니다. 하위 항목이 부모 아래에 나타나고 접두사 "-"가있는 간단한 트리 적절한 순서. 또한 드래그 앤 드롭을 통해 순서를 지정하는 다양한 방법을 사용할 수 있습니다. 분류 체계 (또는 p2p)를 통해 그룹화하면 관리자 목록에 "게시물"이 단순하게 표시됩니다. 이는 시각적으로 명확하지 않습니다.

따라서 내가 따르는 것은 말 그대로 핵심 "페이지"와 정확히 동일한 동작이지만 내 맞춤 게시물 유형입니다. 게시물 유형을 예상대로 등록했으며 관리자가 완벽하게 작동합니다. 각 뉴스 레터 "게시물"에 대해 부모 및 menu_order를 지정할 수 있습니다. 편집 목록에 올바르게 나타납니다.

Spring 2012
 First Article
 Second Article

그리고 그들의 영구 링크 제대로 구성되어있는 것 같습니다. 사실, 게시물 유형을 등록 할 때 구조에 대해 변경하거나 재 작성 슬러그를 변경하면 자동으로 올바르게 업데이트되므로 작동하는 것을 알고 있습니다.

http://mysite.com/parent-page/child-page/                  /* works for pages! */
http://mysite.com/post-type/parent-post/child-post/        /* should work? */
http://mysite.com/newsletter/spring-2012/                  /* works! */
http://mysite.com/newsletter/spring-2012/first-article/    /* 404 */
http://mysite.com/newsletter/spring-2012/second-article/   /* 404 */

또한 계층 적 관계가 생성 된 표준 핵심 "페이지"가 ​​있으며 관리자에서 동일하게 보이지만 실제로는 프런트 엔드에서도 작동합니다 (부모 및 자식 URL 모두 잘 작동 함).

내 퍼머 링크 구조는 다음과 같이 설정됩니다.

http://mysite.com/%postname%/

나는 또한 이것을 시도했다. (나의 경우에는 의미가 없지만 다른 많은 답변이 필요하다는 것을 나타내는 것처럼 보였기 때문에) :

http://mysite.com/%category%/%postname%/

내 등록 CPT 인수에는 다음이 포함됩니다.

$args = array(
    'public'                => true,
    'publicly_queryable'    => true,
    'show_ui'               => true,
    'has_archive'           => 'newsletter',
    'hierarchical'          => true,
    'query_var'             => true,
    'supports'              => array( 'title', 'editor', 'thumbnail', 'page-attributes' ),
    'rewrite'               => array( 'slug' => 'newsletter', 'with_front' => false ),

내 맞춤 게시물 유형 하위 와 일반 페이지 하위 사이의 유일한 눈에 띄는 차이점은 CPT가 permalink 구조의 시작 부분에 슬러그가 있고 그 다음에 부모 / 자식 슬러그 (페이지가 부모 / 자식 슬러그로 시작 함)가 있다는 것입니다. "접두사"없음). 왜 이런 일이 일어 났는지 모르겠습니다. 많은 기사들이 이것이 그러한 계층 적 CPT 퍼머 링크가 정확히 어떻게 동작해야하는지 나타내는 것으로 보이지만, 잘 형성되어 있지만 작동하지 않습니다.

또한 404 페이지에 대해 query_vars를 검사 할 때 문제가되는 것은 자식 페이지를 "찾기"위해 WP에 대한 올바른 값을 포함하고있는 것으로 보이지만 작동하지 않습니다.

$wp_query object WP_Query {46}
public query_vars -> array (58)
'page' => integer 0
'newsletter' => string(25) "spring-2012/first-article"
'post_type' => string(10) "newsletter"
'name' => string(13) "first-article"
'error' => string(0) ""
'm' => integer 0
'p' => integer 0
'post_parent' => string(0) ""
'subpost' => string(0) ""
'subpost_id' => string(0) ""
'attachment' => string(0) ""
'attachment_id' => integer 0
'static' => string(0) ""
'pagename' => string(13) "first-article"
'page_id' => integer 0
[...]

나는이 부분을 잃어버린 템플릿이 아닌지 확인하기 위해 스물 열두 가지를 포함한 다양한 테마로 이것을 시도했습니다.

Rewrite Rules Inspector를 사용하면 다음 URL에 표시됩니다. http://mysite.com/newsletter/spring-2012/first-article/

newsletter/(.+?)(/[0-9]+)?/?$   
       newsletter: spring-2012/first-article
           page: 
(.?.+?)(/[0-9]+)?/?$    
       pagename: newsletter/spring-2012/first-article
           page: 

다른 관리자 페이지에 표시되는 방법 :

RULE:
newsletter/(.+?)(/[0-9]+)?/?$
REWRITE:
index.php?newsletter=$matches[1]&page=$matches[2]
SOURCE:
newsletter

이 재 작성 출력은 다음과 같은 "예쁜"퍼머 링크가 작동한다고 믿게 만들 것입니다.

http://mysite.com/?newsletter=spring-2012&page=first-article

404는 아니지만 자식이 아닌 부모 CPT 항목 "뉴스 레터"를 표시합니다. 요청은 다음과 같습니다.

Array
(
    [page] => first-article
    [newsletter] => spring-2012
    [post_type] => newsletter
    [name] => spring-2012
)

답변:


15

스택 익스체인지에 참여한 것은 이번이 처음이지만,이를 통해 올바른 방향을 알려줄 수 있는지 살펴 보겠습니다.

기본적으로 계층 적 CPT는 설명한 방식대로 동작합니다. 이 경우 고유 한 슬러그 접두사 인 "뉴스 레터"는 다시 쓰기 엔진에 다른 게시물 유형에 대한 요청을 구별하는 방법을 알려줍니다.

이러한 CPT 등록 인수는 괜찮아 보이지만 CPT가 요청되면 pagename쿼리 var에 값이 name없어야 하고 쿼리 var가 newsletter여기 와 같아야 하므로 설정 어딘가에 충돌이있는 것 같습니다.

디버깅을 돕기 위해 Rewrite Rules Inspector Plugin을 설치 및 활성화 한 다음 " Tools-> Rewrite Rules "화면을 방문하십시오 .

  1. 목록을 보는 동안 뉴스 레터 CPT에 대한 모든 규칙이 페이지 다시 쓰기 규칙 전에 나열되어야합니다 . " 소스 "열 을 스캔하여이 경우인지 확인하십시오 .
  2. 체크 아웃 된 경우 " URL 일치 "필드에 "첫 번째 기사"CPT의 URL을 입력 하고 "필터"버튼을 클릭하여 일치하는 규칙을 확인하십시오. 뉴스 레터 규칙 및 페이지 규칙과 일치해야하지만 뉴스 레터 규칙이 첫 번째 여야합니다.

그래도 문제가 발견되지 않으면 post_name열을 검색하여 wp_posts충돌이있을 수 있는지 "first-article"슬러그가있는 다른 게시물을 찾으십시오. "뉴스 레터"도 검색하십시오.

다음 스 니펫을 추가하여 요청의 초반에 쿼리 변수를 검사하여 다시 쓰기 규칙 일치에 의해 설정되는 항목을 확인하고 확인하십시오 (프론트 엔드의 하위 CPT 방문). 경우 pagenameVAR 여기에 표시되지 않습니다, 그것은 나중에 요청에 뭔가에 의해 설정되는 것 :

add_filter( 'request', 'se77513_display_query_vars', 1 );

function se77513_display_query_vars( $query_vars ) {
    echo '<pre>' . print_r( $query_vars, true ) . '</pre>';

    return $query_vars;
}

쿼리 변수를 수정하는 모든 플러그인 / 기능이 충돌을 일으킬 수 있으므로 여전히 문제가 표시되면 사용 중지하십시오. 또한 요청이 위의 두 번째 단계에서 잘못된 규칙과 일치하는 경우 각 단계 후에 다시 쓰기 규칙을 플러시하십시오 ( "퍼머 링크"화면을 별도의 탭에서 열어두고 새로 고치십시오).


이 주석은 충분한 형식을 허용하지 않으므로 다시 쓰기 규칙 관리자의 출력을 표시하도록 질문을 편집했습니다. CPT에 대한 규칙은 목록 상단에 다른 것보다 먼저 표시되지만 아래 규칙 중 "페이지"규칙이 무엇인지 확실하지 않습니다 (명확하지 않음). 또한 post_name열에 충돌이 없습니다 .
somatic

적절한 퍼머 링크 구조에 대한 생각이 있습니까? 다시 쓰기 관리자에서 더 혼란스럽게하는 것만 /%postname%/포함했기 때문에 다시 돌아 왔습니다 /%category%/. 나는 사람들 /%category%/이 CPT가 마술처럼 "부모"를 의미한다고 주장하는 것을 보았지만 , 이것이 사실이라고는 생각하지 않습니다.
somatic

이 출력은 다른 플러그인에 대한 것으로 보이므로 규칙의 "소스"가 표시되지 않습니다. 어느 쪽이든, 규칙이 잘 일치하는 것 같습니다. 요청의 초기에 쿼리 변수를 검사하여 올바르게 설정되어 있는지 확인하기 위해 스 니펫을 포함하도록 답변을 편집했습니다.
브래디 버처

퍼머 링크 구조에 관해서는, 나는 카테고리를 포함하는 팬이 아닙니다. 아무것도 도움이되지 않는 또 다른 움직이는 부분 일 뿐이며 게시물은 여러 범주에 속할 수 있습니다. 앞으로 퍼머 링크 구조를 변경하거나 슬러그 접두사없이 다른 CPT를로드 할 가능성이 있다면, "고정 된"구조를 고정되고 고유 한 것으로 권장합니다 /blog/%postname%/.
브래디 버처

올바른 플러그인이지만 테스트 URL을 제공하는 "다시 쓰기 분석기"와 "다시 쓰기 규칙"두 페이지가 있습니다. 다른 페이지를 시도했는데 첫 번째 들여 쓰기 그룹의 경우 "프로그램"으로, 두 번째 페이지의 경우 "페이지"로 소스를 표시했습니다.
somatic

5

parent/Child퍼머는 세트로 한 상자 밖으로 작동

'hierarchical'=> true,
'supports' => array('page-attributes' ....

최신 정보:

방금 다시 테스트 했으며이 테스트 사례와 함께 예상대로 작동합니다.

add_action('init','test_post_type_wpa77513');
function test_post_type_wpa77513(){
    $args = array(
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true, 
        'show_in_menu' => true, 
        'query_var' => true,
        'rewrite' => true,
        'capability_type' => 'post',
        'has_archive' => true, 
        'hierarchical' => true,
        'supports' => array( 'title', 'editor', 'thumbnail', 'page-attributes' )
    ); 

    register_post_type( 'newsletter', $args );
}

/%postname%/뉴스 레터 / 부모 / 자녀가 제대로 작동 하도록 설정했습니다 .


위의 코드는 보여주지 않았지만 page-attributes지원에는 있습니다 (실제로 부모를 할당하기위한 메타 박스를 표시하는 것과 관련이 있으며 permalinks에는 영향을 미치지 않아야 함)-404가됩니다. 어떤 퍼머 링크 구조를 설정해야합니까? 아니면 중요합니까?
somatic

@ somatic 방금 다시 테스트하고 잘 작동합니다 .permalink는 중요 해야하는지 확실하지 않지만 어떤 식 으로든 대답을 업데이트했습니다.
Bainternet

'labels'에 대한 인수 배열을 추가하면 (admin에 CPT가 나타나지 않는)이 기본 예제가 twentlytwelve와 함께 WP3.5의 바닐라 설치에서 작동 함을 확인할 수 있습니다. 그러나 나는 register_post_type$ args 의 몇 가지 주요 차이점을 주목하고 'rewrite' => array( 'slug' => 'newsletter', 'with_front' => false )있습니다 true. 또한 단순히 통과 true를 위해 has_archive내가 슬러그를 통과 곳. 그러나 내가 당신의 주장과 일치했을 때, 나는 여전히 404를 얻었습니다 ... 여전히 내가 잘못 가고있는 곳을 추적하려고합니다.
somatic

3

이외에도 질문에서 ? 당신이 그것을 해제 후 다시 시도 되세요»« 재 작성 규칙을 추가 등록, 분류, 포스트 유형 : 나는 또한 당신이 활성화 된 모든 플러그인을 가지고 당신의 테마 예에 대한합니다 (영구 링크에 아무것도하면된다 "요청해야 등)?

그렇다면 : 모든 플러그인을 비활성화하고 TwentyEleven으로 전환 한 후에도 여전히 발생합니까? 여기에 이미지 설명을 입력하십시오

더 디버깅하려면 GitHub로 가서 Toschos "Rewrite"Plugin을 가져 오십시오 . 그런 다음 wp.org 의 공식 플러그인 저장소 로 전환하여 MonkeyManRewriteAnalyzer 플러그인을 가져 오십시오 . 나는 심지어 둘을 조금씩 붙이기 위해 약간의 확장을 썼다. 설정에 대한 많은 정보가 제공됩니다.


글쎄, 모든 것을 비활성화하면 이 질문의 요점 인 맞춤 게시물 유형이 없을 것입니다 ...하지만 네, 스물 열두 테마로도 시도했습니다. 필자는 볼 수 있듯이 영구 링크 자체가 잘 구성된 것처럼 쿼리를 처리하는 데 필요한 몇 가지 플러그를 계속 파고 있습니다.
somatic

@somatic 물론 당신을 비활성화하지 :)
kaiser

@somatic 업데이트를 참조하십시오.
카이저

1

따라서 완전히 깨끗하게 설치하고 단 하나의 CPT 선언으로 계층 구조의 페이지 동작을 예상 할 수 있음을 확인한 후 CPT 생성을 처리하는 데 사용하는 플러그인 자체의 어딘가에 결함이 있음을 알았습니다 (매우 복잡하고 사용자 정의 메타 박스, 분류법 처리) 등). 문제는 다시 쓰기 또는 쿼리 문제를 확인하기위한 모든 조언에도 불구하고 분명히 잘못된 것을 볼 수 없었습니다. 모든 필터와 후크를 확인하고 각 지점에서 쿼리를보고 404를 유발하는 것은 없습니다.

그래서 나는 9 개의 큰 클래스 각각을 수동으로 비활성화 / 활성화 한 다음 404 개를 유발하는 클래스 중 적어도 2 개를 찾아 각 기능을 하나씩 수행하고 비활성화 / 활성화 한 다음 줄을 추적하는 작업을 맡았습니다. 내가 그 이유를 알지 못하더라도 무차별 강제로 404의 원인을 정확히 파악하려고 시도합니다.

그때을 사용하면 결과가 나온다는 것을 알았습니다 $query->get_queried_object(). 이 래퍼 함수를 ​​사용하면 실제로 $ query 자체를 수정하는 것처럼 보일 것입니다.이 함수는 함수 끝에서 변경되지 않고 반환되었다고 생각했습니다. 이 개 클래스에서 세 가지 필터가 쿼리를 수정하는 것이 포함되었다 : parse_query, posts_orderby, posts_join- 그리고 콜백 함수의 모든 호출 된 $query->get_queried_object()전달에 $query쿼리 (특수 정렬 순서의 경우에 같은) 바르 수정 때로는 몇 가지 조건 테스트를 실행 한 다음에 인수. 이상하게도,이 기능은 내가 기능을 사용 하더라도 실제로 설계된대로 잘 작동했습니다 . 전에 반환 된 $ 쿼리에 어떤 문제도 발견하지 못했습니다!

어쨌든 수십 개의 라이브 프로덕션 사이트에서 1 년 이상 개발 및 사용한 후에도이 실수로 인한 부작용은 없었습니다. 계층 적 CPT에 투자했을 때만이 작은 차이가 갑자기 문제를 일으켰습니다. 그것은 내가 이것을 매우 열심히 던진 것의 일부입니다. 제가 알 수 있듯이 쿼리 필터는 신뢰할 만했습니다!

나는 왜이 함수를 호출하면 CPT 자식 페이지 의이 작은 부분 만 깨뜨릴지를 정확히 알지 못하지만 다른 문제는 결코 나타내지 않습니다! 그러나 필터 콜백 내에서 그것을 사용하면 $query어떻게 든 반환 값이 망가 졌다는 것이 분명했습니다 . 이 호출을 제거하면 404 오류가 사라졌습니다.

모든 팁에 감사드립니다-궁극적 인 솔루션이 다소 관련이 없어도 각 답변에서 통찰력을 얻음으로써 현상금을 분할 할 수 있기를 바랍니다. 이것은 오랫동안 코드를 안정적으로 사용하고 있거나 명백한 오류를 일으키지 않더라도 코드를 맹목적으로 신뢰하지 않는 교육적 교훈이었습니다.

때로는 카이저의 차트가 깔끔하게 구현되어 있기 때문에 조명이 다시 켜질 때까지 스위치를 던지기 시작해야합니다. 필자의 경우 문제를 확인하기 전에 함수의 개별 줄까지 동일한 문제 해결 전략을 취해야했습니다.


객체 get_queried_object()를 가로 채지 않고 래퍼 기능 을 사용할 수도 있습니다 $wpdb.
카이저

그러나 그것은 $query무엇을 잡는가? 에 대해 필터 내에서 이것을 사용하고 있으며 필터에서 전달 된 parse_query특정 쿼리 개체를 구체적으로 $query
somatic

방금 내 필터 내부의 래퍼를 사용해 보았습니다 parse_query. 동일한 404 오류가 다시 발생했습니다. get_queried_object()이 필터를 손상시키지 않고 무엇을 복제 할 수있는 방법을 찾아야 합니다.
somatic

-2

최신 버전의 WP를 실행하고 있습니까? 이 문제가 최신 버전 업데이트에서 해결되었다는 것을 읽은 이래로, 첫 번째 질문 인 것 같습니다.

digwp.com에이 문제를 해결하는 게시물이 있습니다 (http://digwp.com/2011/06/dont-use-postname/). 분명히 WP는 게시물과 페이지의 차이점을 쉽게 알 수 없으며 텍스트 기반 옵션으로 URL을 시작하면 WP는 모든 페이지 / 포스트에 대해 규칙을 작성하는 플래그를 트리거합니다. 사이트에 많은 콘텐츠가있는 경우 많은 수의 요청이 발생하고 서버가 시간 초과되어 페이지가 있더라도 404가 많이 발생할 수 있습니다.

그래서. 숫자 기반 구조를 먼저 사용하고 텍스트 기반 구조를 사용하는 경우 404 문제가 해결 될 것입니다. 이제 SEO 문제를 고려할 때 날짜 구조를 사용하지는 않지만 결정을 내리는 것은 논리적으로 충분합니다.


2
나는 3.5에 있습니다. WP3.3.1부터 digiwp에서이 문제가 해결되었습니다.
somatic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.