จะเชื่อมโยง CPT ต่าง ๆ เข้าด้วยกันได้อย่างไร?


11

ฉันหวังว่าคำถามนี้จะมีที่นี่

ฉันคิดเสมอว่าการเชื่อมต่อประเภทโพสต์ที่กำหนดเองต่าง ๆ เข้าด้วยกันนั้นเป็นความต้องการที่พบได้บ่อยเช่นในตัวอย่างการสอนยอดนิยมเกี่ยวกับการใช้อนุกรมวิธานแบบกำหนดเอง (หนังสือ / ผู้แต่ง / ชื่อเรื่องภาพยนตร์ / นักแสดง / ผู้กำกับ ฯลฯ ) ฉันใช้ "โพสต์ 2 โพสต์" เป็นการส่วนตัว แต่การสนับสนุนหยุดลง

ผลลัพธ์ที่เกี่ยวข้องมากที่สุดบน Google ชี้ไปที่ปลั๊กอินนี้ในขณะนี้ มีทางเลือกระยะยาวใดบ้าง นักพัฒนาเว็บ WordPress รุ่นเก๋าจะใช้อะไรในการออกแบบระบบการจัดการหนังสือ / ผู้แต่ง / ชื่อเรื่องด้วย WordPress วันนี้ถ้าปลั๊กอิน P2P เสร็จสิ้น?


คุณใช้รหัสใดในการสร้างประเภทโพสต์ที่กำหนดเอง คุณสามารถเพิ่มการสนับสนุนสำหรับการสร้างประเภทอนุกรมวิธานที่กำหนดเองโดยใช้รหัสนี้wordpress.stackexchange.com/a/128544/9884
แบรดดัลตัน

1
ฉันคิดว่าผู้คนจำนวนมากยังคงใช้ p2p ดังนั้นฉันจึงไม่สามารถเห็นความล้มเหลวได้ทุกเมื่อในเร็ว ๆ นี้เนื่องจากมีใครบางคนสามารถแยกและรักษามันไว้บน github หากการสนับสนุนลดลง แต่ฉันคิดว่ามันหมายถึงว่า scribu กำลังทำงานกับสิ่งใหม่ ๆ หรือฟังก์ชั่นอาจทำให้มันกลายเป็นแกนหลัก ฉันไม่เห็นว่ามันเป็นเหตุผลที่จะไม่ใช้มัน
sanchothefat

1
ฉันก็ไม่แน่ใจเหมือนกัน P2P มีการดาวน์โหลดเพียง 55,000 ครั้งในหน้าปลั๊กอิน WP ซึ่งเป็นที่นิยมน้อยกว่าที่ฉันคิดไว้มาก และฉันไม่เข้าใจว่าทำไมอีกครั้งเพราะการเชื่อมโยง CPT เข้าด้วยกันทำให้ฉันฟังเหมือนความต้องการขั้นพื้นฐานและทั่วไป ปลั๊กอินที่จัดการสิ่งที่พื้นฐานเพียงอย่างเดียวสามารถมีการดาวน์โหลดเพียง 55,000 ครั้งได้อย่างไร นั่นคือเกินฉัน คำอธิบายเดียวคือมีวิธีที่ดีในการตอบคำถามของฉัน
drake035

3
คุณสามารถใช้ปลั๊กอินนี้ต่อไปและหากปลั๊กอินควรล้มเหลวอย่างใดคุณสามารถแยก repo และบำรุงรักษาด้วยตัวคุณเอง: github.com/scribu/wp-posts-to-posts.gitอ้างจาก repo:If you want to help maintain the plugin, fork it on github and open pull requests.
Scuba Kay

4
อัปเดตและติดดาวคำถามนี้เพราะฉันคิดว่า HABTM ใน WordPress น่าสนใจจริงๆ ที่กล่าวว่าฉันจะไม่เหงื่อปลั๊กอินออกไปมากเกินไปมาร์กจาควิ ธ ได้อาสาที่จะช่วยเหลือให้มันไป และในขณะที่ปลั๊กอิน WP บางอันอาจมีการดาวน์โหลด 300000 ครั้งหรืออะไรก็ตามมีไม่มากที่ 472 ดาวบน GitHub เพื่อรักษาชีวิตให้ดีนั่นคือจำนวนที่นับได้!
จะ

คำตอบ:


13

ในฐานะโปรแกรมเมอร์ฉันจะเริ่มเขียนโค้ดของตัวเองเพื่อเชื่อมต่อโพสต์ประเภทของฉัน มันไม่ใช่วิธีที่รวดเร็วมันไม่ใช่เรื่องง่าย แต่มันสนุกมาก

ประเภทโพสต์

เราเริ่มต้นด้วยการสร้างโพสต์ง่าย ๆ สองประเภทAuthorและBooks:

add_action('init', 'p2p2_register_author');
add_action('init', 'p2p2_register_book');

