Come programmatore, inizierei a scrivere il mio codice per collegare i miei tipi di post. Non è un modo rapido, non è facile, ma è molto divertente.
I tipi di posta
Iniziamo creando due semplici tipi di post Authore 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' )
)
);
}
Niente di speciale lì. In realtà, viene dal Codice !
Il metabox
Continuiamo aggiungendo un metabox per il nostro autore al nostro tipo di post di libro:
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')
);
}
Qui puoi vedere una funzione di callback p2p2_book_author_metaboxche sarà ciò che è all'interno del nostro metabox.
Il contenuto del metabox
Creiamo la funzione:
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>";
}
Ecco dove accade la magia. Per prima cosa andremo a interrogare il database per gli autori e quindi riempiamo un <select>con i nostri risultati di query. Controlla il Codice per ulteriori informazioni WP_Query. Ora puoi andare al tipo di post del tuo libro e vedere il tuo menu a discesa:

Salvataggio dei nostri contenuti
Ovviamente vogliamo salvare la nostra selezione, quindi aggiungiamo un'altra funzione che salverà il metabox per noi:
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
}
Ora vai e salva un libro con un autore! L'autore del libro verrà salvato nella wp_postmetatabella del database e il valore selezionato del menu a discesa sarà quello nel meta.
Una colonna autore per il libro
Espandiamo l'area di amministrazione dei nostri libri. Inizieremo cambiando le colonne:
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;
}
Questa funzione assicura che vediamo solo il titolo delle colonne e p2p2_author. La colonna della casella di controllo cb è necessaria per la funzionalità di modifica di massa di WordPress. Ora dobbiamo aggiungere alcune informazioni alla nostra colonna. Aggiungiamo questa funzione:
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
}
L'opzione è per ogni colonna appena aggiunta nella funzione precedente. Lo riempi facendo eco a ciò che vuoi mostrare. Riceviamo il post che è l'autore del nostro libro e creiamo un bel permalink alla sua "pagina del profilo". Ecco come appare:

Continua
Abbiamo collegato due tipi di post nel backend del nostro sito WordPress, ma non possiamo vederne nulla nel frontend. Sarà necessario molto più lavoro per raggiungere questo obiettivo, ma le possibilità sono in qualche modo infinite. Potremmo:
- Ordina i libri per autore
- Mostra un elenco di libri nella pagina dell'autore
- Mostra un elenco di altri libri dell'autore sulla pagina del libro
- Crea un metabox di fantasia con le foto dell'autore
- Crea una colonna nella pagina di amministrazione dell'autore per i libri che ha scritto
- E molto di più...
Continuerò a lavorare su questa risposta, poiché ho bisogno di questa soluzione da solo. Tuttavia, per ora smetterò di lavorare. Inizierò ad aggiornare questa risposta domani.