Insérer le tag canonical dans le header de votre thème WordPress

in WordPress

La duplication de contenus, ou duplicate content, est un problème commun pour toute personne s’étant penchée sur le référencement de son site un jour.

Dans l’un de leurs derniers articles, l’équipe WordPress nous parle des problèmes de duplication de contenu. Pour de nombreuses raisons, vous pouvez faire face à des problèmes de duplicate content sur votre blog : migration d’anciennes pages, ajouts de liens de tracking en fin d’URL, problème de copie d’URL de la part de vos lecteurs qui partagent l’article, …

Deux solutions principales existent lorsque vous rencontrez ce type de problèmes : la mise en place de redirections 301 pour rediriger la mauvaise URL vers la bonne, et ainsi indiquer à Google quelle est l’URL qu’il doit indexer; et la mise en place d’une balise rel=”canonical” dans l’en-tête de votre page.

Fonction existante de WordPress

On trouve dans le code source de WordPress une fonction développée pour ajouter cette balise automatiquement en en-tête de vos articles : rel-canonical.

Cette fonction remplit parfaitement son role, mais elle présente un défaut majeur : cette balise n’est alors rajoutée que dans l’en-tête des articles, et non sur les pages d’archives ou même la page d’accueil de votre blog. Essayons donc de régler ce problème avec une nouvelle fonction.

Remplacer rel_canonical par notre propre fonction

Voici donc le code à insérer dans le fichier functions.php de votre thème. Si celui-ci n’est pas présent, créez-le.

<?php

// Ajouter la balise rel canonical en en-tete de votre theme
function werewp_canonical() {
	global $wp_query, $paged;

		if ( is_singular() ) {
			global $post;
			$canonical = get_permalink( $post->ID );

			$page = get_query_var('page');
			if ( $page && $page != 1 ) {
				if ( substr_count($wp_query->queried_object->post_content, '<!--nextpage-->') >= ($page-1) )
					$canonical = user_trailingslashit( trailingslashit($properurl) . get_query_var('page') );
			}
		} else {
			if ( is_front_page() ) {
				$canonical = get_bloginfo('url').'/';
			} else if (is_home() && get_option('show_on_front') == "page") {
				$canonical = get_permalink( get_option( 'page_for_posts' ) );
			} else if ( is_tax() || is_tag() || is_category() ) {
				$term = $wp_query->get_queried_object();

				$canonical = get_term_link( $term, $term->taxonomy );
			} else if ( is_archive() ) {
				if ( is_date() ) {
					if ( is_day() ) {
						$canonical = get_day_link( get_query_var('year'), get_query_var('monthnum'), get_query_var('day') );
					} else if ( is_month() ) {
						$canonical = get_month_link( get_query_var('year'), get_query_var('monthnum') );
					} else if ( is_year() ) {
						$canonical = get_year_link( get_query_var('year') );
					}
				}
			}

			if ( isset( $paged ) && $paged && !empty( $canonical ) )
				$canonical = user_trailingslashit( trailingslashit( $canonical ) . 'page/' . $paged );
		}
		echo '<link rel="canonical" href="'.$canonical.'" />
		';
}

// Appeler la fonction grace a wp_head, et retirer la fonction initiale presente dans WordPress
add_action('wp_head', 'werewp_canonical');
remove_action('wp_head', 'rel_canonical');

?>

Sauvegardez, uploadez, et le tour est joué. La suppression des pages dupliquées dans l’index de Google prendra quelques temps, puisque Google doit tout d’abord revenir crawler le mauvais URL en question afin de détecter la nouvelle balise. Si vous êtes impatients, il vous suffit d’ajouter une redirection de la mauvaise URl vers la bonne dans votre fichier .htaccess.

Si vous ne vous sentez pas prêts à mettre les mains dans le code, vous pouvez aussi installer le plugin plugin WordPress SEO de yoast.com. Le code proposé dans cet article est d’ailleurs adapté d’une partie de ce plugin.

Des questions, des remarques, une autre solution ? N’hésitez pas, les commentaires sont là pour ça !

  1. Bonjour Jéremy,

    merci pour cet article très intéressant. J’aurai une petite question pratique vu que tu m’as l’air plus que calé sur wordpress : je dispose d’un blog sur lequel j’ai 5 articles en homepage (que des extraits)

    J’ai donc sur la home : le titre de l’article en h2 avec un lien vers l’article complet (single.php), l’extrait, et un autre lien “Continuer la lecture” vers l’article complet.

    Je suppose que niveau seo ça ne doit pas être terrible puisque d’un côté j’ai une ancre avec le nom de l’article et de l’autre j’ai une ancre avec “continuer la lecture”.

    Que pourrais-je faire ? Mettre un rel nofollow sur le 2ème lien ? Mettre un rel canonical ? Ne rien faire ?

    Merci pour ton aide !

    • Ce n’est pas un problème très grave du point de vue SEO. Mais si tu veux faire des changements, il est vrai que tu pourrais ajouter un rel nofollow sur le lien “continuer la lecture”, puisque ce ne sont pas des mots clés intéressants.
      Pour ça, tu as trois solutions qui me viennent en tête :

      Soit tu remplaces ta balise the_content par une balise the_excerpt, tu n’auras donc plus de lien “continuer la lecture” du tout.

      Soit tu remplaces ta balise the_content par the_excerpt, puis sous cette balise tu ajoutes un lien vers l’article grâce à the_permalink, et tu attribues rel nofollow sur ce lien

      Soit tu modifies the_content grâce au filtre the_content_more_link

      Si tu veux que je fasse un petit article pour expliquer cela en détails, dis moi, je tâcherai de le faire aujourd’hui ou demain. Je vais aussi réfléchir aux aurtes possibilités en déals, au cas ou j’aurais oublié une troisième solution :)

Comments are closed.

Webmentions

  • Tutoriel : améliorer le « lire la suite » de WordPress | Jeremy @tagada.hu January 26, 2011

    […] la suite » de WordPress le 27 jan 2011 • 23:16 Pas encore de commentaires En commentaire de mon article précédent, Guillaume m’a posé quelques questions à propos du lien « Read More » […]