function p2p2_register_author(){
    $labels = array(
        'name'               => 'Author',
        'singular_name'      => 'Author',
        'add_new'            => 'Add New',
        'add_new_item'       => 'Add New Author',
        'edit_item'          => 'Edit Author',
        'new_item'           => 'New Author',
        'all_items'          => 'All Authors',
        'view_item'          => 'View Authors',
        'search_items'       => 'Search Authors',
        'not_found'          => 'No authors found',
        'not_found_in_trash' => 'No authors found in Trash',
        'parent_item_colon'  => '',
        'menu_name'          => 'Authors'
    );

    register_post_type(
        'Author',
        array (
            'labels'             => $labels,
            'public'             => true,
            'publicly_queryable' => true,
            'show_ui'            => true,
            'show_in_menu'       => true,
            'query_var'          => true,
            'rewrite'            => array( 'slug' => 'author' ),
            'capability_type'    => 'post',
            'has_archive'        => true,
            'hierarchical'       => false,
            'menu_position'      => null,
            'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
        )
    );
}
function p2p2_register_book(){
    $labels = array(
        'name'               => 'Books',
        'singular_name'      => 'Book',
        'add_new'            => 'Add New',
        'add_new_item'       => 'Add New Book',
        'edit_item'          => 'Edit Book',
        'new_item'           => 'New Book',
        'all_items'          => 'All Books',
        'view_item'          => 'View Book',
        'search_items'       => 'Search Books',
        'not_found'          => 'No books found',
        'not_found_in_trash' => 'No books found in Trash',
        'parent_item_colon'  => '',
        'menu_name'          => 'Books'
    );

    register_post_type(
        'Book',
        array (
            'labels'             => $labels,
            'public'             => true,
            'publicly_queryable' => true,
            'show_ui'            => true,
            'show_in_menu'       => true,
            'query_var'          => true,
            'rewrite'            => array( 'slug' => 'book' ),
            'capability_type'    => 'post',
            'has_archive'        => true,
            'hierarchical'       => false,
            'menu_position'      => null,
            'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
        )
    );
}

ไม่มีอะไรแฟนซีที่นั่น อันที่จริงมันมาจากCodex !

การเผาผลาญ

มาดำเนินการต่อโดยเพิ่ม metabox สำหรับผู้แต่งของเราในประเภทโพสต์หนังสือของเรา:

add_action('admin_init', 'p2p2_add_author_metabox');

function p2p2_add_author_metabox(){
    add_meta_box( 
        'book_author', 
        __('Book Author', 'bandpress'), 
        'p2p2_book_author_metabox', 
        'book', 
        'side', 
        'default', 
        array( 'id' => 'p2p2_author') 
    );
}

ที่นี่คุณสามารถเห็นฟังก์ชั่นโทรกลับp2p2_book_author_metaboxซึ่งจะเป็นสิ่งที่อยู่ภายในเมท็อกซ์ของเรา

เนื้อหาของเมท็อกซ์

มาสร้างฟังก์ชั่นกันเถอะ:

function p2p2_book_author_metabox($post, $args){
    wp_nonce_field( plugin_basename( __FILE__ ), 'p2p2_book_author_nonce' );
    $author_id = get_post_meta($post->ID, 'p2p2_book_author', true);

    echo "<p>Select the author of the book</p>";
    echo "<select id='p2p2_book_author' name='p2p2_book_author'>";
    // Query the authors here
    $query = new WP_Query( 'post_type=author' );
    while ( $query->have_posts() ) {
        $query->the_post();
        $id = get_the_ID();
        $selected = "";

        if($id == $author_id){
            $selected = ' selected="selected"';
        }
        echo '<option' . $selected . ' value=' . $id . '>' . get_the_title() . '</option>';
    }
    echo "</select>";
}

นี่คือสิ่งที่เวทมนตร์เกิดขึ้น ก่อนอื่นเราจะทำการสืบค้นฐานข้อมูลสำหรับผู้แต่งจากนั้นเราเติม<select>ผลการสืบค้นของเรา ตรวจสอบCodexWP_Queryสำหรับข้อมูลเพิ่มเติมเกี่ยวกับ ตอนนี้คุณสามารถไปที่ประเภทโพสต์หนังสือของคุณและดูรายการแบบเลื่อนลงของคุณ:

แบบเลื่อนลงของเรา

บันทึกเนื้อหาของเรา

นอกหลักสูตรเราต้องการบันทึกการเลือกของเราเพื่อให้เราเพิ่มฟังก์ชั่นอื่นที่จะช่วยให้การเผาผลาญของเรา:

add_action('save_post', 'p2p2_save_author_metabox', 1, 2);

function p2p2_save_author_metabox($post_id, $post){
    // Don't wanna save this now, right?
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return;
    if ( !isset( $_POST['p2p2_book_author_nonce'] ) )
        return;
    if ( !wp_verify_nonce( $_POST['p2p2_book_author_nonce'], plugin_basename( __FILE__ ) ) )
        return;

    // We do want to save? Ok!
    $key = 'p2p2_book_author';
    $value = $_POST["p2p2_book_author"];
    if ( get_post_meta( $post->ID, $key, FALSE ) ) { // If the custom field already has a value
        update_post_meta( $post->ID, $key, $value );
    } else { // If the custom field doesn't have a value
        add_post_meta( $post->ID, $key, $value );
    }
    if ( !$value ) delete_post_meta( $post->ID, $key ); // Delete if blank
}

