Sebagai seorang programmer, saya akan mulai menulis kode saya sendiri untuk menghubungkan tipe posting saya. Ini bukan cara yang cepat, itu tidak mudah, tetapi sangat menyenangkan.
Jenis posting
Kami mulai dengan membuat dua jenis posting sederhana, Authordan 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' )
)
);
}
Tidak ada yang mewah di sana. Bahkan, itu dari Codex !
Metabox
Mari kita lanjutkan dengan menambahkan metabox untuk penulis kami ke jenis posting buku kami:
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')
);
}
Di sini Anda dapat melihat fungsi panggilan balik p2p2_book_author_metaboxyang akan menjadi apa yang ada di dalam metabox kami.
Isi dari metabox
Mari kita buat fungsinya:
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>";
}
Di sinilah keajaiban terjadi. Pertama kita akan query database untuk penulis dan kemudian kita isi <select>dengan hasil query kita. Periksa Codex untuk informasi lebih lanjut WP_Query. Sekarang Anda dapat pergi ke jenis posting buku Anda dan melihat dropdown Anda:

Menyimpan konten kami
Tentu saja kami ingin menyimpan pilihan kami sehingga kami menambahkan fungsi lain yang akan menyimpan metabox untuk kami:
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
}
Sekarang, pergi dan simpan buku dengan penulis! Penulis buku akan disimpan dalam wp_postmetatabel database dan nilai yang dipilih dari dropdown akan berada dalam meta.
Kolom penulis untuk buku
Mari kita memperluas area admin untuk buku-buku kami. Kami akan mulai dengan mengubah kolom:
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;
}
Fungsi ini memastikan kita hanya melihat judul kolom dan p2p2_author. Kolom kotak centang cb diperlukan untuk fungsi edit massal WordPress. Sekarang kita perlu menambahkan beberapa informasi ke kolom kita. Kami menambahkan fungsi ini:
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
}
Switch untuk setiap kolom yang baru saja Anda tambahkan di fungsi sebelumnya. Anda mengisinya dengan menggemakan apa yang ingin Anda perlihatkan. Kami mendapatkan pos yang merupakan penulis buku kami dan membuat tautan permanen yang bagus ke 'halaman profil' nya. Seperti inilah tampilannya:

Bersambung
Kami menghubungkan dua jenis posting di backend situs WordPress kami, tetapi kami tidak dapat melihatnya di frontend. Dibutuhkan lebih banyak pekerjaan untuk mencapai hal ini, tetapi kemungkinannya tidak terbatas. Kita bisa:
- Sortir buku menurut penulis
- Tampilkan daftar buku di halaman penulis
- Tampilkan daftar buku-buku penulis lain di halaman buku
- Buat metabox mewah dengan gambar-gambar penulis
- Buat kolom di halaman admin penulis untuk buku-buku yang dia tulis
- Dan masih banyak lagi ...
Saya akan terus mengerjakan jawaban ini, karena saya membutuhkan solusi ini sendiri. Namun, saya akan berhenti bekerja untuk saat ini. Saya akan mulai memperbarui jawaban ini besok.