Là một lập trình viên, tôi sẽ bắt đầu viết mã của riêng mình để kết nối các loại bài đăng của mình. Đó không phải là một cách nhanh chóng, nó không dễ dàng, nhưng nó rất nhiều niềm vui.
Các loại bài
Chúng tôi bắt đầu bằng cách tạo hai loại bài đăng đơn giản Authorvà 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' )
)
);
}
Không có gì lạ mắt ở đó. Trên thực tế, đó là từ Codex !
Siêu dữ liệu
Hãy tiếp tục bằng cách thêm một metabox cho tác giả của chúng tôi vào loại bài đăng sách của chúng tôi:
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')
);
}
Ở đây bạn có thể thấy một chức năng gọi lại p2p2_book_author_metaboxsẽ là những gì bên trong metabox của chúng tôi.
Nội dung của metabox
Hãy tạo chức năng:
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>";
}
Đây là nơi phép màu xảy ra. Trước tiên, chúng tôi sẽ truy vấn cơ sở dữ liệu cho các tác giả và sau đó chúng tôi điền vào một <select>kết quả truy vấn của chúng tôi. Kiểm tra Codex để biết thêm về WP_Query. Bây giờ bạn có thể đi đến loại bài đăng sách của bạn và xem danh sách thả xuống của bạn:

Lưu nội dung của chúng tôi
Dĩ nhiên, chúng tôi muốn lưu lựa chọn của mình để chúng tôi thêm một chức năng khác sẽ lưu metabox cho chúng tôi:
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
}
Bây giờ đi và lưu một cuốn sách với một tác giả! Tác giả của cuốn sách sẽ được lưu trong wp_postmetabảng cơ sở dữ liệu và giá trị được chọn của danh sách thả xuống sẽ là trong meta.
Một cột tác giả cho cuốn sách
Hãy mở rộng khu vực quản trị cho sách của chúng tôi. Chúng tôi sẽ bắt đầu bằng cách thay đổi các cột:
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;
}
Hàm này đảm bảo chúng ta chỉ thấy tiêu đề cột và p2p2_ Author. Cột hộp kiểm cb là cần thiết cho chức năng chỉnh sửa hàng loạt của WordPress. Bây giờ chúng tôi cần thêm một số thông tin vào cột của chúng tôi. Chúng tôi thêm chức năng này:
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
}
Công tắc dành cho mọi cột bạn vừa thêm vào chức năng trước đó. Bạn điền vào nó bằng cách lặp lại những gì bạn muốn hiển thị. Chúng tôi nhận được bài đăng đó là tác giả của cuốn sách của chúng tôi và tạo ra một permalink đẹp cho 'trang hồ sơ' của anh ấy / cô ấy. Đây là những gì nó trông giống như:

Còn tiếp
Chúng tôi đã kết nối hai loại bài đăng trong phần phụ trợ của trang web WordPress của chúng tôi, nhưng chúng tôi không thể thấy một điều của nó trong frontend. Nó sẽ cần nhiều công việc hơn để thực hiện điều này, nhưng khả năng là hơi vô tận. Chúng ta có thể:
- Sắp xếp sách theo tác giả
- Hiển thị danh sách các sách trên trang tác giả
- Hiển thị danh sách các cuốn sách khác của tác giả trên trang sách
- Tạo một metabox lạ mắt với hình ảnh của tác giả
- Tạo một cột trong trang quản trị tác giả cho những cuốn sách anh ấy / cô ấy đã viết
- Và nhiều hơn nữa...
Tôi sẽ tiếp tục làm việc với câu trả lời này, vì tôi cần giải pháp này cho mình. Tuy nhiên, tôi sẽ ngừng làm việc ngay bây giờ. Tôi sẽ bắt đầu cập nhật câu trả lời này vào ngày mai.