맞춤 게시물 유형 게시물 URL에서 슬러그 제거


48

사용자 정의 게시물 유형 슬러그를 제거하는 주제를 기반으로하는 모든 웹 리소스

yourdomain.com/CPT-SLUG/post-name 

이전 WP 버전 3.5 설치를 참조하는 매우 오래된 솔루션입니다. 일반적인 방법은 다음과 같습니다.

'rewrite'   => array( 'slug' => false, 'with_front' => false ),  

register_post_type 함수 내에서. 이것은 더 이상 작동하지 않으며 오도의 소지가 있습니다. 그래서 2018 년 3 분기에 WordPress 5 직전에 커뮤니티에 문의하십시오.

다시 쓰기 인수 또는 다른 곳에서 사용자 정의 게시물 유형 게시물의 URL에서 게시물 유형 슬러그를 제거하는 현대적이고 효율적인 방법은 무엇입니까?

업데이트 : 이것을 정규식으로 작동시키는 몇 가지 방법이있는 것 같습니다. 특히 Jan Beck의 답변은 충돌하는 페이지 / 게시 이름이 생성되지 않도록 컨텐츠 생성을 지속적으로 모니터링 할 의향이 있어야합니다. 그러나 이것이 WP 코어에서 우리를 위해 처리해야하는 주요 약점이라고 확신합니다. . CPT 작성시 옵션 / 후크 또는 퍼머 링크에 대한 고급 옵션 세트로 사용됩니다. 트랙 티켓을 지원하십시오.

각주 :이 trac 티켓을 시청 / 홍보하여 ​​지원하십시오 : https://core.trac.wordpress.org/ticket/34136#ticket


왜 그렇게하길 원하는지 머리를 긁고있는 것 같아요? 혼란스러워.
Michael Ecklund

3
@MichaelEcklund @ 공개 웹 페이지를 만드는 데 사용되는 모든 CPT가 URL에 강제 슬러그 이름을 가지고 있기 때문입니다. 실제로 슬러그를 안전하게 제거하려는 많은 wp 개발자가 있습니다.
Ben Racicot

답변:


60

다음 코드는 작동하지만 사용자 정의 게시물 유형의 슬러그가 페이지 또는 게시물의 슬러그와 동일한 경우 충돌이 쉽게 발생할 수 있음을 명심해야합니다.

먼저 퍼머 링크에서 슬러그를 제거합니다 :

function na_remove_slug( $post_link, $post, $leavename ) {

    if ( 'events' != $post->post_type || 'publish' != $post->post_status ) {
        return $post_link;
    }

    $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

    return $post_link;
}
add_filter( 'post_type_link', 'na_remove_slug', 10, 3 );

슬러그를 제거하는 것만으로는 충분하지 않습니다. WordPress는 게시물과 페이지가 이러한 방식으로 만 작동하기 때문에 404 페이지가 표시됩니다. 다음을 추가해야합니다.

function na_parse_request( $query ) {

    if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
        return;
    }

    if ( ! empty( $query->query['name'] ) ) {
        $query->set( 'post_type', array( 'post', 'events', 'page' ) );
    }
}
add_action( 'pre_get_posts', 'na_parse_request' );

'이벤트'를 맞춤 게시물 유형으로 변경하기 만하면됩니다. 영구 링크를 새로 고쳐야 할 수도 있습니다.


감사. 재 작성을 수동으로 작성하는 것보다 낫다고 생각하십니까? 나는 그 해결책을 보았고 언급 한 갈등을 막을 수 있습니까?
Ben Racicot

1
조건 때문에 nginx로 실패합니다 2 != count( $query->query ). nginx를 사용하면 $ query-> query를 다음과 같이 가질 수 있습니다 array('page' => '', 'name' => '...', 'q' => '...'). @NateAllen, 그 조건의 의미는 무엇입니까?
Fabio Montefuscolo

3
이보다 더 좋은 것이 필요합니다. 나중에 충돌하는 URL을 만들 수 없도록 내장 된 슬러그 제거 지원. 일반 게시물과 페이지에서 URL을 만드는 방법
Ben Racicot

