จะปิดการใช้งานมุมมองเดียวสำหรับประเภทโพสต์ที่กำหนดเองได้อย่างไร


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_redirecthook เพื่อเปลี่ยนเส้นทางสำหรับประเภทโพสต์ที่กำหนดเองคุณสามารถใช้ 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;
  }
}
?>

Updated:

วิธีการทางเลือกคือการตั้งค่า:

'publicly_queryable'  => false`

ในขณะที่ลงทะเบียนโพสต์ที่กำหนดเองตามที่กล่าวถึงโดย @gustavo ก่อนหน้านี้ แต่มันเพิ่งลบหน้าและนำคุณไปสู่หน้า 404 นอกจากนี้ยังซ่อนหน้าเดียวและหน้าเก็บถาวรโดยทั่วไปจะถูกซ่อนอย่างสมบูรณ์จากส่วนหน้าและสามารถตั้งค่าสำหรับโพสต์ที่กำหนดเองเท่านั้น

^ วิธีการนี้ใช้งานได้หากคุณต้องการลงทะเบียนโพสต์ที่กำหนดเองสำหรับผู้ดูแลระบบ / การใช้งานส่วนหลังเท่านั้น


ทางออกที่ดี ฉันพบว่ามีประโยชน์ในการดำเนินการเปลี่ยนเส้นทางนี้สำหรับผู้ใช้ที่ไม่ผ่านการตรวจสอบสิทธิ์โดยการตรวจสอบเพื่อดูว่าget_current_user_id()ประเมินเป็น 0 หรือไม่
RevNoah

2
โปรดตรวจสอบแบบฟอร์มคำตอบ @Gustavo
Richard

2
ทำไมไม่ใช้เฉพาะis_singular('post-type-slug')ในif()สภาพแทนที่จะเป็น 2 เงื่อนไขเท่านั้น?
Akash K.

@AkashK ใช่ที่สามารถทำงานได้ดีไม่ทราบหน้าที่
Kumar

74

เพียงแค่ตั้งค่าการโต้แย้ง

'publicly_queryable'  => false

เมื่อคุณโทรหา register_post_type ()


1
ดูเหมือนว่าคำตอบที่จะหยุด CPT ของคุณจากการสร้างหน้าเว็บจริงในขณะที่ยังคงสร้างการอ้างอิงฐานข้อมูลทั้งหมด
Ben Racicot

27
สิ่งนี้ซ่อนไว้ด้วยเช่นกัน
นักบินอวกาศ

1
นี่ควรเป็นคำตอบที่ยอมรับได้
SinisterBeard

สำหรับฉันนี่ทำให้เกิดการเปลี่ยนเส้นทางไปยังหน้าแรกแทนที่จะเป็น 404 ความคิดใด ๆ ที่เป็นสาเหตุ? ฉันลงทะเบียน post_type กับ Piklist ในกรณีที่เกี่ยวข้อง
emersonthis

8

วิธีที่ง่ายกว่าในการทำเช่นนั้นสามารถผ่าน args ต่อไปนี้เมื่อทำการลงทะเบียน Custom Post Type

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_querableเป็นจริงเพื่อให้ Post 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_queryableเป็นเท็จจะปิดใช้งานไม่เพียง แต่มุมมองเดียว แต่ยังรวมถึงมุมมองการเก็บถาวรดั้งเดิมแทนที่'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_queryableเป็นเท็จเก็บถาวรของคุณจะถูกเปลี่ยนเส้นทางไปที่บ้านคำสั่งผสมอื่น ๆ จะไม่ทำงาน ตั้งค่าเป็นquery_varเท็จและนั่นคือมัน

นี่คือ 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 ว่างเปล่าเป็นโมฆะหรือเป็นบูลีน FALSE WordPress จะยังคงพยายามตีความมัน (4.2.2) และตัวอย่าง / มุมมองของโพสต์ที่คุณกำหนดเองจะส่งคืน 404 วินาที


รู้สึกเหมือนแฮ็ค แต่ดูเหมือนว่าจะทำงาน หวังว่าพวกเขาจะเพิ่มคุณสมบัติ has_single เฉพาะพร้อมกับคุณสมบัติ has_archive ที่มีอยู่แทน
powerbuoy

0

ในกรณีที่คุณต้องการปิดการใช้งานโพสต์แบบกำหนดเองมุมมองเดียวที่ส่วนหน้าอย่างสมบูรณ์ แต่สามารถแสดงสิ่งที่หน้าเก็บถาวรที่มีความซับซ้อนเล็กน้อย

การตั้งค่าpublicly_queryableการfalseหรือrewriteเพื่อfalseจะป้องกันไม่ให้การแสดงทั้งสองมุมมองเดียวและเก็บ ไม่มีแฟล็กในregister_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' );

โบนัสอีกอย่างคือจากนี้ไปคุณสามารถสร้างหน้า WordPress อย่างง่ายโดยใช้โครงสร้างโพสต์ลิงก์ Permalink ( event/simple-page) ซึ่งจะมีประโยชน์ในเว็บไซต์ที่ซับซ้อน

อย่าลืมล้างกฎการเขียนซ้ำหลังจากการแก้ไขรหัส

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.