Come faccio a creare una relazione tra due tipi di post personalizzati?


16

Voglio costruire un database di serie TV usando WordPress. Ho seguito alcuni tutorial e ho due tipi di post personalizzati: uno per movies, uno per e series. Ho seguito questo post per la struttura .

La mia domanda è: come posso stabilire la relazione tra i tipi di post di film e serie?


Prima di tutto, NON stai creando un intero database, stai solo creando un Tipo di post personalizzato di WordPress. E nell'ambito di WordPress hai molte opportunità di categorizzarli, ordinarli ecc. E tutti sono fatti con una buona relazione interna. Quindi, la relazione di cui stai parlando è già lì, devi solo implementarla nel modo che ti serve. Quindi, ti suggerirei di implementare post_type come indicato e quindi modificare la domanda con la tua vera query.
Mayeenul Islam

@MayeenulIslam, "implement the post_type as directed"che vuoi dire?
CoalaArmy,

Come indicato nel thread di link fornito o utilizzando un semplice generatore come: questo generatore di tipo di post .
Mayeenul Islam

@MayeenulIslam: non sono convinto che "la relazione di cui stai parlando è già lì". Per impostazione predefinita, non esiste una relazione diretta tra diversi tipi di post.
s_ha_dum,

@s_ha_dum Siamo spiacenti, ho perso una parte della sua domanda in cui ha già detto di avere due post-tipi. È un mio errore Sto cercando di farlo chiarire con i suoi dettagli. Mi mancava che il dettaglio è già lì. :( Sto parlando del rapporto interiore tra tassonomia e tipo di posta personalizzato, se definito.
Mayeenul Islam

Risposte:


22

Utilizzando un plugin

Alcuni plugin molto buoni per le relazioni:

Usando un Metabox

Puoi costruire una semplice relazione usando i metabox:

add_action( 'admin_init', 'add_meta_boxes' );
function add_meta_boxes() {
    add_meta_box( 'some_metabox', 'Movies Relationship', 'movies_field', 'series' );
}

function movies_field() {
    global $post;
    $selected_movies = get_post_meta( $post->ID, '_movies', true );
    $all_movies = get_posts( array(
        'post_type' => 'movies',
        'numberposts' => -1,
        'orderby' => 'post_title',
        'order' => 'ASC'
    ) );
    ?>
    <input type="hidden" name="movies_nonce" value="<?php echo wp_create_nonce( basename( __FILE__ ) ); ?>" />
    <table class="form-table">
    <tr valign="top"><th scope="row">
    <label for="movies">Movies</label></th>
    <td><select multiple name="movies">
    <?php foreach ( $all_movies as $movie ) : ?>
        <option value="<?php echo $movie->ID; ?>"<?php echo (in_array( $movie->ID, $selected_movies )) ? ' selected="selected"' : ''; ?>><?php echo $movie->post_title; ?></option>
    <?php endforeach; ?>
    </select></td></tr>
    </table>
}

add_action( 'save_post', 'save_movie_field' );
function save_movie_field( $post_id ) {

    // only run this for series
    if ( 'series' != get_post_type( $post_id ) )
        return $post_id;        

    // verify nonce
    if ( empty( $_POST['movies_nonce'] ) || !wp_verify_nonce( $_POST['movies_nonce'], basename( __FILE__ ) ) )
        return $post_id;

    // check autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;

    // check permissions
    if ( !current_user_can( 'edit_post', $post_id ) )
        return $post_id;

    // save
    update_post_meta( $post_id, '_movies', array_map( 'intval', $_POST['movies'] ) );

}

E poi, per ottenere la relazione tra i film come un elenco per i post delle serie:

$series = new WP_Query( array(
    'post_type' => 'movies',
    'post__in' => get_post_meta( $series_id, '_movies', true ),
    'nopaging' => true
) );

if ( $series-> have_posts() ) { while ( $series->have_posts() ) {
    $series->the_post();
    ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ></a></li>
    <?php
} }

3
Mi piace l'idea con i metabox (cercando di evitare i plugin)!
CoalaArmy,

Senza creare un altro post, possiamo aggiungere a questo come creare un permalink da questa relazione genitore / figlio? Ad esempio http://domain.com/series-name/movie-name:?
Xtremefaith

@Xtremefaith questo può essere fatto con altro codice. C'è un plugin che ho creato per le categorie. Forse puoi usare come riferimento. wordpress.org/plugins/hierarchical-urls
vmassuchetto

5

Consiglio il plug-in Posts 2 Posts , che ho appena iniziato a utilizzare.

Esso consente di creare molti-a-molti tra i pali e tipi di pagina, significa che è possibile collegare moviesa series, e tutti gli altri CPT si può creare.

Questo plugin ti consente anche di creare metadati di connessione che ti permetteranno di ottenere dettagli più precisi durante la creazione delle tue connessioni. È abbastanza flessibile nel suo utilizzo, consentendo il controllo su metabox di amministrazione, tipi di connessione e modi per visualizzare le connessioni sul front-end. Infine, è ben documentato .


Lo darò un'occhiata.
CoalaArmy,

Stavo cercando sth. varie soluzioni simili e provate. Devo dire che questo (Post 2 Post) era perfetto, potrebbe non essere quello che un "non programmatore" avrebbe cercato, ma se stai cercando di più per sth. come una libreria da usare nel tuo modello, che questo è semplicemente perfetto, ben documentato, ben integrato, capito! ;)
Larzan,

Ho fatto un piccolo plugin per le relazioni post ma wordpress.org/plugins/softmixt-relations
Softmixt

2

Sfortunatamente, il plug-in Posts 2 Posts è obsoleto e non viene più mantenuto. Esiste un nuovo plug-in alternativo per tali relazioni MB . È ispirato al P2P e fornisce un'API simile per creare relazioni tra post, termini e utenti.

MB Relationships supporta le relazioni bidirezionali per impostazione predefinita e utilizza una tabella personalizzata per archiviare le relazioni (come P2P) per prestazioni migliori (rispetto a post meta).

Vale la pena dare un'occhiata al plugin.

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.