Come collegare diversi CPT insieme?


10

Spero che questa domanda abbia il suo posto qui.

Ho sempre pensato che collegare insieme diversi tipi di poste personalizzate fosse un'esigenza piuttosto comune, come nei popolari esempi tutorial sull'uso della tassonomia personalizzata (libri / autori / titoli, film / attori / registi, ecc.). Personalmente uso "Posts 2 Posts", ma il supporto è stato interrotto.

Su Google i risultati più rilevanti puntano subito a questo plugin. Quali alternative a lungo termine esistono? Cosa userebbe uno sviluppatore web WordPress esperto per progettare un sistema di gestione di libri / autori / titoli con WordPress oggi, se il plugin P2P è finito?


Quale codice hai usato per creare i tipi di post personalizzati? Puoi aggiungere supporto per la creazione di tipi di tassonomia personalizzati utilizzando questo codice wordpress.stackexchange.com/a/128544/9884
Brad Dalton,

1
Penso che un numero enorme di persone utilizzi ancora p2p, quindi non riesco a vederlo fallire in qualsiasi momento, dato che qualcuno potrebbe semplicemente fork e mantenerlo su Github. Se il supporto è stato abbandonato, tuttavia suppongo che significhi che scribu sta lavorando a qualcosa di nuovo o che la funzionalità potrebbe farsi strada nel nocciolo. Non lo vedo come un motivo per non usarlo.
sanchothefat,

1
Non sono così sicuro sancho. P2P ha solo 55.000 download nella pagina dei plugin WP, molto meno popolari di quanto pensassi. E non capisco perché, ancora una volta perché collegare CPT insieme suona per me come un'esigenza molto semplice e comune. Come può un plugin che si rivolge esclusivamente a qualcosa di così semplice avere solo 55.000 download? Questo è oltre me. L'unica spiegazione è che esiste un altro buon modo di affrontarlo, quindi la mia domanda.
drake035,

3
Potresti continuare a usare questo plugin e se il plugin dovesse fallire in qualche modo, potresti rovesciare il repository e mantenerlo tu stesso: github.com/scribu/wp-posts-to-posts.git Citazione dal repository:If you want to help maintain the plugin, fork it on github and open pull requests.
Scuba Kay

4
Ha votato e interpretato questa domanda perché penso che HABTM in WordPress sia davvero interessante. Detto questo, non suderei troppo il plugin andando via, Mark Jaquith si è offerto volontario per aiutarlo a continuare . E mentre alcuni plugin WP possono avere 300000 download o altro, non molti hanno 472 stelle su github. Per tenerlo in vita, questo è il numero che conta!
Will

Risposte:


12

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:

Il nostro 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:

La nostra colonna autore

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:

  1. Ordina i libri per autore
  2. Mostra un elenco di libri nella pagina dell'autore
  3. Mostra un elenco di altri libri dell'autore sulla pagina del libro
  4. Crea un metabox di fantasia con le foto dell'autore
  5. Crea una colonna nella pagina di amministrazione dell'autore per i libri che ha scritto
  6. 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.


Grazie per aver condiviso la tua incredibile risposta. Come mostreresti un elenco di libri scritti dall'autore?
William,

4

Non me ne preoccuperei troppo, dato che un paio di grandi sviluppatori si sono offerti volontari per continuare il supporto . Tuttavia, se si desidera utilizzare qualcos'altro, consultare il campo di relazione ACF .


I collegamenti solitari e i consigli sui plugin sono considerati risposte di scarsa qualità. Il motivo è semplice: se il collegamento è sparito, la risposta (e questo sito) soffre di marcescenza del collegamento.
Kaiser

3
Anche le soluzioni prive di link possono diventare obsolete nel tempo, e questo è peggio dei dead link perché alcune persone potrebbero perdere tempo a cercare di implementare queste soluzioni obsolete senza sapere che non funzionano più. Oltre a ACF e al suo sito Web, probabilmente dureranno a lungo. Finalmente grazie mille Bjorn per questa fantastica alternativa.
drake035,

2

Poiché la domanda originale è "Cosa faresti se il P2P sparisse?" Ho un pensiero / suggerimento. In realtà ne avevo bisogno, perché se stai costruendo un plugin, dire agli utenti di installare un altro plugin non è sempre praticabile.

Un metodo semplice sarebbe usare Post Meta. Per esempio. In post_meta di Author, è possibile memorizzare i libri. O come voci univoche o una singola voce separata da virgola o una matrice serializzata. Quindi, nel libro, memorizzi le informazioni inverse degli autori.

Un altro sarebbe aggiungere una nuova tabella DB (disapprovata) che memorizza le relazioni e altre informazioni pertinenti.

Non ho idea di quanto sia efficiente una soluzione su vasta scala, ma funzionano.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.