ตอนนี้ไปและบันทึกหนังสือกับผู้เขียน! ผู้แต่งหนังสือจะถูกบันทึกไว้ในwp_postmetaตารางฐานข้อมูลและค่าที่เลือกของดรอปดาวน์นั้นจะอยู่ในเมตาดาต้า

คอลัมน์ผู้แต่งสำหรับหนังสือ

มาขยายพื้นที่ผู้ดูแลระบบสำหรับหนังสือของเรา เราจะเริ่มต้นด้วยการเปลี่ยนคอลัมน์:

add_filter('manage_edit-book_columns', 'p2p2_add_book_columns');

function p2p2_add_book_columns($columns){
    $new_columns['cb'] = '<input type="checkbox" />';

    $new_columns['title'] = _x('Title', 'column name', 'bandpress');

    $new_columns['p2p2_author'] = __('Author', 'bandpress');

    return $new_columns;
}

ฟังก์ชั่นนี้ทำให้แน่ใจว่าเราจะเห็นชื่อคอลัมน์และ p2p2_author เท่านั้น จำเป็นต้องใช้คอลัมน์เช็คบ็อกซ์ cb สำหรับฟังก์ชันการแก้ไขจำนวนมากของ WordPress ตอนนี้เราต้องเพิ่มข้อมูลลงในคอลัมน์ของเรา เราเพิ่มฟังก์ชั่นนี้:

add_action('manage_book_posts_custom_column', 'p2p2_fill_book_columns', 10, 2);

function p2p2_fill_book_columns($column_name, $id) {
    global $wpdb;
    switch ($column_name) {
        case 'p2p2_author':
            $author_id = get_post_meta($id, 'p2p2_book_author', true);
            $author = get_post($author_id);
            $permalink = get_permalink($author_id);
            echo "<a href='" . $permalink . "'>" . $author->post_title . "</a>";
            break;
        default:
            break;
    } // end switch
}

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

คอลัมน์ผู้แต่งของเรา

ยังมีต่อ

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

  1. จัดเรียงหนังสือตามผู้แต่ง
  2. แสดงรายชื่อหนังสือในหน้าผู้แต่ง
  3. แสดงรายการหนังสืออื่น ๆ ของผู้แต่งในหน้าหนังสือ
  4. สร้าง metabox แฟนซีพร้อมรูปภาพของผู้แต่ง
  5. สร้างคอลัมน์ในหน้าผู้ดูแลระบบของหนังสือที่เขา / เธอเขียน
  6. และอีกมากมาย ...

ฉันจะตอบคำถามนี้ต่อไปเพราะฉันต้องการวิธีแก้ปัญหานี้ด้วยตัวเอง อย่างไรก็ตามฉันจะหยุดทำงานในตอนนี้ ฉันจะเริ่มอัปเดตคำตอบนี้ในวันพรุ่งนี้


ขอบคุณสำหรับการแบ่งปันคำตอบที่น่าอัศจรรย์ของคุณ คุณจะแสดงรายการหนังสือที่ผู้แต่งเขียนขึ้นอย่างไร?
วิลเลียม

4

ฉันไม่ต้องกังวลกับเรื่องนี้มากนักเนื่องจากนักพัฒนาที่ยอดเยี่ยมสองคนอาสาที่จะให้การสนับสนุนต่อไป แต่ถ้าคุณต้องการที่จะใช้อย่างอื่นตรวจสอบข้อมูลความสัมพันธ์ ACF


ลิงก์เดียวและการแนะนำปลั๊กอินถือว่าเป็นคำตอบที่มีคุณภาพต่ำ เหตุผลนั้นง่าย: หากลิงก์หายไปคำตอบ (และไซต์นี้) จะทนทุกข์ทรมานจากการเน่าลิงก์
kaiser

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

2

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

วิธีการง่าย ๆ อย่างหนึ่งก็คือใช้ Post Meta ตัวอย่างเช่น. ใน post_meta ของผู้แต่งคุณสามารถจัดเก็บหนังสือได้ ไม่ว่าจะเป็นรายการที่ไม่ซ้ำกันหรือรายการที่คั่นด้วยเครื่องหมายจุลภาคหรืออาร์เรย์แบบอนุกรม จากนั้นในหนังสือคุณจะเก็บข้อมูลผกผันของผู้แต่ง

อีกรายการหนึ่งคือการเพิ่มตารางฐานข้อมูลใหม่ (ขมวดคิ้ว) ที่เก็บความสัมพันธ์และข้อมูลที่เกี่ยวข้องอื่น ๆ

ไม่มีความคิดวิธีแก้ปัญหาอย่างมีประสิทธิภาพทั้งในระดับ แต่พวกเขาทำงาน

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