ใช้ register_post_type () เพื่อแก้ไขประเภทโพสต์ที่มีอยู่


29

มีหลายสถานการณ์ที่ชุดรูปแบบหรือปลั๊กอินลงทะเบียนประเภทโพสต์และคุณต้องการแก้ไข มีแน่นอนadd_post_type_support()และremove_post_type_support(), แต่สิ่งเหล่านั้นไม่อนุญาตให้เข้าถึงรายการอาร์กิวเมนต์ทั้งหมดที่register_post_type()เกิดขึ้น. โดยเฉพาะอย่างยิ่งฉันอาจต้องการปิดใช้งานการเก็บถาวรชนิดโพสต์ซ่อน UI ของผู้ดูแลระบบซ่อนจากการค้นหา ฯลฯ ขณะที่ปล่อยให้การตั้งค่าประเภทโพสต์ที่เหลืออยู่คนเดียว

หน้า Codex สำหรับregister_post_type() dangles นี้ในด้านหน้าของฉัน:

ลักษณะ

สร้างหรือแก้ไขประเภทโพสต์

แต่ในอดีตเมื่อฉันพยายามทำสิ่งนี้ดูเหมือนจะไม่ได้ผล ฟังก์ชั่นนี้จริงๆแล้วสำหรับการแก้ไขประเภทโพสต์และถ้าเป็นเช่นนั้นคุณสามารถประกาศอาร์กิวเมนต์สองสามข้อแล้วทิ้งส่วนที่เหลือไว้คนเดียวได้หรือไม่?

เมื่อเห็นว่าไม่มีderegister_post_type()ฟังก์ชั่นฉันก็ไม่เข้าใจว่ามันสามารถทำได้

คำตอบ:


18

เป็นฟังก์ชั่นนี้จริงๆสำหรับการแก้ไขประเภทโพสต์

ใช่.

และถ้าเป็นเช่นนั้นคุณสามารถประกาศข้อโต้แย้งสองสามข้อแล้วปล่อยให้ที่เหลืออยู่คนเดียวได้หรือไม่?

ไม่หากคุณต้องการแก้ไขข้อโต้แย้งเป็นประเภทโพสต์คุณต้องใช้get_post_type_objectเพื่อรับวัตถุประเภทโพสต์แก้ไขสิ่งที่คุณต้องการจากนั้นลงทะเบียนใหม่โดยใช้ประเภทที่แก้ไขของคุณเป็นพารามิเตอร์ $ args ใหม่


การโทรสองครั้งติดต่อกันโดยมีอาร์กิวเมนต์ที่ปรับเปลี่ยนเป็นแบบเดียวกันregister_post_typeถูกต้องหรือไม่ ฉันถือว่าเป็น "ใช่" ของคุณและจะไม่ทิ้งข้อผิดพลาดใด ๆ และมีผลตามที่ต้องการ กรณีจริงคือตัวเลือกที่สองที่ฉันนำเสนอในคำตอบนี้: wordpress.stackexchange.com/a/74331/12615
brasofilo

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

register_post_typeฉันแค่คิดเกี่ยวกับมันเพราะของเบ็ดให้แค่ก่อนของปลั๊กอิน ในความเป็นจริงไม่จำเป็นต้องมี มันเป็นคำถาม "สำหรับบันทึก" ขอบคุณสำหรับความคิดเห็น
brasofilo

34

หลังจากการวิจัยบางอย่างฉันพบว่าคำตอบเหล่านี้ไม่ทันสมัย

ตั้งแต่วันที่ 8 ธันวาคม 2558 WordPress มีตัวกรองใหม่register_post_type_argsซึ่งช่วยให้คุณสามารถพิจารณาข้อโต้แย้งของประเภทโพสต์ที่ลงทะเบียน

function wp1482371_custom_post_type_args( $args, $post_type ) {
    if ( $post_type == "animal-species" ) {
        $args['rewrite'] = array(
            'slug' => 'animal'
        );
    }

    return $args;
}
add_filter( 'register_post_type_args', 'wp1482371_custom_post_type_args', 20, 2 );

6
นี่เป็นวิธีที่ถูกต้องในการทำสิ่งนี้ในตอนนี้
Dave Romsey

6
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
klewis

จะทำอย่างไรถ้าคุณต้องการอัปเดตหลังจากลงทะเบียนในรันไทม์? เช่น: หลังจากinit
Lucas Bustamante

@LucasBustamante มันไม่สำคัญ เพียงเรียกบรรทัด 'add_filter' ระหว่างปลั๊กอิน / ธีมของคุณไม่ใช่ในการดำเนินการ ตัวกรองจะถูกเรียกใช้ระหว่างทุกregister_post_typeฟังก์ชั่น สถานการณ์เดียวที่รหัสของฉันจะไม่ทำงานคือหากโพสต์ประเภทไม่ได้ลงทะเบียนอย่างถูกต้อง โพสต์ทุกประเภทควรลงทะเบียนในช่วงเริ่มต้นเบ็ด จาก codex: "register_post_type จะไม่ทำงานหากเรียกก่อน 'init' และลักษณะของประเภทโพสต์ที่สร้างขึ้นใหม่หรือปรับเปลี่ยนจะทำงานไม่ถูกต้องหากเรียกในภายหลัง" หากคุณยังต้องการความช่วยเหลือฉันแนะนำให้โพสต์รายละเอียดเพิ่มเติมในคำถามใหม่
Radley Sustaire

