Wie verbinde ich verschiedene CPTs miteinander?

10

Ich hoffe, diese Frage hat hier ihren Platz.

Ich habe immer gedacht, dass das Verbinden verschiedener benutzerdefinierter Beitragstypen ein ziemlich häufiges Bedürfnis ist, wie in gängigen Tutorial-Beispielen für die Verwendung benutzerdefinierter Taxonomien (Bücher / Autoren / Titel, Filme / Schauspieler / Regisseure usw.). Ich persönlich benutze "Posts 2 Posts", aber der Support wurde eingestellt.

Bei Google verweisen die aktuellsten Ergebnisse auf dieses Plugin. Welche langfristigen Alternativen gibt es? Was würde ein erfahrener WordPress-Webentwickler heute verwenden, um ein Buch- / Autoren- / Titelverwaltungssystem mit WordPress zu entwerfen, wenn das P2P-Plugin fertig ist?

drake035
quelle
Welchen Code haben Sie zum Erstellen der benutzerdefinierten Beitragstypen verwendet? Mit diesem Code können Sie Unterstützung für das Erstellen benutzerdefinierter Taxonomietypen hinzufügen. Wordpress.stackexchange.com/a/128544/9884
Brad Dalton
1
Ich denke, eine große Anzahl von Leuten verwendet immer noch P2P, daher kann ich nicht sehen, dass es so schnell wie möglich fehlschlägt, da jemand es einfach auf Github gabeln und warten könnte. Wenn die Unterstützung jedoch eingestellt wurde, bedeutet dies vermutlich nur, dass scribu an etwas Neuem arbeitet oder die Funktionalität möglicherweise in den Kern gelangt. Ich sehe es nicht als Grund, es nicht zu benutzen.
Sanchothefat
1
Ich bin mir nicht so sicher, Sancho. P2P hat nur 55.000 Downloads auf der WP-Plugins-Seite, weit weniger beliebt als ich gedacht hatte. Und ich verstehe auch nicht, warum, weil das Verbinden von CPTs für mich nach einem sehr grundlegenden und gemeinsamen Bedürfnis klingt. Wie kann ein Plugin, das sich ausschließlich mit etwas so Grundlegendem befasst, nur 55.000 Downloads haben? Das ist mir ein Rätsel. Die einzige Erklärung ist, dass es einen anderen guten Weg gibt, dies zu beantworten, daher meine Frage.
Drake035
3
Sie können dieses Plugin weiterhin verwenden. Wenn das Plugin irgendwie fehlschlägt, können Sie das Repo aufteilen und selbst warten: github.com/scribu/wp-posts-to-posts.git Zitat aus dem Repo:If you want to help maintain the plugin, fork it on github and open pull requests.
Scuba Kay
4
Diese Frage wurde bewertet und mit einem Stern versehen, da ich HABTM in WordPress für sehr interessant halte. Das heißt, ich würde das Plugin nicht zu sehr ins Schwitzen bringen , Mark Jaquith hat sich freiwillig gemeldet, um es am Laufen zu halten . Und während einige WP-Plugins 300000 Downloads oder was auch immer haben, haben nicht viele 472 Sterne auf Github. Um es am Leben zu erhalten, zählt die Zahl!
Will

Antworten:

12

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:

Unser Dropdown

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:

Unsere Autorenspalte

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:

  1. Bücher nach Autor sortieren
  2. Zeigen Sie eine Liste der Bücher auf der Autorenseite an
  3. Zeigen Sie eine Liste anderer Bücher des Autors auf der Buchseite an
  4. Erstellen Sie eine ausgefallene Metabox mit Bildern des Autors
  5. Erstellen Sie auf der Autorenadministrationsseite eine Spalte für die Bücher, die er / sie geschrieben hat
  6. 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.

Scuba Kay
quelle
Vielen Dank für Ihre tolle Antwort. Wie würden Sie eine Liste der vom Autor verfassten Bücher anzeigen?
William
4

Ich würde mir darüber keine Sorgen machen, da sich ein paar großartige Entwickler freiwillig bereit erklärten , den Support fortzusetzen . Wenn Sie jedoch etwas anderes verwenden möchten, überprüfen Sie das Feld ACF-Beziehung .

Björn
quelle
Einsame Links und Plugin-Empfehlungen gelten als Antworten von schlechter Qualität. Der Grund ist einfach: Wenn der Link weg ist, leidet die Antwort (und diese Seite) unter Link Rot.
Kaiser
3
Linkfreie Lösungen können im Laufe der Zeit ebenfalls veraltet sein. Dies ist schlimmer als tote Links, da einige Benutzer möglicherweise Zeit damit verschwenden, diese veralteten Lösungen zu implementieren, ohne zu wissen, dass sie nicht mehr funktionieren. Außerdem dürften ACF und seine Website sehr lange halten. Zum Schluss vielen Dank Björn für diese fantastische Alternative.
Drake035
2

Da die ursprüngliche Frage lautet: "Was würden Sie tun, wenn P2P weggehen würde?" Ich habe einen Gedanken / Vorschlag. Ich brauchte es tatsächlich, denn wenn Sie ein Plugin erstellen, ist es nicht immer sinnvoll, den Benutzern zu sagen, dass sie ein anderes Plugin installieren sollen.

Eine einfache Methode wäre die Verwendung der Post-Meta. Beispielsweise. In der post_meta des Autors können Sie die Bücher speichern. Entweder als eindeutige Einträge oder als einzelner durch Kommas getrennter Eintrag oder als serialisiertes Array. Anschließend speichern Sie im Buch die inversen Informationen der Autoren.

Eine andere Möglichkeit wäre, eine neue DB-Tabelle (verpönt) hinzuzufügen, in der die Beziehungen und andere relevante Informationen gespeichert sind.

Keine Ahnung, wie effizient eine der beiden Lösungen im Maßstab ist, aber sie funktionieren.

Jeff Rose
quelle