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?
Quelques très bons plugins pour les relations:
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
} }
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é .
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.