플러그인 커스텀 포스트 유형의 선언 / 변경 슬러그


28

플러그인을 수정하지 않고 플러그인의 기존 사용자 정의 게시물 유형의 슬러그를 다시 선언 / 변경할 수 있습니까?

즉, 플러그인 X가 슬러그 / uncookedtoast /를 사용하여 사용자 정의 게시물 유형을 만드는 경우 슬러그를 / bread /로 변경하는 functions.php (또는 이와 유사한 것)에 필터를 추가 할 수 있습니까?


방금 우선 순위가 20 인 init에 연결 한 다음 동일한 게시물 유형에 대해 register_post_type을 다시 호출 하여이 동일한 문제를 해결했습니다. 이것이 내가 길에서 어떤 문제를 일으킬 것인지 아는 사람이 있습니까?
더스틴

답변:


24

예, 가능하지만 플러그인이 rewrite => array('slug' => 'post_type')매개 변수를 사용하여 사용자 정의 게시물 유형을 작성하는 경우 슬러그 를 교체 할 가능성이 없습니다 .

사용자 정의 게시물 유형이 작성 될 때마다 URL 재 작성 규칙이 데이터베이스에 기록됩니다. 어떤 조치가 사용자 정의 게시 유형 (예 : 초기화 조치) 작성을 트리거하는지에 따라 WordPress는 변경 시도와 상관없이 다시 쓰기 규칙을 비우고 사용자 정의 게시 유형의 슬러그를 복원합니다.

즉, 사용자 정의 포스트 유형에 대해 사용자 정의 슬러그를 제공 할 수 있습니다. 다음 예제는 사용자 정의 게시물 유형이 movies있고 /movies/슬러그를 (으) 로 변경하려고 시도 한다고 가정합니다 /films/.

다음은 movies맞춤 게시물 유형 을 정의하는 데 사용되는 기본 기능 입니다. 당신이 참조하는 플러그인은 다음과 같이해야합니다 :

function movies_register_post_type() {

    register_post_type(
        'movies',
        array(
            'labels' => array(
                'name' => __('Movies'),
                'singular_name' => __('Movie')
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => array(
                'slug' => 'movies'
            )
        )
    );

} // end example_register_post_type
add_action('init', 'movies_register_post_type');

기존 게시물 유형에 따라 고유 한 사용자 지정 규칙을 제공하여 옵션 테이블을 수정할 수 있습니다.

기본적으로이 작업을 수행합니다.

  • 기존 규칙 집합을 취한 다음 자체 사용자 정의 슬러그로 자체 규칙을 작성하십시오.
  • 새 규칙에 맞춤 게시물 유형의 슬러그보다 우선 순위를 높입니다.

이를 수행하는 방법은 다음과 같습니다.

function add_custom_rewrite_rule() {

    // First, try to load up the rewrite rules. We do this just in case
    // the default permalink structure is being used.
    if( ($current_rules = get_option('rewrite_rules')) ) {

        // Next, iterate through each custom rule adding a new rule
        // that replaces 'movies' with 'films' and give it a higher
        // priority than the existing rule.
        foreach($current_rules as $key => $val) {
            if(strpos($key, 'movies') !== false) {
                add_rewrite_rule(str_ireplace('movies', 'films', $key), $val, 'top');   
            } // end if
        } // end foreach

    } // end if/else

    // ...and we flush the rules
    flush_rewrite_rules();

} // end add_custom_rewrite_rule
add_action('init', 'add_custom_rewrite_rule');

이제 두 가지 방법으로 영화에 액세스 할 수 있습니다.

  • /movies/Back-To-The-Future
  • /films/Back-To-The-Future

액션이 너무 자주 발생 add_custom_rewrite_rule하므로 init액션에 연결하는 것은 권장하지 않습니다 . 이것은 단지 예일뿐입니다. 이 기능을 적용하기에 더 좋은 곳은 테마 활성화, 플러그인 활성화, 아마도 save_post 액션 등에 있습니다. 수행해야 할 작업에 따라 한 번 또는 몇 번만 실행하면됩니다.

이 시점에서 ' /movies/슬러그 를 사용하도록 맞춤 게시물 유형에 대한 퍼머 링크를 업데이트하는 것이 좋습니다 . 예를 들어로 이동하면 /films/모든 영화 목록이 표시되지만 제목 위로 마우스를 가져 가면 /movies/슬러그가 여전히 사용되고 있음을 알 수 있습니다.

한 걸음 더 나아 가기 위해 기술적으로 301 리디렉션을 기술하여 모든 링크를 해당 링크 /movies/로 리디렉션하여 해당 링크 로 리디렉션 할 수 /films/있지만 이는 모두 시도하려는 작업에 따라 다릅니다.


아름답게 일했습니다! 영구 링크를 업데이트하기위한 올바른 방향을 알려주시겠습니까?
Edbury

1
테마에 따라 템플릿 수준에서이 작업을 수행 할 수 있습니다. 'the_title ()'에 대한 호출이 표시되면이를 $ title = get_the_title ()로 바꾸고 $ title에서 '/ movies /'를 '/ films /'로 바꾸십시오.
Tom

변경하려는 슬러그가 현재 게시물의 메타 값에 의해 동적으로 생성되면 어떻게 되나요? 함수 $post에서 사용할 수 있어야 add_custom_rewrite_rule()하지만 WP 관리자에서 '비 객체의 속성을 가져 오려고합니다'라는 오류가 발생합니다. 메타 가치를 얻기 위해 $ post를 어떻게 얻을 수 있습니까?

6

이 코드는 내 자식 테마에 잘 작동했습니다. "프로그램"슬러그를 "장소"로 변경해야합니다.

/*
CHANGE SLUGS OF CUSTOM POST TYPES
*/

function change_post_types_slug( $args, $post_type ) {

   /*item post type slug*/   
   if ( 'program' === $post_type ) {
      $args['rewrite']['slug'] = 'place';
   }

   return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );

/*
CHANGE SLUGS OF TAXONOMIES, slugs used for archive pages
*/

function change_taxonomies_slug( $args, $taxonomy ) {

   /*item category*/
   if ( 'program-category' === $taxonomy ) {
      $args['rewrite']['slug'] = 'locations';
   }

   return $args;
}
add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );

그것은 완벽하게 작동하며, 상대 규칙을 추가하는 태그에도 사용했습니다. 설정 페이지> permalink에서 저장을 실행하여 영구 링크를 업데이트해야합니다. 고맙습니다!
Lorenzo Magon

다른 인수를 변경하기 위해 완벽하게 작동하므로 설정해야 $args['has_archive'] = false했고 이것이 효과가있었습니다.
Mere Development
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.