Als Programmierer würde ich anfangen, meinen eigenen Code zu schreiben, um meine Beitragstypen zu verbinden. Es ist kein schneller Weg, es ist nicht einfach, aber es macht viel Spaß.
Die Beitragstypen
Wir beginnen mit zwei einfachen Post - Typen erstellen, Authorund 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' )
)
);
}
Nichts Besonderes dort. In der Tat ist es aus dem Codex !
Die Metabox
Lassen Sie uns fortfahren, indem wir unserem Buchposttyp eine Metabox für unseren Autor hinzufügen:
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')
);
}
Hier sehen Sie eine Rückruffunktion, p2p2_book_author_metaboxdie sich in unserer Metabox befindet.
Der Inhalt der Metabox
Lassen Sie uns die Funktion erstellen:
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>";
}
Hier passiert die Magie. Zuerst werden wir die Datenbank nach Autoren abfragen und dann eine <select>mit unseren Abfrageergebnissen füllen . Weitere Informationen finden Sie im CodexWP_Query . Jetzt können Sie zu Ihrem Buchpostentyp gehen und Ihre Dropdown-Liste anzeigen:

Speichern unserer Inhalte
Natürlich möchten wir unsere Auswahl speichern, damit wir eine weitere Funktion hinzufügen, mit der die Metabox für uns gespeichert wird:
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
}
Speichern Sie jetzt ein Buch mit einem Autor! Der Autor des Buches wird in der wp_postmetaDatenbanktabelle gespeichert und der ausgewählte Wert der Dropdown-Liste ist der im Meta.
Eine Autorenspalte für ein Buch
Erweitern wir den Administrationsbereich für unsere Bücher. Wir beginnen mit dem Ändern der Spalten:
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;
}
Diese Funktion stellt sicher, dass nur der Spaltentitel und p2p2_author angezeigt werden. Die Spalte cb checkbox wird für die Massenbearbeitungsfunktion von WordPress benötigt. Jetzt müssen wir unserer Spalte einige Informationen hinzufügen. Wir fügen diese Funktion hinzu:
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
}
Der Schalter gilt für jede Spalte, die Sie gerade in der vorherigen Funktion hinzugefügt haben. Sie füllen es, indem Sie das wiederholen, was Sie anzeigen möchten. Wir erhalten den Beitrag, der der Autor unseres Buches ist, und erstellen einen schönen Permalink zu seiner 'Profilseite'. So sieht es aus:

Fortsetzung folgt
Wir haben zwei Post-Typen im Backend unserer WordPress-Site verbunden, aber im Frontend können wir nichts davon sehen. Es wird viel mehr Arbeit erfordern, um dies zu erreichen, aber die Möglichkeiten sind etwas endlos. Wir können:
- Bücher nach Autor sortieren
- Zeigen Sie eine Liste der Bücher auf der Autorenseite an
- Zeigen Sie eine Liste anderer Bücher des Autors auf der Buchseite an
- Erstellen Sie eine ausgefallene Metabox mit Bildern des Autors
- Erstellen Sie auf der Autorenadministrationsseite eine Spalte für die Bücher, die er / sie geschrieben hat
- Und vieles mehr...
Ich werde weiter an dieser Antwort arbeiten, da ich diese Lösung selbst brauche. Ich werde jedoch vorerst aufhören, daran zu arbeiten. Ich werde morgen mit der Aktualisierung dieser Antwort beginnen.