3
그것은 단지 나입니까, 아니면 is_single () 및 is_singular ()와 같은 워드 프레스 조건부 태그를 깨뜨 립니까?
rob-gordon

1
이 솔루션은 불행히도 일부 링크가 끊어졌고 블로그에서 게시물 표시가 중단되었으며 정상적인 페이지였습니다. Matt Keys의 더 나은 솔루션을 아래에서보십시오.
Radley Sustaire

20

분류법 등록에 다음 코드를 작성하십시오.

'rewrite' => [
  'slug' => '/',
  'with_front' => false
]

코드 변경 후해야 할 가장 중요한 일

맞춤 게시물 유형 분류법 문서를 변경 한 후 설정> 영구 링크 로 이동하여 설정다시 저장해보십시오 . 그렇지 않으면 404 페이지를 찾을 수 없습니다.

가장 좋은 해결책은 여기를 확인하십시오 : http://www.krazzycodes.com/how-to-remove-custom-post-type-taxonomy-base-from-url-in-wordpress/


이것은 실제로 작동합니다. 나는 아무도 아무도 이것을 전에 눈치 채지 못했습니다. 물론 이것은 다른 페이지가 동일한 퍼머 링크를 갖는 경우 다른 페이지를 방해 할 수 있지만 그렇지 않은 경우에는 훌륭한 솔루션입니다.
Aleksandar Đorđević

4
이것을 시도했다. 내 맞춤 게시물 유형 링크에 원하는 결과를 제공합니다. 그러나 모든 POST 또는 PAGE 게시물 유형 슬러그를 '잡아'내 사용자 정의 게시물 유형의 URL로 해결 한 다음 404를 찾습니다. (예, 영구 링크를 저장했습니다).
Matt Keys

4
작동하지 않습니다. 영구 링크를 업데이트 한 경우에도 404를 제공합니다.
Christine Cooper

3
다시 말하지만, 퍼머 링크 설정을 다시 저장 한 후에도 게시물과 페이지가 더 이상 작동하지 않습니다 (404)
amklose

1
이 솔루션은 URL에서 슬러그를 제거하는 데 효과적입니다. 그러나 보관 페이지는 더 이상 작동하지 않습니다.
안나 푸르나

13

나는 오래 전에 이것을 알아 내려고 노력했으며 내가 아는 것에 대한 짧은 대답은 아니오 입니다. 적어도 재 작성 인수 내에서는 아닙니다.

당신의 실제 코드를 보면 긴 설명이 분명해집니다 register_post_type에서 / post.php 라인 1454 WP-포함 :

add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $permastruct_args );

다시 쓰기 태그의 접두사 $args->rewrite['slug']를 볼 수 있습니다 %$post_type%. null몇 줄을 찾을 때까지 " 그냥 슬러그를 설정하자"고 생각할 수 있습니다.

if ( empty( $args->rewrite['slug'] ) )
    $args->rewrite['slug'] = $post_type;

함수는 항상 비어 있지 않은 포스트 값을 사용하는 슬러그 값을 예상 한다는 것을 알 수 있습니다 .


감사합니다 @JanBeck. 이것이 존재하는 주된 이유가 있습니까? 이 규칙에서 특정 게시물 유형을 생략하기 위해이 코어 파일을 조건부로 해킹하지 않는 이유는 무엇입니까?
Ben Racicot

9
Jan Beck에게 답변을 수여해야합니다. WordPress는 요청을 올바르게 라우팅하기 위해 post_type 슬러그가 필요합니다. 이 규칙은 기본 WP 페이지 (슬러그없이 렌더링)와 모든 사용자 정의 게시물 유형 간의 이름 충돌을 방지합니다. 슬러그를 해킹하면 WordPress는 "picnic"이라는 페이지와 "picnic"이라는 이벤트 (사용자 정의 게시물 유형)의 차이점을 알 수 없습니다.
dswebsme

3
@dswebsme 동의하지만 URL을 반드시 변경해야하는 상황이 있습니다. 따라서 왜 기본적으로 할 수없고하지 말아야하는 것 외에 어떻게 그렇게 효율적으로합니까?
Ben Racicot

