맞춤 게시물 유형에 대해 단일보기를 비활성화하는 방법은 무엇입니까?


46

맞춤 게시물 유형을 만들었습니다.

register_post_type('sample_post_type',array(
    'labels' => array(
        'name' => _x('Sample Posts', 'post type general name'),
        'singular_name' => _x('Sample Post', 'post type singular name')
    ),
    'public' => true,
    'show_in_nav_menus' => false,
    'exclude_from_search' => true
));

이 특정 게시물 유형에 대해 단일 게시물보기를 비활성화하려면 어떻게해야합니까? 간단한 404를 표시해도 문제가되지 않거나 홈페이지로 리디렉션됩니다. 이것은 플러그인 안에 있으므로 빈 페이지를 설정하기 위해 single-sample_post_type.php 파일을 만들 수 없습니다.

답변:


42

template_redirect후크를 사용 하여 사용자 정의 게시물 유형을 리디렉션하고 대신 다른 URL을 사용하고 home_url()다른 인수에 오류 코드를 사용할 수 있습니다 .

<?php
add_action( 'template_redirect', 'wpse_128636_redirect_post' );

function wpse_128636_redirect_post() {
  $queried_post_type = get_query_var('post_type');
  if ( is_single() && 'sample_post_type' ==  $queried_post_type ) {
    wp_redirect( home_url(), 301 );
    exit;
  }
}
?>

업데이트 :

다른 방법은 다음을 설정하는 것입니다.

