web-dev-qa-db-fra.com

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

Je veux construire une base de données de séries télévisées en utilisant 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 post pour la structure .

Ma question est la suivante: comment puis-je faire la relation entre les types de post de série et de film?

15
CoalaArmy

Utiliser un plugin

Quelques très bons plugins pour les relations:

Utiliser 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 puis, pour obtenir la relation de films comme une liste pour les articles 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
} }
20
vmassuchetto

Je recommande le Posts 2 Posts plugin, 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 métadonnées de connexion qui vous permettront d’obtenir des détails plus fins 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é .

5
JMB

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

Relations MB 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.

1
Anh Tran