Introduction
Dans cet article, je vous propose une fonction PHP pour afficher des articles similaires sur votre site WordPress.
Suite au piratage du plugin Yuzo Related Post que j’utilisais sur le site, j’ai décidé finalement de me passer de plugin pour faire cela.
Pour avoir une démo, je vous invite à naviguer sur le site pour voir le résultat.
Le code
Dans le fichier functions.php de votre thème WordPress ajouter la fonction ci-dessous :
/**
* Permet l'affichage d'article en relatation
* Ajout de poste aleatoire sur pas de tag sur le post.
*
* @param int $post_id Post ID
* @param int $per_page Number of post print
* @param int $style_rp Result HTML
* V2
*/
function get_rdr_related_post($post_id, $per_page = 3, $style_rp = 2){
// Param Query
$args=array(
'post__not_in' => array($post_id),
'posts_per_page' => $per_page,
'caller_get_posts' => 1,
'meta_key' => '_thumbnail_id',
'orderby' => 'rand',
);
// Recuperation des tags
$tags = wp_get_post_tags($post_id);
if( $tags ){
// post contenant des TAGS
$tag_ids = array();
foreach($tags as $individual_tag){
$tag_ids[] = $individual_tag->term_id;
}
// Contruction filtre de la requete
$args['tag__in'] = $tag_ids;
}else{
// Recuperation categories du post
$cats = wp_get_post_categories($post_id);
if($cats){
$cats_ids = array();
foreach($cats as $individual_cat){
$cats_ids[] = $individual_cat->term_id;
}
$args['category__in'] = $tag_ids;
} // /if($cats)
} // /else
$my_query = new WP_Query($args);
if( $my_query->have_posts() ) {
if($style_rp == 1){
?> <div class="row"> <?php
while ($my_query->have_posts()) : $my_query->the_post(); ?>
<div class="col">
<a href="<?php echo esc_url( get_permalink() ); ?>">
<?php the_post_thumbnail('medium', array('class' => 'rdrit-home-thumbnail-max200') ); ?>
</a><br/>
<a href="<?php the_permalink() ?>" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a>
</div>
<?php
endwhile;
?> </div> <?php
}elseif($style_rp == 2){
while ($my_query->have_posts()) : $my_query->the_post(); ?>
<?php $excerpt = get_the_content(''); ?>
<div class="row">
<div class="col-2">
<div class="rdr-rp-image" style="background:url('<?php echo get_the_post_thumbnail_url(); ?>') 50% 50% no-repeat;width: 97.75px;height:68px;margin-bottom: 5px;background-size: cover;"></div>
</div>
<div class="col-10">
<a class="rdr-rp-title" href="<?php the_permalink() ?>" style="font-size:12px;line-height:22px;"><?php the_title(); ?></a><br/>
<span class="rdr-tp-text" style="font-size:11px;"><?php echo wp_html_excerpt(strip_shortcodes($excerpt),250) ?></span>
</div>
</div><hr/>
<?php
endwhile;
}
wp_reset_query();
} // /$my_query->have_posts()
} // end function
L’affichage est basé sur le Bootstrap.
Dans le fichier d’affichage des articles du thème, appeler la fonction avec le code ci-après :
<?php get_rdr_related_post($post->ID); ?>
Conclusion
Si vous avez un peu de connaissance en PHP, il est facile de personnaliser la fonction et d’avoir quelque chose dont vous gérer le code.
Je ne suis pas contre les plugins, ce qui fait la force de WordPress, mais pour certaines fonctionnalités, il est quand même préférable de faire les choses soit même ce qui réduit les risques pour votre site.
Une fonction de 60 lignes (elle pourrait faire moins) va remplacer un plugin de quasiment 200 fichiers sans réellement en connaître le contenu et comment votre site est affecté par celui-ci.
Mise à jour le 23/06/2019 :
– Ajout recherche sur catégorie
– Affichage article aléatoire si aucune catégorie et tag.
– Ajout de paramètre d’appel dans la fonction pour choisir le nombre d’articles et la disposition