'publicly_queryable'  => false`

앞에서 @gustavo가 언급 한 것처럼 사용자 정의 게시물을 등록하는 동안. 그러나 페이지를 완전히 제거하고 404 페이지로 리디렉션합니다. 또한 단일 및 보관 페이지를 숨 깁니다. 기본적으로 프런트 엔드에서 완전히 숨겨져 있으며 사용자 정의 게시물에만 설정할 수 있습니다.

^이 접근 방식은 관리자 / 백엔드 사용에 대해서만 사용자 정의 게시물을 등록하려는 경우 작동합니다


좋은 해결책입니다. get_current_user_id()평가가 0 인지 확인하여 인증되지 않은 사용자에 대해서만이 리디렉션을 수행하는 것이 도움이된다는 것을 알았습니다.
RevNoah

2
답변 양식 @Gustavo
Richard

2
왜에만 사용하지 is_singular('post-type-slug')에서 if()이 조건 대신 조건?
Akash K.

@AkashK. 예, 잘 작동하지만 기능을 알지 못했습니다.
Kumar

74

그냥 인수를 설정

'publicly_queryable'  => false

register_post_type ()을 호출 할 때


1
이것은 CPT가 실제 웹 페이지를 작성하는 동안 모든 데이터베이스 참조를 작성하는 것을 막는 대답처럼 보입니다.
Ben Racicot

27
이것은 아카이브도 숨 깁니다
spaceman

1
이것이 정답입니다.
SinisterBeard

나를 위해 이것은 404 대신 홈페이지로 리디렉션됩니다. 어떤 아이디어가 있습니까? 관련이있는 경우 post_type을 Piklist에 등록하고 있습니다.
emersonthis

8

사용자 지정 게시물 유형을 등록 할 때 다음과 같은 인수를 전달하는 가장 간단한 방법

register_post_type('sample_post_type',array(
'labels' => array(
    'name' => _x('Sample Posts', 'post type general name'),
    'singular_name' => _x('Sample Post', 'post type singular name')
),
'public' => true,
'exclude_from_search' => true,
'show_in_admin_bar'   => false,
'show_in_nav_menus'   => false,
'publicly_queryable'  => false,
'query_var'           => false
));

1
publically_querablePost Type Archives가 작동하려면 실제로 사실 이어야합니다.
Howdy_McGee

이것은 나를 위해 작동하지 않습니다. 아카이브로 이동하려고 할 때 다시 홈페이지로 리디렉션
Yahya Uddin

7

하나. 함수 파일에서.

add_action( 'template_redirect', 'redirect_cpt_singular_posts' );
    function redirect_cpt_singular_posts() {
      if ( is_singular('your-cpt-slug') ) {
        wp_redirect( home_url(), 302 );
        exit;
      }
    }

두. single.cpt.php 파일에서 :

<?php wp_redirect( home_url() ); exit; ?>

나는 두 번째 옵션을 좋아했다. 그러나이 두 번째 옵션에는 단점이 있다는 것을 알아야합니다.
user2584538

@ user2584538 사용자 정의 single-cpt_name.php파일이 없으면 수행 할 수 없습니다. 간단한 플러그인 파일에 함수를 넣으면 파일을 편집하지 않고도 활성화 / 비활성화 할 수 있습니다.
EliasNS

2

Sven의 정말 좋은 답변을 바탕으로 in_array()if 문을 사용하여 여러 게시물 유형을 더 쉽게 추가 하고 홈 페이지 대신 아카이브 페이지로 리디렉션하는 기능을 다시 작성했습니다 .

(그런데, 설정 query_var및 / 또는 publically_queryablefalse로 설정하면 단일보기뿐만 아니라 기본 아카이브보기도 비활성화 'has_archive' => true됩니다.이 경우 사용자 정의 WP_query를 설정하고 자체 아카이브 페이지를 템플릿이지만 주 쿼리는 더 이상 그렇게하지 않습니까?)

function fq_disable_single_cpt_views() {
  $queried_post_type = get_query_var('post_type');
  $cpts_without_single_views = array( 'my-post-type', 'my-other-post-type' );
  if ( is_single() && in_array( $queried_post_type, $cpts_without_single_views )  ) {
    wp_redirect( home_url( '/' . $queried_post_type . '/' ), 301 );
    exit;
  }
}

add_action( 'template_redirect', 'fq_disable_single_cpt_views' );

2

위에서 언급 한 모든 것을 테스트했으며 실제 솔루션은 제안 된 리디렉션보다 간단합니다.

보관소에 액세스 할 수 있고 항목을 나열하고 단일 게시물에 액세스 할 수 없으며 404 세트로 자동 리디렉션

'query_var' => false

CPT 등록시 publicly_queryablefalse로 설정 하면 보관 파일 으로 리디렉션 되고 다른 콤보는 작동하지 않습니다. query_var를 false로 설정하면 됩니다.

전체 CPT는 https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a입니다.

50 행 참조 https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a#file-thz_cpt_items_single_view_redirect-php-L50

여기에 명시된 바와 같이

https://codex.wordpress.org/Function_Reference/register_post_type

참고 : query_var가 비어 있거나 null이거나 부울 FALSE 인 경우 WordPress는 여전히 해석을 시도하고 (4.2.2) 사용자 정의 게시물의 미리보기 / 뷰는 404를 반환합니다.


그것은 해킹처럼 느껴지지만 작동하는 것 같습니다. 기존 has_archive 속성과 함께 전용 has_single 속성을 추가하기를 바랍니다.
powerbuoy

0

프론트 엔드에서 사용자 정의 게시물 유형 단일보기를 완전히 비활성화하고 싶지만 보관 페이지를 표시 할 수있는 경우에는 조금 복잡해집니다.

또는 로 설정 publicly_queryable하면 단일 및 보관보기가 모두 표시되지 않습니다. 단일 뷰 재 작성 규칙 만 작성하는 것을 방지하기 위해 함수 인수에 플래그가 없습니다 .falserewritefalseregister_post_type

https://github.com/WordPress/WordPress/blob/5.2.3/wp-includes/class-wp-post-type.php#L540

그러나 게시물 유형을 등록한 후 다시 쓰기 태그를 제거하면 아카이브보기 다시 쓰기 규칙은 그대로 유지되지만 단일보기 다시 쓰기 규칙 만 제거됩니다.

/**
 * Register event post type
 */
function wpse_128636_register_event_post_type() {

    $labels = array(
        'name' => __( 'Events' ),
        'singular_name' => __( 'Event' ),
        'add_new' => __( 'Add new' ),
        'add_new_item' => __( 'Add new' ),
        'edit_item' => __( 'Edit' ),
        'new_item' => __( 'New' ),
        'view_item' => __( 'View' ),
        'search_items' => __( 'Search' ),
        'not_found' => __( 'Not found' ),
        'not_found_in_trash' => __( 'Not found Events in trash' ),
        'parent_item_colon' => __( 'Parent' ),
        'menu_name' => __( 'Events' ),

    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => false,
        'supports' => array( 'title', 'page-attributes' ),
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => true,
        'has_archive' => true,
        'rewrite' => array('slug' => 'event'),
        'capability_type' => 'post',
    );

    register_post_type( 'event', $args );
    remove_rewrite_tag( '%event%' ); // This line will remove event rewrite rules for single view
}

add_action( 'init', 'wpse_128636_register_event_post_type' );

또 다른 보너스는 지금부터 event/simple-page복잡한 웹 사이트에서 도움이 될 수있는 이벤트 게시물 유형 퍼머 링크 구조 ( )를 사용하여 간단한 WordPress 페이지를 만들 수 있다는 것입니다.

코드 수정 후 다시 쓰기 규칙을 플러시해야합니다.

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