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


15

이에 대한 유용한 답변을 찾지 못했습니다. 충돌 문제와 이로 인해 발생할 수있는 모든 문제에 대해 알고 있습니다. 제안되지 않은 경우 궁금합니다. 이것은 WP 재 작성이 필요할 것입니다.

기본적으로 CPT가 "이벤트"라고 가정 해 봅시다. 단일 이벤트 페이지에 URL http://domain.com/single-event-name 과 NOT http://domain.com/events/single-event-name 을 갖기를 원합니다 . 그것에 대한 방법에 대한 아이디어가 있습니까?


항상 그것에 대해 알고 싶었고 질문을 생각하지 않았습니다. 감사!
fischi

2015 년 @robbennet은 여전히 ​​스타일로이를 수행하는 합법적 인 방법이 아닌 것 같습니다.
Ben Racicot

답변:


9

그것이 당신이 일의 첫 부분을 할 수있는 방법입니다-게시물 링크에서 CPT 슬러그를 제거하십시오 (예 : 뉴스 게시물 유형).

function df_custom_post_type_link( $post_link, $id = 0 ) {  

    $post = get_post($id);  

    if ( is_wp_error($post) || 'news' != $post->post_type || empty($post->post_name) )  
        return $post_link;  

    return home_url(user_trailingslashit( "$post->post_name" ));  
}
add_filter( 'post_type_link', 'df_custom_post_type_link' , 10, 2 );

404 오류가 발생하기 때문에 '뉴스'에 대한 다시 쓰기 규칙이 있어야합니다.

다음과 같이 다시 쓰기 규칙을 추가하십시오.

function df_custom_rewrite_rule() {
    add_rewrite_rule('(.*?)$', 'index.php?news=$matches[1]', 'top');
}
add_action('init', 'df_custom_rewrite_rule');

그런 다음 다시 쓰기 규칙을 플러시해야하므로 설정-영구 링크로 이동하여 변경 사항을 저장하십시오.


1
init에 다시 쓰기 규칙을 추가해서는 안됩니다. 현재 규칙에 규칙을 추가하면됩니다.
Chris_O

2
@Chris_O 정교하게 할 수 있습니까? 현재 규칙에 규칙을 어떻게 추가합니까?
Desi

이 코드를 추가 한 후 example.com/about-us 와 같은 URL을 가진 모든 페이지가 작동을 멈췄습니까? 이것에 대한 해결책?
Rahul Gupta

4

이 플러그인 ( http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/ )을 사용하여 슬러그를 제거 할 수 있지만 퍼머 링크 구조가 "/ % postname 인 경우에만 작동합니다. % /


정확히이 플러그인은 굉장합니다! 이 플러그인의 숙련 된 사용자이며 완전히 추천합니다! 다음은 플러그인 사이트의 링크입니다. ultimatewebtips.com/remove-slug-from-custom-post-type
Kuldeep Daftary

이것은 좋은 플러그인이며, 내가 찾던 기능을 정확하게 가지고 있습니다. @bartosz 솔루션은 하나의 CPT에 대한 것이지만 일반적인 아이디어는 얻습니다. 이 플러그인을 파고 들고 나면 이제 확실합니다. 감사합니다!
fischi

0

요청 된 이름을 가진 사용자 정의 유형이 존재하는지 확인한 다음 query_vars를 적절하게 수정하기 위해 항상 "parse_request"에 연결할 수 있습니다. 퍼머 링크를 생성하기 위해 @Bartosz의 응답 라인을 따라 무언가가 필요합니다.

 add_filter('parse_request', "t21_parse_request" , 1, 1);

 function t21_parse_request($wbobj)
 {
      $vars = $wpobj->query_vars;
      $slug = $query_vars['pagename'];

      $posts = get_posts(array(
           "post_type" => "event",
           "post_name" => $slug
      ));

      if($posts)
      {
           //we know your "event" entry exists so we now amend the query_vars
           //first unset the 'page' and 'pagename'
           unset($query_vars['page']);
           unset($query_vars['pagename'];

           //now rebuild the query_vars
           $query_vars['post_type'] = "event"; //CPT name
           $query_vars['name'] = $slug;
           $query_vars['event'] = $slug //again - this constructs the "event=myevent" query string
      }
      else
      {
           //just return $wpobj since we know that there is no "event"
           return $wpobj;
      }
 }

그러나 이것은 게시물 이름과 이름이 같은 게시물 이름이 없다고 가정합니다. 그렇지 않으면 게시물이 이벤트 유형과 먼저 일치하는 것처럼 표시되지 않습니다.


0
function register_cpt_type() {
    register_post_type('cpt', array(
        'rewrite' => array("slug" => "/cpt", "with_front" => false),
    ));
}
add_action('init', 'register_cpt_type')

function cpt_rewrite_rule() {
    add_rewrite_rule('(.*?)$', 'index.php?cpt=$matches[1]', 'top');
}
add_action('after_theme_setup', 'cpt_rewrite_rule');

URL 재 작성 / 재활용 후 .htaccess를 편집하십시오.

RewriteRule ^cpt/(.+)$ /$1 [R=301,L]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.