En tant que programmeur, je commençais à écrire mon propre code pour connecter mes types de messages. Ce n'est pas un moyen rapide, ce n'est pas facile, mais c'est très amusant.
Les types de messages
Nous commençons par créer deux types de messages simples Authoret 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' )
)
);
}
Rien d'extraordinaire là-bas. En fait, c'est du Codex !
La métabox
Continuons en ajoutant une métabox pour notre auteur à notre type de publication de livre:
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')
);
}
Ici, vous pouvez voir une fonction de rappel p2p2_book_author_metaboxqui sera à l'intérieur de notre métabox.
Le contenu de la métabox
Créons la fonction:
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>";
}
Voici où la magie opère. Nous allons d'abord interroger la base de données pour les auteurs, puis nous remplissons un <select>avec nos résultats de requête. Consultez le Codex pour en savoir plus WP_Query. Vous pouvez maintenant accéder à votre type de publication de livre et voir votre liste déroulante:

Sauvegarder notre contenu
Bien sûr, nous voulons enregistrer notre sélection, donc nous ajoutons une autre fonction qui va enregistrer la métabox pour nous:
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
}
Allez maintenant enregistrer un livre avec un auteur! L'auteur du livre sera enregistré dans la wp_postmetatable de base de données et la valeur sélectionnée de la liste déroulante sera celle de la méta.
Une colonne d'auteur pour le livre
Développons la zone d'administration de nos livres. Nous allons commencer par changer les colonnes:
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;
}
Cette fonction s'assure que nous ne voyons que le titre des colonnes et p2p2_author. La colonne de case à cocher cb est nécessaire pour la fonctionnalité d'édition en masse de WordPress. Maintenant, nous devons ajouter des informations à notre colonne. Nous ajoutons cette fonction:
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
}
Le commutateur est pour chaque colonne que vous venez d'ajouter dans la fonction précédente. Vous le remplissez en faisant écho à ce que vous voulez montrer. Nous obtenons le post qui est l'auteur de notre livre et créons un joli permalien vers sa «page de profil». Voici à quoi ça ressemble:

À suivre
Nous avons connecté deux types de messages dans le backend de notre site WordPress, mais nous n'en voyons rien dans le frontend. Il faudra beaucoup plus de travail pour y parvenir, mais les possibilités sont quelque peu infinies. Nous pourrions:
- Trier les livres par auteur
- Afficher une liste de livres sur la page de l'auteur
- Afficher une liste d'autres livres de l'auteur sur la page du livre
- Créez une métabox fantaisie avec des photos de l'auteur
- Créez une colonne dans la page d'administration de l'auteur pour les livres qu'il / elle a écrits
- Et beaucoup plus...
Je vais continuer à travailler sur cette réponse, car j'ai moi-même besoin de cette solution. Cependant, je vais arrêter de travailler dessus pour l'instant. Je vais commencer à mettre à jour cette réponse demain.