Eviter le duplicate content
Au moins sur les archives des catégories !

Par défaut, WordPress provoque du duplicate content sur les pages d’archives des catégories. Bug ou pas, un ticket est en route depuis pas mal de temps pour savoir si le core doit être modifié à ce sujet. Néanmoins, il existe une solution rapide pour régler ce problème.

Du code, direct

Ne perdons pas de temps ! Voici le code que j’ai donc mis à jour et qui corrige quelques rares cas qui peuvent provoquer des redirections non attendues.

Copiez ce code dans un mu-plugin ou dans le fichiers functions.php de votre thème (enfant)

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 = 'http' . ( is_ssl() ? 's' : '' ) . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
	    $actual_url = reset( (explode('?', $actual_url)) );
	    $actual_url = reset( (explode('&', $actual_url)) );
	    // 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();

	    }
    }
}

Cette mise à jour gère la pagination de ces catégories, ce qui n’était pas le cas, de plus je récupère le permalien du terme maintenant, ce que je trouve meilleur.

Lire la suite

Vous aimez ? Partagez !

15 Commentaires

Avant de parler, merci de lire la charte des commentaires.

Utiliser le tag [php][/php] pour ajouter du code ou utilisez un service comme pastebin.com.
Cibler un commentateur avec un "@", merci à Mention Comments Authors !

  1. Bernard G. · avril 15, 2014
    Bonjour et merci pour cet article.
    Mais je me posais la question à savoir pour « de rares cas… » si cela valait le cout d’alourdir WordPress de quelques lignes de codes supplémentaires ?

    En tous cas, j’ai bien noter (et lu l’article) sur le mu-plugin très intéressant: merci encore pour les infos et découverte à la fois.

    • Julio Potier · avril 15, 2014
      Hello
      « alourdir » : si tu as besoin de ces redirections car les fakes pages de catégories qui font le duplicate content te gênent, le « poids » en vaut-il le coup ? Tu n’auras pas le même résultat sans rien. Au pire, c’est WordPress qui prendra ça sur lui, et là tu ne te posera pas la question.
      Ensuite à la lecture du code, il n’y a aucun traitement lourd si le cas n’est pas « true ». Je ne fais que vérifier des valeurs dans un tableau, ce n’est même pas calculable en temps de traitement. 0 requête !
      Après, si le cas est vrai, on fait un traitement en plus, mais on en a besoin non ? Sinon on aurait pas mis le code en place, ça reste finalement léger.
      Traiter le code de lourd, ça me fait mal au coeur :)
  2. Fabrice@WPFormation · avril 15, 2014
    Salut Julio,
    merci de la màj du code, attention toutefois il semble qu’utilisé conjointement avec ton code « 404 erreurs de pagination », il provoque une boucle de redirection…
    • Julio Potier · avril 15, 2014
      Merci, dans ce cas, je vais merger les 2 !
  3. Julien Maury@TweetPressFr · avril 15, 2014
    Sympa mais attention si vous avez une structure de permaliens en %category% et que vous avez supprimé me préfixe /category/^^
  4. Daniel Roch@WordPress, c'est la vie · avril 15, 2014
    Et dire que j’ai failli manquer cet article.

    C’est une excellente idée que voilà. Cela pourra éviter partiellement certaines attaques de négatives SEO qui cibleraient la création de pages doublons sur le site visé.

    D’ailleurs, je suis sûr qu’on peut faire le même code pour toutes les taxonomies de WordPress (celle des tags ou d’éventuelles custom taxonomies).

    • Julio Potier · avril 15, 2014
      Merci pour tous tes partages !
      Il me semble que pour les tags c’est inutile car la structure ne permets pas de triche, en revanche, à tester sur une custom taxo hiérarchique.
      ;)
  5. Bourgrire · avril 15
    Hello,
    Je viens de lire le livre de Daniel Roch « Optimiser son référencement WordPress » et de découvrir ton site, mentionné, par la même occasion.
    Amusant de le voir commenter cet article d’ailleurs…
    Je teste immédiatement ce code et petit lol en passant pour la charte @ »Plan rencontre dans les WC ».
  6. Susan@voyage · avril 15
    je découvre votre blog récemment et j’avoue que vos articles sont très intéressantes :)
    Merci pour les codes partagés pour éviter la duplicate en WP
    bon continuation,
  7. Greg@Screenfeed · avril 15
    Hellow.

    Attention, redirection infinie si le site est installé dans un sous-dossier (pas à la racine du site donc). Dans ce cas, $_SERVER['REQUEST_URI'] contiendra ce sous-dossier au début, et home_url( $_SERVER['REQUEST_URI'] ) fera apparaitre ce dossier en double.

    A+ et merci :)

    • Greg@Screenfeed · avril 15
      Problème résolu :)

      $actual_url = ‘http’ . ( is_ssl() ? ‘s’ :  » ) . ‘://’ . $_SERVER[‘HTTP_HOST’] . $_SERVER[‘REQUEST_URI’];
      $actual_url = reset( (explode(‘?’, $actual_url)) );
      $actual_url = reset( (explode(‘&’, $actual_url)) );
    • Julio Potier · avril 15
      Thanks, je ne garde que les 2 premières, les autres sont inutiles puisque REQUEST_URI ne contient pas la query, de plus la ligne 3 ne sert plus après la 2. #trad
    • Greg@Screenfeed · avril 15
      Hellow.

      Désolé je vais te contredire sur les 2 points :
      – REQUEST_URI contient la query,
      – la ligne 3 sert puisque rien ne m’empêche de me rendre à l’url http://example.com/&foo=bar (par contre ça déclenche une 404 dans mes tests).

    • Julio Potier · avril 15
      Exact, j’ai cru que QUERY_STRING l’avait seulement, j’ai confondu. Ok pour le trick du & en 404 x)
      re MAJ merci !

WP Rocket Banner