Tout savoir sur WordPress

Eviter le duplicate content sur les archives des catégories

Par défaut, WordPress contient un bug qui provoque du duplicate content sur les pages d’archives des catégories. Pourtant, il existe une solution simple pour éviter ce problème.

Dans WordPress, l’adresse URL vers les catégories ressemble par défaut à ceci : http://example.com/cat/non-classe/

Niveau SEO et référencement naturel, il serait mauvais d’avoir une page qui reprend exactement les mêmes articles dans le même ordre, et avec les mêmes extraits.

Avez-vous déjà essayé ces URLs là ?

  • http://example.com/cat/non-classe/non-classe/non-classe/
  • http://example.com/cat/toto/blabla/non-classe/

On remarque que la page ne provoque pas d’erreur 404 et que les pages sont identiques… Par conséquent, nos pages sont dupliquées et on obtient un duplicate content assez désagréable. De plus, si des référenceurs malins s’en prennent à vous, ils diffusent ces URLs pour vous plomber le référencement de votre site Internet.

Pour éviter à ce problème, copiez le code suivant dans le fichier functions.php présent à la racine de votre thème :
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]

add_action( 'wp', 'baw_non_duplicate_content' );
function baw_non_duplicate_content( $wp ) {
    global $wp_query;
    // On cherche à naviguer dans une catégorie
    if( isset( $wp_query->query_vars['category_name'], $wp_query->query['category_name'] ) )
    {
    	global $wp_rewrite;
    	$paged = isset( $wp_query->query_vars['paged'] ) && (int)$wp_query->query_vars['paged']>1 ?
    			'/'.$wp_rewrite->pagination_base.'/'.(int)$wp_query->query_vars['paged'] : '';
    	// On récupère l'url de la catégorie désirée, et l'url actuelle
	$correct_url = get_term_link( $wp_query->query_vars['category_name'], 'category' );
	if( is_string( $correct_url ) && $correct_url )
	{
	    $correct_url .= $paged;
	}
	$actual_url = home_url( $_SERVER['REQUEST_URI'] );

	// Si les urls sont différentes, on redirige vers la vraie url de la catégorie
	if( is_string( $correct_url ) && $correct_url != $actual_url )
	{

	    wp_redirect( $correct_url, 301 );
	    die();

	}
    }
}

[/pastacode]
N’hésitez pas à mettre en place cette astuce sur tous vos sites WordPress pour éviter le duplicate content qui est tant détesté et chassé par les pro du SEO !

Cet article a été mis à jour il y a 4174 jours - Il n'est peut être plus à jour !

Article écrit par Julio P.

Fondateur de SecuPress, l’extension de sécurité WordPress, Julio Potier est un Expert WordPress, un Formateur Expérimenté et un Consultant en Sécurité Web.

Il aime partager ses compétences et ses réflexions sur WordPress, donnant des conférences partout dans le monde.

