Bagaimana cara menonaktifkan tampilan tunggal untuk jenis posting khusus?

47

Saya membuat jenis posting khusus:

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

Bagaimana saya bisa menonaktifkan tampilan posting tunggal untuk jenis posting khusus ini? Menampilkan 404 sederhana tidak masalah, atau mengalihkan ke beranda. Ini ada di dalam plugin, jadi saya tidak bisa membuat file sample_post_type.php tunggal untuk menyiapkan halaman kosong.

passatgt
sumber

Jawaban:

43

Anda dapat menggunakan template_redirectkait untuk mengarahkan ulang untuk jenis posting khusus, Anda dapat menggunakan URL lain yang Anda inginkan home_url()dan kode kesalahan dalam argumen lain.

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

Diperbarui:

Pendekatan alternatif akan mengatur:

'publicly_queryable'  => false`

saat mendaftarkan pos khusus seperti yang disebutkan oleh @gustavo sebelumnya. Tapi itu hanya sepenuhnya menghapus halaman dan mengarahkan Anda ke halaman 404. Juga menyembunyikan halaman arsip dan juga tunggal, pada dasarnya sepenuhnya tersembunyi dari front-end dan dapat diatur untuk posting khusus saja.

^ Pendekatan ini berfungsi jika Anda ingin mendaftarkan pos khusus hanya untuk penggunaan admin / back-end

Kumar
sumber
Solusi yang bagus. Saya merasa sangat membantu untuk hanya melakukan pengalihan ini untuk pengguna yang tidak diautentikasi, dengan memeriksa apakah get_current_user_id()evaluasi ke 0.
RevNoah
2
Silakan periksa formulir jawaban @Gustavo
Richard
2
mengapa tidak menggunakan hanya is_singular('post-type-slug')dalam if()kondisi bukan 2 kondisi?
Akash K.
@AkashK. Ya itu bisa bekerja juga, tidak menyadari fungsinya.
Kumar
75

Hanya mengatur argumen

'publicly_queryable'  => false

ketika Anda memanggil register_post_type ()

Gustavo
sumber
1
Ini sepertinya jawaban untuk menghentikan CPT Anda dari membuat halaman web yang sebenarnya sambil tetap membuat semua referensi basis data.
Ben Racicot
27
Ini menyembunyikan arsip juga
angkasawan
1
Ini harus menjadi jawaban yang diterima.
SinisterBeard
Bagi saya ini menyebabkan pengalihan ke beranda alih-alih 404. Ada ide mengapa? Saya mendaftarkan post_type dengan Piklist, kalau-kalau itu relevan.
emersonthis
8

Cara yang lebih sederhana untuk melakukannya adalah dengan menggunakan argumen berikut saat mendaftarkan Jenis Posting Kustom

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
));
0v3rth3d4wn
sumber
1
Anda sebenarnya harus publically_querablebenar agar Arsip Jenis Tulisan berfungsi.
Howdy_McGee
Ini tidak bekerja untuk saya. Hanya dialihkan kembali ke beranda ketika mencoba untuk pergi ke arsip
Yahya Uddin
7

Satu. Dari file fungsi Anda.

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

Dua. Dari file single.cpt.php Anda:

<?php wp_redirect( home_url() ); exit; ?>
Brad Dalton
sumber
Saya menyukai opsi kedua. Tapi saya perlu tahu apakah ada kekurangan dengan opsi kedua ini.
user2584538
@ user2584538 Jika Anda tidak memiliki single-cpt_name.phpfile khusus, Anda tidak bisa melakukannya. Jika Anda meletakkan fungsi dalam file plugin sederhana, Anda bisa mengaktifkan / menonaktifkan tanpa mengedit file apa pun.
EliasNS
2

Bekerja dari jawaban Sven yang sangat bagus, saya menulis ulang fungsinya untuk membuatnya lebih mudah untuk menambahkan beberapa jenis posting menggunakan in_array()dalam pernyataan if dan kemudian mengarahkan kembali ke halaman arsip daripada halaman rumah.

(Omong-omong, saya pikir pengaturan query_vardan / atau publically_queryablesalah akan menonaktifkan tidak hanya tampilan tunggal, tetapi juga tampilan arsip asli, menimpa 'has_archive' => true. Dalam hal ini Anda masih dapat mengatur WP_query khusus dan membuat halaman arsip Anda sendiri, di sebuah templat, tetapi kueri utama tidak akan melakukannya lagi, kan?)

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' );
slashbob
sumber
2

Menguji semua yang disebutkan di atas dan solusi sebenarnya lebih sederhana daripada arahan ulang yang disarankan.

Agar arsip dapat diakses dan daftar item, dan satu posting tidak dapat diakses dan otomatis diarahkan ke 404 ditetapkan

'query_var' => false

saat mendaftarkan CPT Anda. Jika Anda menetapkan publicly_queryablefalse arsip Anda akan diarahkan ke rumah, kombo apa pun tidak akan berfungsi. Setel query_varke false dan hanya itu.

Berikut ini CPT lengkap https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a

lihat baris 50 https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a#file-thz_cpt_items_single_view_redirect-php-L50

seperti yang dinyatakan di sini

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

Catatan: Jika query_var kosong, null, atau boolean FALSE, WordPress akan tetap berusaha mengartikannya (4.2.2) dan pratinjau / tampilan pos kustom Anda akan menghasilkan 404s.

Benn
sumber
Rasanya agak seperti retasan tetapi tampaknya berhasil. Berharap mereka hanya menambahkan properti has_single khusus bersama dengan properti has_archive yang ada sebagai gantinya.
powerbuoy
0

Jika Anda ingin sepenuhnya menonaktifkan tampilan tunggal jenis posting kustom di frontend tetapi dapat menampilkan hal-hal halaman arsip semakin rumit.

Pengaturan publicly_queryableke falseatau rewriteke falseakan mencegah untuk menampilkan tampilan tunggal dan arsip. Tidak ada flag dalam register_post_typeargumen fungsi untuk mencegah pembuatan hanya aturan penulisan ulang tampilan tunggal.

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

Namun Anda dapat menghapus tag penulisan ulang setelah mendaftarkan jenis posting Anda dan ini akan membuat aturan penulisan ulang tampilan arsip tidak tersentuh tetapi hanya menghapus aturan penulisan ulang tampilan tunggal.

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

Bonus lain adalah bahwa mulai sekarang Anda dapat membuat halaman WordPress sederhana menggunakan struktur permalink jenis posting ( event/simple-page) yang dapat membantu di situs web yang kompleks.

Ingatlah untuk menyiram aturan penulisan ulang setelah modifikasi kode.

kierzniak
sumber