7

에 대한 응답으로 내 이전 대답 : 당신은 물론 설정할 수 rewrite에 매개 변수 false새 게시물의 유형을 등록 할 때 및 재 작성이과 같이 자신을 규칙 처리

<?php
function wpsx203951_custom_init() {

    $post_type = 'event';
    $args = (object) array(
        'public'      => true,
        'label'       => 'Events',
        'rewrite'     => false, // always set this to false
        'has_archive' => true
    );
    register_post_type( $post_type, $args );

    // these are your actual rewrite arguments
    $args->rewrite = array(
        'slug' => 'calendar'
    );

    // everything what follows is from the register_post_type function
    if ( is_admin() || '' != get_option( 'permalink_structure' ) ) {

        if ( ! is_array( $args->rewrite ) )
            $args->rewrite = array();
        if ( empty( $args->rewrite['slug'] ) )
            $args->rewrite['slug'] = $post_type;
        if ( ! isset( $args->rewrite['with_front'] ) )
            $args->rewrite['with_front'] = true;
        if ( ! isset( $args->rewrite['pages'] ) )
            $args->rewrite['pages'] = true;
        if ( ! isset( $args->rewrite['feeds'] ) || ! $args->has_archive )
            $args->rewrite['feeds'] = (bool) $args->has_archive;
        if ( ! isset( $args->rewrite['ep_mask'] ) ) {
            if ( isset( $args->permalink_epmask ) )
                $args->rewrite['ep_mask'] = $args->permalink_epmask;
            else
                $args->rewrite['ep_mask'] = EP_PERMALINK;
        }

        if ( $args->hierarchical )
            add_rewrite_tag( "%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&pagename=" );
        else
            add_rewrite_tag( "%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=" );

        if ( $args->has_archive ) {
            $archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive;
            if ( $args->rewrite['with_front'] )
                $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;
            else
                $archive_slug = $wp_rewrite->root . $archive_slug;

            add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' );
            if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) {
                $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';
                add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
                add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
            }
            if ( $args->rewrite['pages'] )
                add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' );
        }

        $permastruct_args = $args->rewrite;
        $permastruct_args['feed'] = $permastruct_args['feeds'];
        add_permastruct( $post_type, "%$post_type%", $permastruct_args );
    }
}
add_action( 'init', 'wpsx203951_custom_init' );

이제 add_permastruct통화에 더 이상 슬러그가 포함되어 있지 않은 것을 볼 수 있습니다 . 두 가지 시나리오를 테스트했습니다.

  1. "달력"슬러그로 페이지를 만들면 "달력"슬러그를 사용하는 게시물 유형 아카이브로 해당 페이지를 덮어 씁니다.

여기에 이미지 설명을 입력하십시오

  1. 슬러그 "my-event"가있는 페이지와 슬러그 "my-event"가있는 이벤트 (CPT)를 만들면 사용자 정의 게시물 유형이 표시됩니다.

여기에 이미지 설명을 입력하십시오

  1. 다른 페이지도 작동하지 않습니다. 위 그림을 보면 이유가 분명해집니다. 사용자 정의 게시물 유형 규칙은 항상 페이지 슬러그와 일치합니다. WordPress가 존재하지 않는 페이지 또는 사용자 정의 게시물 유형인지 식별하는 방법은 없으므로 404를 반환합니다. 따라서 페이지 나 CPT를 식별하기 위해 슬러그가 필요합니다. 가능한 해결책은 오류를 가로 채고이 답변과 비슷한 페이지를 찾는 입니다.

따라서 CPT에 대한 슬러그를 제거하는 것이 목표라면 어쨌든 URL에서 볼 수 없으므로 CPT가 충돌하지 않는 고유 한 이름을 지정할 수 없습니까? 아니면 이름이 페이지와 같은 이름 일 경우 충돌 가능성이 있습니까?
Ben Racicot

