사용자 정의 분류법 및 기본 이름 / 부모 세금 / 자녀 세금 / 사용자 정의 포스트 유형 이름과 같은 사용자 정의 게시물 유형으로 퍼머 링크 구조를 작성하는 방법


53

나는 대답을 위해이 사이트와 Google을 빗질하고 있었고 완전히 비워졌습니다. 기본적으로 나는 이 게시물이 요구 하는 것을 정확하게하고 싶지만 계층 적 분류법이 필요합니다. 그 게시물에 주어진 대답은 훌륭하지만 단일 수준의 분류법으로 만 작동합니다. 내가 원하는 것을 할 수 있습니까? 나는 백만 가지를 시도했지만 아무 효과가 없으며 기껏해야 올바른 영구 링크를 얻을 수 있지만 404가 나옵니다.

내가 원하는 것을 시각적으로 설명하려면 :

/basename/ - ideally a page, but I think this will cause a permalink collision    
/basename/top-cat/ - top parent custom taxonomy archive    
/basename/top-cat/child-cat/ - child cat custom taxonomy archive     
/basename/top-cat/child-cat/grandchild-cat/ - grandchild cat custom taxonomy archive    
/basename/top-cat/child-cat/grandchild-cat/post-name/ - my custom post type post

기본 제공 게시물 및 카테고리를 사용하여이 작업을 수행 할 수 있습니다. 사용자 지정 분류 및 사용자 지정 게시물 유형을 사용하여이를 수행하는 방법은 무엇입니까? 'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),아카이브 페이지에서 제대로 작동하는 계층 슬러그를 얻는 데 사용해야 하지만 사용자 정의 게시물 유형 게시물은 404가됩니다. 'hierarchical' => true부품을 제거 하면 게시물이 작동하지만 계층 URL은 잃어 버립니다 (/ basename 만) / grandchild-cat / post-name / works).

그래서 어떤 해결책? 정말 고마워요, 이것은 지금 약 3 주간 나에게 견과류를 몰고 왔습니다.

답변:


68

다른 답변을 잔뜩 결합한 후 작동했습니다! 여기에 어려움을 겪고있는 사람들을위한 해결책이 있습니다.

이 게시물이이 사람은 그 사람 덕분에, 그래서 어떤 날을 도왔다.

이 모든 코드와 초기 사용자 정의 게시물 유형 및 분류법 등록 코드는 functions.php파일에 포함됩니다.

먼저 사용자 정의 포스트 유형 및 분류 체계를 정의 할 때 바로 슬러그를 얻을 : 사용자 정의 포스트 유형은해야 basename/%taxonomy_name%하고 분류에 대한 슬러그 그냥해야한다 basename. 'hierarchical' => trueURL에서 중첩 용어를 얻으려면 분류 재 작성 배열에 추가 하는 것을 잊지 마십시오 . 또한 두 경우 모두 query_var로 설정되어 있어야 true합니다.

WordPress에서 URL 구조를 해석하는 방법을 알 수 있도록 새로운 다시 쓰기 규칙을 추가해야합니다. 필자의 경우 uri의 사용자 정의 게시물 유형 부분은 항상 5 번째 uri 세그먼트가되므로 일치 규칙을 적절하게 정의했습니다. URI 세그먼트를 더 많거나 적게 사용하는 경우이를 변경해야 할 수도 있습니다. 다양한 수준의 중첩 용어가있는 경우 마지막 URI 세그먼트가 사용자 정의 게시물 유형인지 또는 분류 규칙 용어인지 여부를 확인하는 함수를 작성해야합니다. 그).

add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
    $newRules  = array();
    $newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment
    $newRules['basename/(.+)/?$']                = 'index.php?taxonomy_name=$matches[1]'; 

    return array_merge($newRules, $rules);
}

그런 다음 %taxonomy_name%사용자 정의 포스트 유형 재 작성 슬러그 구조 를 처리하는 방법을 워크 프레스가 사용할 수 있도록이 코드를 추가해야합니다 .

function filter_post_type_link($link, $post)
{
    if ($post->post_type != 'custom_post_type_name')
        return $link;

    if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
    {
        $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'taxonomy_name', false, '/', true), $link); // see custom function defined below
    }
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

Wordpress 자체를 기반으로 사용자 지정 함수를 만들었습니다 get_category_parents.

// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) {    
    $chain = '';   
    $parent = &get_term($id, $taxonomy);

    if (is_wp_error($parent)) {
        return $parent;
    }

    if ($nicename)    
        $name = $parent -> slug;        
else    
        $name = $parent -> name;

    if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {    
        $visited[] = $parent -> parent;    
        $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);

    }

    if ($link) {
        // nothing, can't get this working :(
    } else    
        $chain .= $name . $separator;    
    return $chain;    
}

그런 다음 퍼머 링크를 플러시해야합니다 (퍼머 링크 설정 페이지를로드하기 만하면됩니다).

이제 모든 것이 희망적으로 작동해야합니다! 분류 분류 용어를 작성하여 올바르게 중첩 한 다음 사용자 정의 게시물 유형 게시물을 작성하고 올바르게 분류하십시오. slug로 페이지를 만들 수도 basename있으며 모든 것이 내 질문에 지정된 방식으로 작동합니다. 사이드 바에 중첩 된 카테고리를 표시하기 위해 사용자 정의 분류 아카이브 페이지를 작성하여 분류 방식 위젯 플러그인을 추가하고 추가하는 방법을 제어 할 수 있습니다 .

희망이 당신을 도와줍니다!


고정-질문을 참조하십시오. 제프, 설명해 주셔서 감사합니다! 그러나 사용자 정의 posttype / taxonomy 빌드를 게시 할 수 있습니까? 그래서 내가 뭘 잘못 하고 있는지 알 수 있습니까? 정말 감사합니다!
Reitze Bos

Jeff, 답변 해 주셔서 감사합니다! 나는 4 시간 후에 이것과 싸우고 나면 거의 거기에 있습니다. 내 유일한 문제는 게시물 이름 앞에 이중 슬래시가 있다는 것입니다 (포트폴리오 : diseno-grafico-2 / logo // alquimia-sonora /) 도와주세요?
Cmorales

1
@Cmorales, 코드를 보지 않고도 확실하지 않지만 cpt 슬러그 등록 또는 filter_post_type 함수와 같이 게시물 이름 앞에 슬래시를 수동으로 정의하는 장소를 찾으십니까? 여분의 슬래시를 추가하는 위치를 추적 할 수없는 경우 filter_post_type_link에서 호출 된 get_taxonomy_parents 함수의 반환 값에서 마지막 문자를 제거 할 수 있습니다. 두배. 행운을 빕니다.
Jeff

1
"다양한 수준의 중첩 용어가있는 경우 마지막 URI 세그먼트가 사용자 정의 게시물 유형인지 또는 분류 규칙 용어를 추가하여 어떤 규칙을 추가해야하는지 확인하는 기능을 작성해야합니다 (도움이 필요한 경우 문의하십시오) ...) 글쎄, 제발 도와 줄래? :)
Cmorales

2
^ 정확히 내가 필요한 것입니다. 아무도 그것을하는 방법을 알고 있습니까? 여기 내 질문을 참조하십시오 : wordpress.stackexchange.com/questions/102246/…
reikyoushin

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