Comment créer une relation entre deux types de publication personnalisés?

15

Je souhaite créer une base de données de séries télévisées à l'aide de WordPress. J'ai suivi des tutoriels et j'ai deux types de publication personnalisés: un pour movies , un pour et series . J'ai suivi ce message pour la structure .

Ma question est la suivante: comment puis-je établir la relation entre les types de films et de séries de séries?

    
posée CoalaArmy 05.01.2014 - 13:30

3 réponses

19

Utilisation d'un plugin

Quelques très bons plugins pour les relations:

Utilisation d'un Metabox

Vous pouvez créer une relation simple à l'aide de métaboxes:

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'] ) );

}

Et ensuite, pour obtenir la relation entre films comme liste pour les posts de la série:

$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
} }
    
réponse donnée vmassuchetto 05.01.2014 - 14:02
5

Je recommande le plug-in Posts 2 Posts que je viens de commencer à utiliser.

Il vous permet de créer plusieurs relations entre articles et types de page, ce qui signifie que vous pouvez lier movies à series et à tout autre CPT que vous pouvez créer.

Ce plugin vous permet également de créer des métadonnées de connexion qui vous permettront pour obtenir des détails plus précis lors de la création de vos connexions. Son utilisation est assez flexible, permettant de contrôler les métaboxes d’administrateur, les types de connexion et les moyens d’afficher vos connexions sur le front-end. Enfin, il est bien documenté .

    
réponse donnée JMB 05.01.2014 - 13:55
1

Malheureusement, le plug-in Posts 2 Posts est obsolète et n'est plus maintenu. Il existe un nouveau plug-in alternatif pour ces relations avec le MB . Inspiré du P2P, il fournit une API similaire pour créer des relations entre les publications, les termes et les utilisateurs.

MB Relationships prend en charge les relations bidirectionnelles par défaut et utilise un tableau personnalisé pour stocker les relations (telles que P2P) pour de meilleures performances (que post méta).

Cela vaut la peine de jeter un coup d'œil au plugin.

    
réponse donnée Anh Tran 29.01.2018 - 04:18

Lire d'autres questions sur les étiquettes