Jako programista zacząłem pisać własny kod do łączenia typów postów. To nie jest szybki sposób, nie jest łatwy, ale to świetna zabawa.
Typy postów
Zaczynamy od utworzenia dwóch prostych typów postów Authori 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' )
)
);
}
Nic szczególnego. W rzeczywistości pochodzi z Kodeksu !
Metaboks
Kontynuujmy, dodając metaboks dla naszego autora do naszego posta w książce:
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')
);
}
Tutaj możesz zobaczyć funkcję zwrotną, p2p2_book_author_metaboxktóra będzie tym, co jest w naszym metaboksie.
Zawartość metaboksu
Utwórzmy funkcję:
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>";
}
Oto gdzie dzieje się magia. Najpierw przeszukamy bazę danych autorów, a następnie <select>wypełnimy wyniki zapytania. Sprawdź Kodeks, aby uzyskać więcej informacji WP_Query. Teraz możesz przejść do typu posta w książce i zobaczyć listę rozwijaną:

Zapisywanie naszych treści
Oczywiście chcemy zapisać nasz wybór, więc dodajemy kolejną funkcję, która zapisze dla nas metabox:
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
}
Teraz idź i zapisz książkę z autorem! Autor książki zostanie zapisany w wp_postmetatabeli bazy danych, a wybraną wartością rozwijaną będzie ta w meta.
Kolumna autora książki
Rozwińmy obszar administracyjny dla naszych książek. Zaczniemy od zmiany kolumn:
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;
}
Ta funkcja zapewnia, że widzimy tylko kolumny tytuł i p2p2_author. Kolumna pola wyboru cb jest potrzebna do funkcji edycji masowej WordPress. Teraz musimy dodać trochę informacji do naszej kolumny. Dodajemy tę funkcję:
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
}
Przełącznik dotyczy każdej kolumny, którą właśnie dodałeś w poprzedniej funkcji. Wypełniasz go echem tego, co chcesz pokazać. Dostajemy posta, który jest autorem naszej książki i tworzymy przyjemny bezpośredni link do jego / jej „strony profilu”. Tak to wygląda:

Ciąg dalszy nastąpi
Połączyliśmy dwa typy postów z zaplecza naszej witryny WordPress, ale nie widzimy nic z tego w interfejsie. Będzie to wymagało dużo więcej pracy, ale możliwości są nieskończone. Moglibyśmy:
- Sortuj książki według autora
- Pokaż listę książek na stronie autora
- Pokaż listę innych książek autora na stronie książki
- Utwórz fantazyjny metaboks ze zdjęciami autora
- Utwórz kolumnę na stronie administratora autora książek, które napisał
- I dużo więcej...
Będę kontynuował pracę nad tą odpowiedzią, ponieważ sam potrzebuję tego rozwiązania. Jednak na razie przestanę pracować. Zacznę aktualizować tę odpowiedź jutro.