WordPress related posts sans plugin

La liste des articles relatifs ( « related posts », in English please ) permet notamment de lister en bas d’article d’autres articles qui peuvent éventuellement vous intéresser car traitant de sujets associés ou similaires.

L’avantage est double : d’une part  le blogueur propose à ses visiteurs de rester un peu plus longtemps sur son site, de s’intéresser à ses rédactions de manière plus approfondie et pourquoi pas au final de le fidéliser. On fera fi ici de l’avantage pécuniaire ( on se cultive au passage ) à faire cliquer le visiteur, pour certains sites, le plus possible. D’autre part le visiteur qui a apprécié votre article se voit proposer de faire durer le plaisir en trouvant sans effort du contenu qui le passionne.

Pourquoi sans plugin ?

Juste pour taper du code, évidemment. Non, pas vraiment, mais plutôt dans le but de ne pas surcharger ce bon vieux WordPress d’un plugin supplémentaire. Personnellement j’aime faire avec le minimum lorsque c’est possible, car la tentation est grande d’installer en quelques clics un flopée de super plugins qui font le boulot tout seuls sans que le développeur n’ait à se casser la tête.

Malheureusement tout n’est pas rose au pays des plugins. Entre ceux qui sont bogués, dont le développement n’est pas suivi ou pire qui facilitent le piratage du site… Il faut faire attention à ce qu’on installe, faire le tri, décortiquer le code : Impensable sur des plugins qui contiennent parfois des milliers de lignes de code.

Tout n’est pas complètement noir quand même et il est impossible ( et inutile ) de réinventer la roue pour toutes les fonctionnalités courantes : Antispam, optimisation SEO, formulaires de contact, etc… Par contre, à mon sens, pour les petites tâches courantes comme les articles relatifs quelques lignes de code suffisent sans avoir à alourdir WP d’un énième plugin.

Et en terme de résultats?

Il pourra être objecté qu’un plugin dont le développement est sérieux, suivi et dont le développeur est reconnu donnera toujours de meilleurs résultats qu’un bout de code maison. Et ce pour de multiples raisons :

  • Le développeur du plugin a creusé le sujet
  • Il apporte des évolutions et  des corrections au fil des versions
  • La communauté des utilisateurs apporte son feedback et permet ainsi d’obtenir un plugin réellement efficace

Je suis à 200% en accord avec tous ces arguments mais il faut relativiser un peu. Certains éléments d’un site ou d’un blog, comme les articles relatifs, ne sont pas les garants d’une visibilité plus grande, par contre, la qualité rédactionnelle, oui.

Alors pour ma part, j’utilise un ti-bout de code qui génère une liste d’articles relatifs qui me convient parfaitement pour le moment.

Une base de départ

Avant de commencer j’ai fais comme tout le monde, une recherche Google du genre « Wordress related post without plugin ». Autant dire que les résultats sont maigres comparativement à ceux qui proposent l’utilisation d’un plugin. Je suis tombé sur un article qui m’a donné une base simple à mettre en œuvre. Cette méthode se base sur les tags ( mots-clés ) uniquement, autrement dit, les articles relatifs renvoyés aurons pour point commun, avec l’article courant, uniquement un ou plusieurs tags. D’autres partent du même principe mais en utilisant les catégories comme point commun.

A ma sauce…

Il m’a semblé plus judicieux d’intégrer la prise en compte des tags et des catégories dans lesquelles sont classées les articles mais aussi de générer le cas échéant, lorsque aucun article relatif ne semble disponible ( pas de tag ni de catégorie en commun ), une liste d’articles aléatoires.

Du code !

La requête principale parle d’elle même :

  • Les articles doivent être publiés
  • Nous ignorons l’id de l’article courant
  • Nous définissons le nombre de résultats
  • Nous ignorons les « sticky posts » ( articles mis en avant )

Ensuite nous allons récupérer la liste des ids des catégories rattachées à l’article courant via la fonction wp_get_post_categories(), puis nous utilisons la fonction wp_get_post_tags() qui retourne un tableau contenant les tags rattachés à l’article.