이것이 실제로 모든 페이지를 손상 시킨다는 것을 보여주기 위해 답변을 업데이트했습니다 . 슬러그가 없으면 WP는 페이지 대신 CPT를 찾아서 찾지 못하면 오류를 반환합니다. 따라서 실제로 이름과 관련이 없습니다.
Jan Beck

1
내가 참조. 기본 WP 게시물과 페이지와 같이 충돌하는 URL에 '-1'을 추가하는 다시 쓰기 규칙이 있어야합니다. trac ticket core.trac.wordpress.org/ticket/34136#ticket을 만들었습니다 .
Ben Racicot

7

여기에 대한 답변을 살펴보면 위에서 배운 것들을 결합하고 자동 감지 및 중복 포스트 슬러그 방지를 추가하는 더 나은 솔루션을위한 공간이 있다고 생각합니다.

참고 : 아래 예제에서 CPT 이름을 'custom_post_type'으로 변경하십시오. 많은 경우가 있으며 '찾기 / 바꾸기'는 모두를 쉽게 잡을 수있는 방법입니다. 이 코드는 모두 functions.php 또는 플러그인에 있습니다.

1 단계 : 게시물을 등록 할 때 다시 쓰기를 'false'로 설정하여 사용자 정의 게시물 유형에서 다시 쓰기 비활성화

register_post_type( 'custom_post_type',
    array(
        'rewrite' => false
    )
);

2 단계 : custom_post_type에 대한 사용자 정의 재 작성을 WordPress 재 작성 하단 에 수동으로 추가

