รับประเภทโพสต์ตามการสนับสนุนเท่านั้น


9

ฉันกำลังพยายามดึงรายการรวมถึงทั้งโพสต์ในตัวและประเภทโพสต์ที่กำหนดเอง:

$post_types = get_post_types(array(
  'public' => TRUE,
), 'objects');

ทำงานข้างต้นเกือบ แต่ฉันต้องการที่จะไม่รวมattachmentจากรายการนี้จะมีเพียงประเภทกลับมาโพสต์ด้วยการสนับสนุนที่เฉพาะเจาะจงเช่นeditor, และtitle thumbnailเป็นไปได้ไหม

คำตอบ:


9

ฉันพบว่าget_post_types_by_support()น่าจะเป็นทางออกเพื่อให้ได้ผลลัพธ์ที่ต้องการ:

$post_types = get_post_types_by_support(array('title', 'editor', 'thumbnail'));

ดังกล่าวข้างต้นจะกลับมาpost, pageที่กำหนดเองและประเภทโพสต์ใด ๆ ที่สนับสนุนtitle, และeditorthumbnail

เนื่องจากสิ่งนี้จะส่งคืนประเภทโพสต์ส่วนตัวด้วยเราสามารถวนรอบรายการและตรวจสอบว่าประเภทนั้นสามารถดูได้ที่ส่วนหน้าหรือไม่ สิ่งนี้สามารถทำได้โดยใช้is_post_type_viewable()ฟังก์ชั่น:

foreach ($post_types as $key => $post_type) {
  if (!is_post_type_viewable($post_type)) {
    unset($post_types[$post_type]);
  }
}

เพิ่งทราบ: สิ่งนี้จะทำงานใน กรณีส่วนใหญ่
cybmeta

4

get_post_types()ยอมรับอาร์เรย์ของการขัดแย้งเพื่อให้ตรงกับสาขาที่วัตถุประเภทโพสต์ ดังนั้นคุณสามารถทำสิ่งนี้ (ไม่ผ่านการทดสอบ):

$post_types = get_post_types(array(
  'public'   => true,
  'supports' => array( 'editor', 'title', 'thumbnail' )
), 'objects');

น่าเสียดายที่คุณไม่สามารถตั้งค่าการบันทึกอย่าง "แยก" ในฟังก์ชั่นนี้และคุณจะได้รับเฉพาะประเภทโพสต์ที่สนับสนุนอย่างแน่นอน 'editor', 'title', 'thumbnail'ไม่มากและไม่น้อย

หรือคุณสามารถใช้get_post_types_by_support()(เฉพาะสำหรับ WP 4.5 และสูงกว่านอกจากนี้โปรดทราบว่าคุณไม่สามารถยกเว้นประเภทโพสต์เฉพาะด้วยฟังก์ชั่นนี้ แต่สำหรับกรณีเฉพาะของการสนับสนุนสำหรับeditor, title, thumbnailประเภทโพสต์สิ่งที่แนบจะถูกยกเว้นในกรณีส่วนใหญ่ )

$post_types = get_post_types_by_support( array( 'editor', 'title', 'thumbnail' ) );

หากคุณต้องการบางสิ่งบางอย่างที่จะทำงานในกรณีใด ๆ ฉันจะลองโพสต์ประเภทตามเกณฑ์ที่กว้างขึ้นจากนั้นสร้างอาร์เรย์ของคุณเองดังนี้:

$_post_types = get_post_types_by_support( array( 'editor', 'title', 'thumbnail' ) );

$post_types = [];

foreach($_post_types as $post_type) {
    // In most cases, attachment post type won't be here, but it can be
    if( $post_type->name !== 'attachment' ) {
        $post_types[] = $post_type;
    }
}

การใช้supportsดูเหมือนจะไม่ทำงานใช่ไหม ฉันมีประเภทโพสต์ที่กำหนดเองที่รองรับeditorและถ้าฉันใช้supports => array('editor')ฉันจะได้รับผลลัพธ์ที่ว่างเปล่า? คุณแนวทางที่สองดูเหมือนว่าจะทำงาน
Cyclonecode

2
ดูเหมือนว่าเราสามารถใช้get_post_types_by_support()การสนับสนุนเพื่อบรรลุเป้าหมายนี้
Cyclonecode

0

วิธีที่ง่ายที่สุดสำหรับคำถามของ OP คือเพียงแค่ยกเลิกการ 'แนบ' จากอาร์เรย์ที่ส่งคืน

$post_types = get_post_types(array('public' => TRUE,), 'objects');
unset($post_types['attachment']);

ในขณะที่ไม่หรูหราเท่าโซลูชั่นอื่น ๆ แต่ก็มีค่าใช้จ่ายน้อยที่สุด

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