66 Commentaires

  1. Une astuce intéressante, on n’y pense pas forcément. Par contre si l’URL est linkée à aucun endroit, il y a peu de chance que l’internaute tombe dessus et donc fasse un lien vers cette page. Donc ça ne risque pas de “surcharger” le code pour rien ?

  2. Hello
    Non car ici aucune requête supplémentaire n’est faite, on regarde juste ce que WordPress a déjà en mémoire, donc on perds peut-être une nanoseconde ;)
    Le truc c’est qu’il parait que des vilains référenceurs peuvent s’amuser à volontairement backlinker vos URLs duplicate dans le but de vous faire sombrer côté SEO.
    Voilà !

  3. Franchement desfois wordpress complique les choses pour rien, il te crée des pages dont tu veux pas!
    Sinon pour le référençage des pages dupliquée, tu peux mettre une balise canonical ;)

  4. WordPress ne crée pas ces URLs c’est bien le problème. En fait le soucis réside dans le fait que le parsing de la requête est un peu bancale et devrait à mon gout rediriger comme le propose mon astuce.
    ps : Merci à Jo de me faire la vidéo, je suis un peu pris ces temps-ci …
    Tu penses que la balise canonical suffit pour palier au problème ?
    ps2 : on dit référençage aussi ? Je pensais juste “référencement”, mais je suis pas bon SEO, je veins peut-etre d’apprendre un truc.

  5. @Julio : effectivement je n’avais pas pensé au NSEO… mais oui du coup tu as raison, il vaut mieux quelques lignes de code pour s’en protéger.
    Sinon pour “référençage”, on est 2. Pas certain que ce soit français. ;-)
    Pour la balise canonical, logiquement ça devrait aider, mais avec Google qui fait un peu ce qu’il veut, je ne pense pas que ce soit suffisant. C’est mieux que rien, mais s’il y a mieux (comme ta solution), autant appliquer une autre méthode.

  6. Ce que je trouve tout de même bizarre avec ce bug, c’est qu’il n’est pas présent sur les archives des tags.

    Pourquoi ? That’s the question !

  7. Chapeau bas! Très efficace.
    J’allais poser la question de la performance mais pour une nanoseconde dans un cas précis je vais m’abstenir.

  8. @jo : car les tags n’ont pas de parent, c’est une taxo non hiérarchique. Les cat peuvent donc avoir une url contenant plusieurs éléments, le dernier étant le dernier enfant. Les tags non, donc si l’url contient un élément de trop, WordPress te sort une 404 ;)

    @jm: Oui quand tu lis le contenu d’un array, ça ne mange rien ;)

  9. @JuJu (je peux ?) : En effet, expliquer comme ça, c’est tout de suite plus logique !

    Merci pour l’info ^^

  10. Ce bug est connu depuis plusieurs mois par les devs et je ne sais pas comment ça va finir, il a été corrigé, puis rebug et depuis plus d’un an, rien n’a changé la discution n’avance pas :/
    Le bug n’est pas présent si vous n’utilisez pas la structure de permaliens, donc /?cat=2 ne peut pas reproduire le bug.
    Bon pour autant, je préfère avec les permaliens et mon astuce ;)

  11. Je vais faire mon chieur mais c’est pas mieux de faire une 301 pour éviter la duplication “à la source” ?

  12. Merci pour l’astuce, c’est clair qu’on y pense pas souvent…Pourtant Google sanctionne facile le duplicate content. Il faudra que je teste ce script sur mes sites ;)

  13. Bonjour
    Bravo pour l’article, non seulement c’est clair mais ça ne va pas vers quatre chemins, j’ai vite compris ce qu’il fallait faire. Une astuce à appliquer sans attendre,
    Merci beaucoup
    A bientôt

  14. Génial ! merci de l’astuce mais pourquoi avous enlevez pas le dossier réécrit /cat/ c’est possible avec wordpress seo je crois non ?

  15. Oui mais tout le monde n’a pas le besoin, l’envie, le savoir d’enlever ce préfixe, ceci est même justement un autre besoin, un autre problème, une autre astuce ;)

  16. Oui là j’avoue que je me posais la même question que WILOOOO… Qui fait du SEO WP sans utiliser wordpress SEO ?
    Auquel cas, il permet d’enlever le préfixe /categorie/

    Je me demande si j’ai bien compris de quoi on parle, en fait ???

    D’ailleurs ce post fort intéressant m’amène à me poser une autre question relative au duplicate content… Sur WP il est courant d’attribuer un article à plusieurs catégories.
    Du coup, le même extrait est repris sur les deux URLS des deux catégories, cela ne pénalise t-il pas le référencement ?
    N’est-ce pas une forme de duplicate content ?

    Bonne soirée,
    Fabi

  17. C’est est une et il me semble que SEOMIX avait une parade, je vais chercher … au premier qui trouve ;)

  18. bonjour,
    dans le même ordre que le commentaire de wiloooo, j’ai moi aussi enlevé le dossier “cat”, du coup est ce que l’astuce proposée à un intérêt pour moi ou ça ferait double emploi?

  19. @Romain : l’astuce fonctionne quelque soit la base de la catégorie ;)

    Julio utilise $wp_query->query_vars[‘category_name’] pour récupérer le chemin de la catégorie. Que la base soit cat, category ou autre chose ne changera rien.

  20. Merci, pour ce code, j’ y connais rien , mais je te fait confiance et l’est copier/coller dans mon fichier..C’est pas le genre de chose qu’ on peut vérifier finalement..

  21. Salut,

    J’ai été très surpris de voir qu’il est effectivement possible d’arriver à une catégorie depuis plusieurs URLs !

    Hallucinant cette “faille” quand même, tu as contacté le support WP ?!

    Bon, je sais ce qu’il me reste à faire : Merci pour ce script Julio ! ;-)

  22. Bien vu en effet, c’est un soucis dans wordpress cette mauvaise gestion des urls, à côté de ça je conseil toujours de mettre en place une canonical même si c’est plutôt une rustine elle est très pratique ^^ car malheureusement ce n’est pas le seul bug d’url’s sur WordPress …

  23. en effet, je ne sais pas si c’est mon plugin seo qui fait ça, mais il y a bien un canonical qui redirige vers la bonne url.

    Mais tant qu’a faire avec du NSEO, on peut aussi ajouter des paramètres inutiles du genre :
    ?id=mon-negative-seo
    qui seront considérés comme duplicate

  24. @Attila : Pour les paramètres en GET sur les URLs, il suffit d’ajouter un Disallow: /*? dans le fichier robots.txt pour que ces pages là ne soient pas prise en compte ;)

    Plus d’infos sur cet article : robots.txt pour WordPress

  25. Ah oui effectivement. Il faut juste espérer ne pas avoir besoin d’un paramètre dans l’url.
    Si par exemple on a un lien qui provient de twitter ou rss avec un ?utm_source dedans, il ne sera pas suivi par google

  26. C’est pareil pour les ?utm_source, on s’en moque de les indéxés et ça fera du duplicate content si on le fait.

    Cela sert juste à donner une indication à Google Analytics.

  27. Salut, je suis en cour de test de SeeUrank Suite = Falcon + Webtools de Yooda et toutes mes urls de catégories sont considérés comme cassés, c’est plutôt embêtant..est ce le script qui provoque ca? Merci^^

  28. Merci pour ce hack WordPress très utile !
    Entre les archives et les tags, tout cela peut parfois s’avérer néfaste sans qu’on comprenne vraiment pourquoi et quand la solution est si simple, aucune raison de se priver !

  29. @GWEN
    J’ai le même problème avec SeeRank alors que je n’ai pas encore mis le code proposé. Pour moi,j’ai comme l’impression que le bogue de SeeRank est le diagnostic erroné mais il y a effectivement un pb avec nos WordPress… sans garantie

  30. Bonjour,

    Je ne touche pas trop au code.
    Je sais trouver et ouvrir le fichier function.php mais comment le modifier sans l’altérer…

  31. @Tendances: Il suffit d’ouvrir le fichier, de C/C le code dedans et de sauvegarder.

  32. Donc finalement je l’ai collé juste à la suite de la dernière ligne mais je n’ai pas l’impression que ça ait marché.
    Car mes articles en non classé redirige vers la page classée dans la bonne catégorie.

    /chronique/chronique-la-passion-du-sport-mais-pas-que-3/
    /non-classe/chronique-la-passion-du-sport-mais-pas-que-3/

    J’espère être clair ;)

  33. @Tendances: Ici on parle uniquement des pages des catégories et non pas des pages d’un article. C’est pour cela qu’il n’y a pas de redirection sur vos articles.

    L’astuce de l’article permet de régler le problème sur la page catégorie et pas sur la page d’un article (voir les URLs d’exemple dans l’article).

  34. Bonjour,
    Pouvez-vous m’éclaircir comment des référenceurs malins peuvent profiter du duplicate content sur les archives des catégories pour plomber le référencement d’un certain site Internet. Je n’ai pas bien saisi ce point.

  35. @Mima: S’il est possible d’accéder à la même page avec un nombre infini d’URL, alors n’importe qui peut indéxer une de ces URLs à votre insu.

  36. Bonsoir! Heu Julio, chez moi le code ne crée aucun changement. Mais dans les commentaires, j’ai lu que le code fonctionne en effectuant une redirection. C’est donc que, avant d’insérer le code, la redirection s’effectuait déjà sur mon blog, je n’en avait donc pas besoin ? Etrange..
    Pensez-vous que cela soit du à l’ajout des plugins PermalinkFinder, Auto Redirect 404 et Redirection ?
    (Eh oui… j’ai les 3, je suis un parano du 404 et du duplicate content… Les 3 plugins ne se court-circuitent t-ils pas ? C’est hors-sujet donc entre parenthèse!) Merci :-)

  37. Bonjour,
    Excellent et très utile.
    J’ai toutefois une question (je ne suis pas un programmeur chevronné) : comment ce code gère t-il le https ? Lors de l’installation d’un certificat HTTPS, toutes les URL sont doublées sur le site, avec le même contenu, seuls changent http et https. Ce code gère t-il ce problème potentiel ? Merci du retour.

  38. @David: Ce code concerne uniquement le problème avec les catégories. Ça ne touche pas au cas du SSL ou non.

  39. @David : Ce soucis doit être réglé via HTACCESS, tu dois forcer une redirection sur l’un ou l’autre.

  40. Bonjour et merci pour l’article,

    Une question particulière : je suis en train de réaliser une boutique sous Woocommerce, le référencement de produits est potentiellement difficile car produits non uniques, donc je redoute de classer certains produits dans plusieurs catégories.

    Une question toute simple avez vous déjà testé cette fonction avec une boutique woocommerce ?( j’ai l’impression que ce plugin fait déjà beaucoup de modifs dans le wordpress original)

    Me recommandez vous la mise en place de cette fonction pour ma boutique woo ?

    merci :)

  41. Bonjour,

    J’ai installé ce code dans mon fichier functions.php et ça conduit ma page administration en erreur suivant:

    Parse error: syntax error, unexpected end of file in /homepages/9/d507077369/htdocs/wordpress/wp-content/themes/mantra/admin/admin-functions.php on line 230

    Je ne sais pas comment réglait ce problème, car je n’ai pas accès à ma page de connexion mais heureusement que le site s’ouvre en mode visiteur.

  42. bonjour, c’est vraiment penalisant du duplicate content sur les categories ? je pense pas de mon coté

  43. Ah bah cool ! Je vais l’ajouter dans les fonctions de mon blog ! Voilà un blog que j’apprécie beaucoup de par ces nombreuses astuces sur WordPress. Merci. :)

  44. bonjour,
    je viens peut être un peu tard sur l’article mais j’ai un soucis que je n’arrive pas à régler…
    j’ajoute automatiquement une image à chacun des articles de mon blog.
    j’ai créé une page qui n’affiche les articles que d’une catégorie et par conséquent la page affiche l’équivalent d’une page d’archives de catégories.
    Le soucis c’est que sur chaque article j’ai mon image (200×300) et en plus son équivalent en plus grand (400×600), et c’est bien moche.
    Une idée pour qu’une seule image s’affiche comme sur ma page d’accueil?

    Merci d’avance!!

  45. Vraiment intéressant cet article, par contre peux-tu préciser (pour les novice dans mon genre) le chemin exacte ou il faut inséré ce code ?