Tous ces ids, ceux des tags et ceux des catégories, seront passé en argument à l’objet WP_query via l’argument tax_query qui permet de récupérer des articles en fonctions de leurs taxonomies ( Génial ! ).

Le reste du code est simple : Si il y a des résultats nous les utilisons, ce sont les articles relatifs. Dans le cas contraire nous relançons une petite requête qui récupère une liste d’articles aléatoires ( la roue de secours en somme ).

Finalement la fonction affiche les résultats ou les retourne selon les besoins. Parfois il peut être utile de savoir si l’ont a des résultats pour gérer l’affichage correctement.

/**
 * Display related posts. Display random posts if there is no results
 * 
 * @param number $max_related Max of related posts to display
 * @param boolean $echo Display or return datas
 * @param array $ignore_ids Array of posts' ids to ignore ( i.e : prev & next posts )
 * @return array
 */
function tywp_related_posts( $max_related = 6, $echo = false, $ignore_ids = array() ) {

	global $post, $wpdb;

	# Base query
	$args = array(
		'post_status'         => 'publish',
		'post__not_in'        => array( $post->ID ),
		'posts_per_page'      => $max_related,
		'ignore_sticky_posts' => 1
	);
	if ( count( $ignore_ids ) > 0 ) {
		$args['post__not_in'] = array_merge( $args['post__not_in'], $ignore_ids );
	}
	# Tax query ( query for taxonomies : categories, tags... )
	$args['tax_query'] = array(
		'relation' => 'OR'
	);
	# Add categories to tax_query
	$categories_ids = wp_get_post_categories( $post->ID );
	if ( count( $categories_ids ) > 0 ) {
		$args['tax_query'][] = array(
			'taxonomy' => 'category',
			'terms'    => $categories_ids,
			'field'    => 'id',
			'operator' => 'IN'
		);
	}
	# Add tags to tax_query
	$tags_ids = array();
	$tags = wp_get_post_tags( $post->ID );
	if ( is_array( $tags ) && count( $tags ) > 0 ) {
		foreach ( $tags as $tag ) {
			$tags_ids[] = $tag->term_id;
		}
		$args['tax_query'][] = array(
			'taxonomy' => 'post_tag',
			'terms'    => $tags_ids,
			'field'    => 'id',
			'operator' => 'IN'
		);
	}
	# Query for related posts
	$query = new WP_Query( $args );
	if ( $query->post_count > 0 ) {
		$title = __( 'Related posts', 'my_domain' );
	# Query for random posts ( if there is no related posts )
	} else {
		$title = __( 'You may also like', 'my_domain' );
		$args['orderby'] = 'rand';
		$args['posts_per_page'] = 4;
		unset( $args['tax_query'] );
		$query = new WP_Query( $args );
	}
	# Datas
	$data = array(
		'total' => 0,
		'list' => ''
	);
	# Display results
	if ( $query->have_posts() ) {
		$data['total'] = $query->post_count;
		$data['list'] .= '<ul class="post-related">'
		. '<li><h4>' .  $title . '</h4></li>';
		while ( $query->have_posts() ) :
			$query->the_post();
			$data['list'] .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
			endwhile;
		$data['list'] .= '</ul>';
	}
	wp_reset_postdata();

	if ( $echo ) {
		echo $data['list'];
	}

	return $data;
}

Conclusion

Quelques lignes suffisent là ou parfois un plugin en aurait généré des centaines de lignes, voire plus. Mais je le répète, tout dépend de vos besoins et de vos attentes…

Pour ceux qui souhaiteraient afficher au passage une vignette ( thumbnail ) : Il suffit dans ce cas d’utiliser le bout de code suivant dans la boucle $query->have_posts() :

# Display posts' thumbnails
if ( has_post_thumbnail( $post->ID ) ) {
	the_post_thumbnail( 'thumbnail' );
}

A lire également

Un commentaire pour “WordPress related posts sans plugin

Laisser un commentaire

Champs requis : Nom, Email, Captcha & Commentaire. Votre adresse ne sera pas publiée

Etes-vous humain ? Merci de cliquer sur l'icône "réveil"

31st’udio

Besoin d'un site web ? 31st'udio crée pour vous des sites web 100% administrables et polyvalents, en savoir plus...

Catégories