Làm cách nào để tắt chế độ xem đơn cho loại bài đăng tùy chỉnh?


47

Tôi đã tạo một loại bài tùy chỉnh:

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
));

Làm thế nào tôi có thể vô hiệu hóa chế độ xem bài đăng duy nhất cho loại bài đăng cụ thể này? Hiển thị một 404 đơn giản là tốt, hoặc chuyển hướng đến trang chủ. Đây là bên trong một plugin, vì vậy tôi không thể tạo tệp duy nhất sample_post_type.php để thiết lập một trang trống.

Câu trả lời:


43

Bạn có thể sử dụng template_redirecthook để chuyển hướng cho loại bài đăng tùy chỉnh, bạn có thể sử dụng bất kỳ URL nào khác mà bạn muốn thay thế home_url()và mã lỗi trong đối số khác.

<?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;
  }
}
?>

Đã cập nhật:

Một cách tiếp cận khác sẽ được thiết lập:

'publicly_queryable'  => false`

trong khi đăng ký bài tùy chỉnh như được đề cập bởi @gustavo trước đó. Nhưng nó chỉ xóa hoàn toàn trang và chuyển hướng bạn đến trang 404. Ngoài ra, nó ẩn trang đơn cũng như trang lưu trữ, về cơ bản hoàn toàn bị ẩn khỏi giao diện người dùng và chỉ có thể được đặt cho các bài đăng tùy chỉnh.

^ Cách tiếp cận này hoạt động nếu bạn muốn đăng ký một bài đăng tùy chỉnh cho chỉ sử dụng quản trị viên / back-end


Một giải pháp tốt. Tôi thấy thật hữu ích khi chỉ thực hiện chuyển hướng này cho người dùng không được xác thực, bằng cách kiểm tra xem liệu có get_current_user_id()đánh giá được 0.
RevNoah

2
Vui lòng kiểm tra mẫu câu trả lời @Gustavo
Richard

2
Tại sao không sử dụng chỉ is_singular('post-type-slug')trong if()điều kiện thay vì 2 điều kiện?
Akash K.

@AkashK. Vâng, nó có thể hoạt động tốt, không nhận thức được chức năng.
Kumar

75

Chỉ cần thiết lập đối số

'publicly_queryable'  => false

khi bạn gọi register_post_type ()


1
Đây giống như câu trả lời để ngăn CPT của bạn tạo các trang web thực tế trong khi vẫn tạo tất cả các tham chiếu cơ sở dữ liệu.
Ben Racicot

27
Điều này cũng che giấu kho lưu trữ
spaceman

1
Đây phải là câu trả lời được chấp nhận.
SinisterBeard

Đối với tôi điều này gây ra một chuyển hướng đến trang chủ thay vì 404. Bất kỳ ý tưởng tại sao? Tôi đang đăng ký post_type với Gullist, trong trường hợp có liên quan.
emersonthis

8

Một cách đơn giản hơn để làm điều đó có thể vượt qua các đối số sau đây khi đăng ký Loại bài đăng tùy chỉnh

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
Bạn thực sự cần phải publically_querableđúng để Lưu trữ loại bài hoạt động.
Howdy_McGee

Điều này không làm việc cho tôi. Nó chuyển hướng quay trở lại trang chủ khi cố gắng đi đến kho lưu trữ
Yahya Uddin

7

Một. Từ tập tin chức năng của bạn.

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;
      }
    }

Hai. Từ tệp single.cpt.php của bạn:

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

Tôi thích lựa chọn thứ hai. Nhưng tôi cần biết có bất kỳ nhược điểm nào với tùy chọn thứ hai này không.
dùng2584538

@ user2584538 Nếu bạn không có single-cpt_name.phptệp tùy chỉnh, bạn không thể làm điều đó. Nếu bạn đặt chức năng trong một tệp plugin đơn giản, bạn có thể kích hoạt / hủy kích hoạt mà không cần chỉnh sửa bất kỳ tệp nào.
EliasNS

2

Làm việc từ câu trả lời thực sự tốt của Sven, tôi viết lại chức năng của anh ấy để giúp dễ dàng thêm nhiều loại bài đăng bằng in_array()câu lệnh if và sau đó chuyển hướng đến trang lưu trữ thay vì trang chủ.

(nhân tiện, tôi nghĩ rằng cài đặt query_varvà / hoặc publically_queryablesai sẽ vô hiệu hóa không chỉ các chế độ xem đơn lẻ mà cả chế độ xem lưu trữ gốc, ghi đè 'has_archive' => true. Trong trường hợp đó, bạn vẫn có thể thiết lập WP_query tùy chỉnh và tạo trang lưu trữ của riêng bạn một mẫu, nhưng truy vấn chính sẽ không làm điều đó nữa, phải không?)

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

Đã thử nghiệm tất cả những cái được đề cập ở trên và giải pháp thực tế đơn giản hơn bất kỳ chuyển hướng nào được đề xuất.

Để có thể truy cập kho lưu trữ và liệt kê các mục, và một bài đăng không thể truy cập và tự động chuyển hướng đến bộ 404

'query_var' => false

khi đăng ký CPT của bạn. Nếu bạn đặt publicly_queryablethành false, tài liệu lưu trữ của bạn sẽ được chuyển hướng đến nhà, bất kỳ kết hợp nào khác sẽ không hoạt động. Đặt query_varthành false và đó là nó.

Đây là CPT đầy đủ https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a

xem dòng 50 https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a#file-thz_cpt_items_single_view_redirect-php-L50

như đã nêu ở đây

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

Lưu ý: Nếu query_var trống, null hoặc FALSE boolean, WordPress vẫn sẽ cố gắng diễn giải nó (4.2.2) và xem trước / lượt xem bài đăng tùy chỉnh của bạn sẽ trả về 404s.


Nó cảm thấy giống như một hack nhưng nó dường như hoạt động. Ước gì họ chỉ cần thêm một thuộc tính has_single chuyên dụng cùng với thuộc tính has_archive hiện có.
powerbuoy

0

Trong trường hợp bạn muốn vô hiệu hóa hoàn toàn chế độ xem một bài đăng tùy chỉnh trên frontend nhưng có thể hiển thị trang lưu trữ, mọi thứ sẽ hơi phức tạp.

Thiết publicly_queryableđến falsehoặc rewriteđến falsesẽ ngăn chặn để hiển thị cả hai cái nhìn duy nhất và lưu trữ. Không có cờ trong register_post_typecác đối số chức năng để ngăn chặn việc chỉ tạo các quy tắc viết lại chế độ xem đơn.

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

Tuy nhiên, bạn có thể xóa thẻ ghi lại sau khi đăng ký loại bài đăng của mình và điều này sẽ khiến các quy tắc ghi lại chế độ xem lưu trữ không bị ảnh hưởng nhưng chỉ xóa các quy tắc viết lại chế độ xem đơn lẻ.

/**
 * 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' );

Một phần thưởng khác là từ bây giờ bạn có thể tạo các trang WordPress đơn giản bằng cách sử dụng cấu trúc permalink loại bài đăng sự kiện ( event/simple-page) có thể hữu ích trong các trang web phức tạp.

Hãy nhớ để xóa các quy tắc viết lại sau khi sửa đổi mã.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.