function custom_post_type_rewrites() {
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&embed=true', 'bottom');
    add_rewrite_rule( '([^/]+)/embed/?$', 'index.php?custom_post_type=$matches[1]&embed=true', 'bottom');
    add_rewrite_rule( '([^/]+)/trackback/?$', 'index.php?custom_post_type=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '([^/]+)/page/?([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&paged=$matches[2]', 'bottom');
    add_rewrite_rule( '([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '([^/]+)(?:/([0-9]+))?/?$', 'index.php?custom_post_type=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&embed=true', 'bottom');
}
add_action( 'init', 'custom_post_type_rewrites' );

참고 : 필요에 따라 위의 다시 쓰기를 수정 (트랙백 비활성화? 피드? 등) 할 수 있습니다. 1 단계에서 다시 쓰기를 비활성화하지 않은 경우 생성 된 '기본'다시 쓰기 유형을 나타냅니다.

3 단계 : 맞춤 게시물 유형 '예쁜'에 대한 영구 링크를 다시 만듭니다 .

function custom_post_type_permalinks( $post_link, $post, $leavename ) {
    if ( isset( $post->post_type ) && 'custom_post_type' == $post->post_type ) {
        $post_link = home_url( $post->post_name );
    }

    return $post_link;
}
add_filter( 'post_type_link', 'custom_post_type_permalinks', 10, 3 );

참고 : 사용자가 다른 게시물 유형으로 충돌하는 (중복 된) 게시물을 작성하는 것에 대해 걱정하지 않으면 페이지를 요청할 때 그 중 하나만로드 할 수있는 상황이 발생할 수 있습니다.

4 단계 : 중복 포스트 슬러그 방지

function prevent_slug_duplicates( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) {
    $check_post_types = array(
        'post',
        'page',
        'custom_post_type'
    );

    if ( ! in_array( $post_type, $check_post_types ) ) {
        return $slug;
    }

    if ( 'custom_post_type' == $post_type ) {
        // Saving a custom_post_type post, check for duplicates in POST or PAGE post types
        $post_match = get_page_by_path( $slug, 'OBJECT', 'post' );
        $page_match = get_page_by_path( $slug, 'OBJECT', 'page' );

        if ( $post_match || $page_match ) {
            $slug .= '-duplicate';
        }
    } else {
        // Saving a POST or PAGE, check for duplicates in custom_post_type post type
        $custom_post_type_match = get_page_by_path( $slug, 'OBJECT', 'custom_post_type' );

        if ( $custom_post_type_match ) {
            $slug .= '-duplicate';
        }
    }

    return $slug;
}
add_filter( 'wp_unique_post_slug', 'prevent_slug_duplicates', 10, 6 );

참고 : 이렇게하면 중복 슬러그 끝에 문자열 '-duplicate'가 추가됩니다. 이 코드는이 솔루션을 구현하기 전에 중복 슬러그가 이미 존재하는 경우이를 방지 할 수 없습니다. 먼저 중복을 확인하십시오.

나는 이것도 그들에게 잘 작동하는지 보러 가면 다른 사람들의 의견을 듣고 싶습니다.


방금 테스트 한 결과 지금까지 작동하는 것 같습니다.
Christine Cooper

이 접근 방식에 대한 희망이 있었지만 영구 링크를 다시 저장 한 후에도 CPT 게시물에 404를 제공합니다.
Garconis

Garconis에서 작동하지 않아 죄송합니다. 나는 이것에 대해 잠시 다른 사람과 이야기하고 있었고 그들은 또한 그들의 사이트에서 그것에 대해 문제가있었습니다. 블로그 게시물 퍼머 링크에 접두사가 있으면 문제가된다는 것을 기억합니다. 내가 블로그 게시물을 위해 이것을 개발 한 사이트에서 permalink 구조를 사용하고 있습니다 : / blog / % postname % /. 블로그 게시물에 접두사가 없어도 괜찮은 경우 사용해보고 진행 방법을 알려주십시오!
Matt Keys

2
이것은 나를 위해 일했습니다. 페이지의 다른 솔루션과 달리 일반 페이지 또는 블로그 레이아웃을 손상시키지 않았으며 무한 리디렉션을 유발하지 않았습니다. cpt 페이지를 편집 할 때 "퍼머 링크"영역에 올바른 URL도 표시됩니다. 여기서 좋은 해결책은 보관 페이지가 작동하지 않는다는 것입니다. 기억 "custom_post_type"을 교환 하고 나중에 당신의 영구 링크를 새로 고침 .
Radley Sustaire

@MattKeys에서 기본 영구 링크 설정은 사용자 정의 구조가입니다 /%category%/%postname%/. 코드를 추가 할 때 CPT 슬러그는 괜찮아 보이지만 (마지막 슬래시는 없지만) 충돌 검사기도 작동합니다. 그러나 실제 게시물의 결과는 404입니다.
Garconis

1

너무 많은 하드 코드가 필요하지 않습니다. 가벼운 플러그인을 사용하십시오.

사용자 정의 가능한 옵션이 있습니다.


이제 내가 왜 다운 보트를 받았는지 알기 때문에 정상적인 페이지 링크가 해결되지 않습니다. 새로 고침에도 불구하고 기존 페이지의 캐시 된 사본을 받고 있었기 때문에 그것을 보지 못했습니다.
Walf

@Walf 문제에 대해 자세히 알려줄 수 있습니까?
T.Todua

기본 메뉴에서 페이지 (사용자 정의 게시물 유형이 아님)에 대한 링크를 따라 가면 페이지가 존재하지 않는 것처럼 404 오류가 발생했습니다. 그게 다야.
Walf

@Walf 당신은 당신의 경우의 url 예제를 줄 수 있습니까? (원하는 경우 도메인 이름을 커버 할 수 있습니다. 예가 필요합니다.) 감사합니다. 업데이트해야합니다.
T.Todua

1

여기에도 같은 문제가 있었으며 워드 프레스 사이트에는 아무런 움직임이없는 것 같습니다. 단일 블로그 게시물의 경우 / blog / % postname % / 구조가 필요한 특정 상황 에서이 솔루션

https://kellenmace.com/remove-custom-post-type-slug-from-permalinks/

404의 무리에서 끝났다

그러나 블로그 포스트에 백엔드 permalink strukture를 사용하지 않는이 멋진 접근 방식과 함께 마침내 매력처럼 작동합니다. https://www.bobz.co/add-blog-prefix-permalink-structure-blog-posts/

무리 감사.


0

위에서 언급 한 기능을 약간 변경할 수 있습니다.

function na_parse_request( $query ) {

if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
    return;
}

if ( ! empty( $query->query['name'] ) ) {
    $query->set( 'post_type', array( 'post', 'events', 'page' ) );
}
}

에:

function na_parse_request( $query ) {

if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
    return;
}

if ( ! empty( $query->query['name'] ) ) {

    global $wpdb;
    $pt = $wpdb->get_var(
        "SELECT post_type FROM `{$wpdb->posts}` " .
        "WHERE post_name = '{$query->query['name']}'"
    );
    $query->set( 'post_type', $pt );
}
}

올바른 post_type 값을 설정하기 위해.


0

이것은 나를 위해 일했다 : 'rewrite' => array('slug' => '/')


1
작동하지 않습니다. 영구 링크를 업데이트 한 경우에도 404를 제공합니다.
Christine Cooper

0

내가 한 것처럼 자식 게시물에 문제가있는 이것을 읽는 사람에게는 가장 좋은 방법은 자신의 다시 쓰기 규칙을 추가하는 것입니다.

내가 겪었던 주요 문제는 WordPress가 2 레벨 (자식 게시물)의 페이지 리디렉션을 3 레벨 (자식 게시물의 자식)보다 약간 다르게 처리한다는 것입니다.

즉, / post-type / post-name / post-child /를 사용하면 / post-name / post-child를 사용할 수 있고 post-type이 앞에있는 것으로 리디렉션하지만 post-type이있는 경우 / post-name / post-child / post-grandchild 그러면 post-name / post-child / post-grandchild를 사용할 수 없습니다.

다시 쓰기 규칙을 살펴보면 첫 번째 및 두 번째 수준의 페이지 이름 이외의 항목과 일치하는 것처럼 보이며 (두 번째 수준은 첨부 파일과 일치한다고 생각합니다) 적절한 게시물로 리디렉션하기 위해 무언가를 수행합니다. 세 가지 수준에서는 작동하지 않습니다.

가장 먼저해야 할 일은 자식에서 게시물 유형 링크를 제거하는 것입니다. 위의 Nate Allen의 답변을 보면이 논리가 여기에서 발생합니다.

$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

나 자신은 올바른 조건에 도달하기 위해 게시물에 자식이 있는지 여부를 확인하기 위해 다양한 조건을 혼합하여 사용했습니다. 이 부분은 너무 까다 롭지 않으며 다른 곳에서 사람들의 예를 찾을 수 있습니다.

다음 단계는 주어진 답변에서 상황이 바뀌는 곳입니다. 기본 쿼리에 항목을 추가하는 대신 (사용자 정의 게시물 및 하위 항목은 작동하지만 하위 항목은 제외) WordPress 규칙의 맨 아래에있는 다시 쓰기를 추가하여 페이지 이름이 체크 아웃되지 않았고 404를 누르면 사용자 정의 게시물 유형의 페이지가 동일한 이름을 갖는지 확인하기 위해 마지막으로 한 번 확인합니다. 그렇지 않으면 404를 버립니다.

여기에 'event'가 CPT의 이름이라고 가정 한 재 작성 규칙이 있습니다.

function rewrite_rules_for_removing_post_type_slug()
{
    add_rewrite_rule(
        '(.?.+?)?(:/([0-9]+))?/?$',
        'index.php?event=$matches[1]/$matches[2]&post_type=event',
        'bottom'
    );
}

add_action('init', 'rewrite_rules_for_removing_post_type_slug', 1, 1);

이것이 다른 누군가를 돕기를 바랍니다. 아이 게시물의 자식과 관련이 있거나 슬러그를 제거하는 다른 것을 찾을 수 없었기를 바랍니다.


정규식에 오타가있는 것 같습니다. '(:') 사이에 '?'를 사용하여 캡처하지 않는 하위 패턴으로 사용하려면 => '(? :'입니다. 세 번째?는 첫 번째 하위 패턴을 비울 수 있으므로 잘못 배치 된 것 같습니다. 이 오타가 없으면 표현은 내장 게시물 유형 'page'에서 찾을 수있는 것과 동일합니다.
jot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.