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

16

Je veux créer une base de données de séries télévisées en utilisant WordPress. J'ai suivi quelques tutoriels et j'ai deux types de messages personnalisés: un pour movies, un pour et series. J'ai suivi ce post pour la structure .

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

CoalaArmy
la source
Tout d'abord, vous ne créez PAS une base de données entière, vous créez simplement un type de publication personnalisé WordPress. Et dans la portée de WordPress, vous avez de nombreuses opportunités de les catégoriser, de les trier, etc. Et toutes se font avec une bonne relation interne. Donc, la relation dont vous parlez est déjà là, il vous suffit de la mettre en œuvre comme vous le souhaitez. Donc, je vous suggère d'implémenter le post_type comme indiqué, puis de modifier la question avec votre vraie requête.
Mayeenul Islam
@MayeenulIslam, "implement the post_type as directed"que voulez-vous dire?
CoalaArmy
Comme indiqué dans le lien fourni , ou en utilisant un générateur simple comme: ce générateur de type de publication .
Mayeenul Islam
@ MayenulIslam: Je ne suis pas convaincu que "la relation dont vous parlez existe déjà". Par défaut, il n'y a pas de relation directe entre les différents types de publication.
s_ha_dum
@s_ha_dum Désolé, j'ai raté une partie de sa question où il a déjà dit qu'il avait deux post_types. C'est mon erreur. J'essaie de lui faire clarifier ses détails. J'ai raté que le détail soit déjà là. :( Je parle de la relation intérieure de la taxonomie et du type de message personnalisé s'il est défini.
Mayeenul Islam

Réponses:

22

Utiliser un plugin

Quelques très bons plugins pour les relations:

Utiliser une 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 entre les films sous forme de liste pour les publications 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
} }
vmassuchetto
la source
3
J'aime l'idée avec les métaboxes (en essayant d'éviter les plugins)!
CoalaArmy
Sans créer un autre article, pouvons-nous ajouter à cela comment créer un permalien à partir de cette relation parent / enfant? Par exemple http://domain.com/series-name/movie-name:?
Xtremefaith
@Xtremefaith cela peut être fait avec un autre code. Il y a un plugin que j'ai créé pour les catégories. Vous pouvez peut-être l'utiliser comme référence. wordpress.org/plugins/hierarchical-urls
vmassuchetto
5

Je recommande le plugin Posts 2 Posts , que je viens de commencer à utiliser.

Il vous permet de créer des relations plusieurs-à-plusieurs entre les publications et les types de page, ce qui signifie que vous pouvez créer un lien moviesvers 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 d'obtenir des détails plus fins lors de la création de vos connexions. Il est assez flexible dans son utilisation, ce qui permet de contrôler les métaboxes d'administration, les types de connexion et les moyens d'afficher vos connexions sur le frontal. Enfin, il est bien documenté .

JMB
la source
Je vais y jeter un œil.
CoalaArmy
Je cherchais qc. similaires et ont essayé diverses solutions. Je dois dire que celui-ci (Post 2 Post) était parfait, ce n'est peut-être pas ce qu'un "non-programmeur" rechercherait, mais si vous cherchez plus de qch. comme une bibliothèque à utiliser dans votre modèle, alors c'est juste parfait, bien documenté, bien intégré, obtenez-le! ;)
Larzan
J'ai fait un petit plugin pour les relations post mais wordpress.org/plugins/softmixt-relations
Softmixt
2

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

Les relations MB prennent en charge les relations bidirectionnelles par défaut et utilisent une table personnalisée pour stocker les relations (comme P2P) pour de meilleures performances (que post meta).

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

Anh Tran
la source