8

ต่อไปนี้เป็นตัวอย่างวิธีใช้'registered_post_type'ตัวกรองเพื่อแก้ไขประเภทโพสต์ในปลั๊กอินอื่น

ปลั๊กอินที่ฉันใช้ไม่ได้รวม menu_icon ไว้ในคำจำกัดความของมันดังนั้นฉันจึงต้องการเพิ่มของฉันเอง

<?php
/**
 * Add a menu icon to the WP-VeriteCo Timeline CPT
 *
 * The timeline plugin doesn't have a menu icon, so we hook into 'registered_post_type'
 * and add our own.
 *
 * @param  string $post_type the name of the post type
 * @param  object $args the post type args
 */
function wpse_65075_modify_timeline_menu_icon( $post_type, $args ) {
    // Make sure we're only editing the post type we want
    if ( 'timeline' != $post_type )
        return;

    // Set menu icon
    $args->menu_icon = get_stylesheet_directory_uri() . '/img/admin/menu-timeline.png';

    // Modify post type object
    global $wp_post_types;
    $wp_post_types[$post_type] = $args;
}
add_action( 'registered_post_type', 'wpse_65075_modify_timeline_menu_icon', 10, 2 );

นี่เป็นวิธีที่สะอาดกว่ามากในกรณีส่วนใหญ่ อย่างไรก็ตามควรสังเกตว่าตัวกรองนี้สายเกินไปที่จะรับโดยการเขียนใหม่ดังนั้นต้องใช้คำตอบที่ยอมรับแทนในสถานการณ์เหล่านั้น
mrwweb

4

ขอต่อ'registered_post_type'หลังจากรหัสอื่นได้ลงทะเบียนแล้ว register_post_type()มันถูกเรียกว่าในตอนท้ายของ คุณจะได้รับสองอาร์กิวเมนต์: และ$post_type ตอนนี้คุณสามารถเปลี่ยนแปลงอะไรก็ได้สำหรับโพสต์ประเภทนี้ ตรวจสอบตัวเลือกบางอย่าง$args
$GLOBALS['wp_post_types']


ขอบคุณที่ชี้นำฉันไปทางเบ็ดนั่น นั่นเป็นคำตอบของคำถาม (สำคัญกว่า) เกี่ยวกับวิธีแก้ไขประเภทโพสต์ แต่สิ่งที่เกี่ยวกับคำอธิบายของregister_post_type()ที่มี "แก้ไข" นั่นเป็นความผิดหรือเปล่า? ฉันควรจะกระโดดบนม้าอินเทอร์เน็ตของฉันและเอาชนะมันจาก Codex ช่วงเวลานี้หรือไม่?
mrwweb

2
$wp_post_types[$post_type] = $args;... แนะนำว่าคุณควรจะสามารถเปลี่ยนคุณสมบัติได้ เพิ่มตัวอย่างของรหัสที่ล้มเหลวในคำถามของคุณ
fuxia

0

ฉันเผชิญสิ่งเดียวกันกับปลั๊กอินปฏิทินกิจกรรม

ฉันเพิ่มรหัสด้านล่างเพื่อ function.php เพื่อแก้ไขชนิดโพสต์tribe_organizer

function tribe_modify_organizer() {
 //New arguments
    $tribe_organizer_args = get_post_type_object('tribe_organizer'); // get the post type to modify
    $tribe_organizer_args-> taxonomies = array('post_tag' , 'tribe_events_cat'); // add taxonomies support
    $tribe_organizer_args-> exclude_from_search = false; // show in search result
 //re-register the same post type includeing the new args
    register_post_type( 'tribe_organizer', $tribe_organizer_args );
}
add_action( 'init', 'tribe_modify_organizer', 100 );

0

ฉันไม่รู้ว่านี่เป็นสิ่งที่น่าเกลียดหรือไม่ แต่คุณสามารถเปลี่ยนตัวแทนGLOBAL"แบบทันที" ได้ทุกเมื่อที่คุณต้องการจัดการอาร์กิวเมนต์เดี่ยว นี่คือวิธีที่เราใช้ประเภทโพสต์ที่ไม่เป็นสาธารณะcontentsเพื่อเป็นที่ยอมรับในเมนูผู้ดูแล เราขอปิดก่อนและปิดหลังจากเมนูแสดงผล:

function entex_theme_make_contents_public(){
    $GLOBALS['wp_post_types']['contents']->public = true;
}
add_action('admin_menu', 'entex_theme_make_contents_public', 10);

function entex_theme_make_contents_private_again(){
    $GLOBALS['wp_post_types']['contents']->public = '';
}
add_action('admin_menu', 'entex_theme_make_contents_private_again', 12);

ในกรณีของเราเราต้องการให้ปลั๊กอินโพสต์รายการเมนูผู้ดูแลระบบยอมรับประเภทการโพสต์ของเราเนื่องจากพวกเขาโทรreturn get_post_types(array('public' => true));ภายในเบ็ดของพวกเขาที่มีลำดับความสำคัญ 11 ...

นักพัฒนา - โปรดแสดงความคิดเห็นหากสิ่งนี้สามารถแก้ไขปัญหาใด ๆ

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