ในฐานะโปรแกรมเมอร์ฉันจะเริ่มเขียนโค้ดของตัวเองเพื่อเชื่อมต่อโพสต์ประเภทของฉัน มันไม่ใช่วิธีที่รวดเร็วมันไม่ใช่เรื่องง่าย แต่มันสนุกมาก
ประเภทโพสต์
เราเริ่มต้นด้วยการสร้างโพสต์ง่าย ๆ สองประเภท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 ของเรา แต่เราไม่เห็นสิ่งใดเลยในส่วนหน้า มันจะต้องมีงานอีกมากที่จะทำให้สิ่งนี้สำเร็จ เราสามารถ:
- จัดเรียงหนังสือตามผู้แต่ง
- แสดงรายชื่อหนังสือในหน้าผู้แต่ง
- แสดงรายการหนังสืออื่น ๆ ของผู้แต่งในหน้าหนังสือ
- สร้าง metabox แฟนซีพร้อมรูปภาพของผู้แต่ง
- สร้างคอลัมน์ในหน้าผู้ดูแลระบบของหนังสือที่เขา / เธอเขียน
- และอีกมากมาย ...
ฉันจะตอบคำถามนี้ต่อไปเพราะฉันต้องการวิธีแก้ปัญหานี้ด้วยตัวเอง อย่างไรก็ตามฉันจะหยุดทำงานในตอนนี้ ฉันจะเริ่มอัปเดตคำตอบนี้ในวันพรุ่งนี้