Gérer des relations entre type de contenu avec le plugin Post to post

Dans ce tuto, je vais tenter d’expliquer comment parvenir à gérer des relations entre vos types de contenus, avec une utilisation spécifique du plugin post to post,

De custom post à custom post

Dans ce scénario, je fais référence au concept de loop dans la loop qu’on retrouve ici

Voici le scénario du site: on a une liste d’artiste, et une liste d’evènements..on voudrait pouvoir lier les deux, de sorte que lorsque l’on se trouve dans la page d’édition de l’artiste, on puisse y associer une ou des exihbitions(dans une liste), et inversement, lorsque l’on est sur la page d’édition d’un évènement, on peut y associer un ou des artistes.Cela peut servir par exemple à afficher dynamiquement le nom le de l’artiste (qui est en fait le titre de mon custom post « artist ») sous chaque nom d’éxhibition et ou inversement..

Post to post nous permet de le faire dynamiquement, une fois notre fonction (« type de connexion ») et nos boucles crées, tout se fait tout seul.

Dans ce cas précis, on a nos deux custom post type: artist et exhibitions (ou evenement)

je place ce code dans functions.php

function my_connection_types() {

p2p_register_connection_type( array(
'name' => 'posts_to_posts',
'from' => 'artist',
'to' => 'exhibition'
) );
}
add_action( 'p2p_init', 'my_connection_types' );

cela va automatiquement créer des metabox dans mes deux types de contenus.:

Dans la page artist, on retrouve notre metabox qui nous permet de selectionner parmi toutes les exhibitions.

exhxibi

Dans la page exhibition, on retrouve automatiquement la liste de tous les custom post « artist » crées :

rtista

Se reférer à ce chapitre pour comprendre la réciprocité des relations 

Et voici ensuite un exemple de boucle pour restituer, sur une page « exhibition », la liste de noms e tous les artistes récupérés par ma fonction:

$args = array (

'post_type' => 'exhibition',
'posts_per_page' => -1,
'orderby' => 'meta_value', // meta_value or meta_value_num
'order' => 'ASC', // ASC or DESC
);

$date_query = new WP_Query( $args );
if ($date_query->have_posts()) : ?>
<?php while ($date_query->have_posts()) : $date_query->the_post();

?>



<div class="entry-content">

<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<?php $preserve_post = get_post();?>
<?php // Find connected pages $connected = new WP_Query( array( 'post_type'=>'artist',
'connected_type' => 'posts_to_posts',
'connected_items' => $post,
'nopaging' => true,
) );
// Display connected pages
if ( $connected->have_posts() ) :
?>



<ul>
<?php while ( $connected->have_posts() ) : $connected->the_post(); ?>



<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>



<?php endwhile; ?>
</ul>



<?php
// Prevent weirdness
// wp_reset_postdata();
endif;
$post = $preserve_post;
setup_postdata( $post );
<----------Suite de l'affichage de la boucle initiale------->
</div>



<?php endwhile; ?>
<?php wp_reset_query(); ?>
<?php endif; ?>
</div>

Je suis ici sur un modèle de page « exhibition », censée me restituer toutes les exhibitions avec dans la liste du contenu, le nom de l’artiste lié.

Pour ce faire, je crée donc ma boucle initiale avec mes arguments, je place un <?php
$preserve_post = get_post();?> pour conserver ma boucle initiale, je lance ma deuxième boucle allant chercher ma fonction crée précédemment: ‘connected_type’ => ‘posts_to_posts’,je récupère ici juste le titre de mes custom post « artist ».

Enfin je récupère l’état de ma boucle initiale avec un  $post = $preserve_post;
setup_postdata( $post ); pour continuer a afficher d’autres informations de la boucle initiale.

Dans la page Artist, je peux également, dans une boucle afficher le contenu par exemple du type de contenu lié,

        <?php $connected = new WP_Query(array( 'connected_type' => 'posts_to_posts',

'connected_items' => get_queried_object(),
'nopaging' => true,
));
if ($connected->have_posts()) :
while ($connected->have_posts()) : $connected->the_post()
?>

c’est le meme type de connexion auquel je fais appel dans mes arguments: « ‘connected_type’ => ‘posts_to_posts’, »  puisque ma fonction crée des liens dans les deux sens.