WordPress : un excerpt spinnable (et unique pour chaque catégorie ou tag !)

L’un des (petits) défauts de WordPress est, dans les thèmes courants que l’on peut trouver sur le marché, de servir un excerpt unique, quel que soit la page où il va s’afficher.

Si par malheur vous avez à un moment donné une catégorie qui affiche scrupuleusement les mêmes articles qu’une page de tags, ou bien deux pages de tags avec les mêmes articles, alors ces pages entreront systématiquement en duplicate content (contenu dupliqué).

Voici un petit hack pour remédier à ce problème, en rendant spinnables les excerpt, et en s’assurant que chaque spin généré soit (quasi) unique pour chaque page de taxonomie 🙂

L’astuce consiste à ajouter un filtre sur l’appel à the_excerpt(), via notre bon vieux fichier functions.php ; en ajoutant une clause srand liée à l’ID de la taxonomie en cours d’affichage, nous rendrons uniques (ou presque) chaque spin pour chaque page de taxonomie (astuce donnée par @512banque, et dont j’ai pris connaissance par Jérémy Allard)

<?php
	/*
	* Fonction de spinning de texte (syntaxe : {test|essai})
	* avec hack pour spin unique/catégorie ou tag (par @512banque)
	*/
	function spin($txt){
		$pattern = '#\{([^{}]*)\}#msi';
		$test = preg_match_all($pattern, $txt, $out);
		if (!$test) return $txt;

		// On rend le shuffle unique
		if(is_category()) {
			// On est sur une page catégorie
			$category = get_the_category();
			$mycat = $category[0]->cat_name;
			$id = get_cat_id($mycat);
		}
		elseif(is_tag()) {
			// On est sur une page de tag
			$id=get_query_var('tag_id');
		}
		else
		{
			// Autres pages => on génère un ID unique depuis l'URL
			$id= preg_replace("/[^0-9]/", "", md5($_SERVER['REQUEST_URI']));
		};
		srand($id);

		$atrouver = array();
		$aremplacer = array();
			foreach($out[0] as $id => $match)
			{
				$choisir = explode("|", $out[1][$id]);
				$atrouver[] = trim($match);
				shuffle($choisir);

				$aremplacer[] = ($choisir[0]);
			}
			$reponse = str_replace($atrouver, $aremplacer, $txt);
		return spin($reponse);
	}

	// Ajout du filtre sur appel de "the_excerpt"
	function spinnable_excerpt_content( $content ) {
        return spin($content);
	}
	add_filter( 'the_excerpt', 'spinnable_excerpt_content' );

?>

Le résultat est visible sur mon blog photo, sur l’article consacré à mes crapauds photographiés sous l’eau (vous pouvez observer différents excerpt sur les pages de catégories et de tag concernées : photographies, sous l’eau et herpétologie)

Voir tous les articles de la catégorie WordPress

56 réflexions sur “WordPress : un excerpt spinnable (et unique pour chaque catégorie ou tag !)”

  1. À noter que l’on peut également utiliser la même fonction carrément sur the_content au niveau du filtre 😉

    Ainsi il est possible, pour les thèmes qui n’utilisent pas the_excerpt, de spinner également tout ce qui est au-dessus de la balise more.

  2. Simple et efficace, merci pour le tip qu’il faudrait que j’adapte à mon propre wp.

  3. Merci pour l’astuce, je vais tester ! Ca peut être l’occasion de réactiver certainnes pages.
    une petite coquille :
    et donc j’ai pris connaissance par Jérémy Allard

  4. L’un des gros avantages de WordPress c’est justement qu’on peut y ajouter nos propres « plugins » pour peu qu’on sache un peu développer, la preuve en images, ou plutôt en lignes, avec ce petit script, à garder en favori, merci bien.

  5. Elle est pas mal cette petite astuce de Kévin. Elle a le mérite de réveiller les pages categories et Tag – pour peu qu’il y ait quelques articles dedans et elles deviennent potentiellement de bonnes portes d’entrées

  6. Excellente idée les amis, c’est clair que c’est un vrai plus d’avoir des excerpt différents du contenu des articles, surtout lorsque ces excerpt sont particulièrement longs.

    Merci beaucoup pour ce code, je vais tester ça ce week end 🙂

  7. cela me fait drôle de revoir cette syntaxe, bien pratique dans ce cas précis 😉

  8. Bonjour,

    C’est en effet un problème récurrent pour les blogs WordPress qui publient souvent dans la même catégorie.
    Vous venez de donner la solution. Merci beaucoup pour le script !

    Bon week-end,

  9. thierrypigot

    Bonne idée, faut juste penser à également mettre la fonction dans le functions.php de wpTouch 😉

    Thierry

    1. Cédric GIRARD

      Effectivement, je n’y avais pas pensé (en fait je ne savais pas)

      Bonne remarque !

    1. Cédric GIRARD

      Ahhhh en voilà une bonne idée 🙂

      Bon ceci dit, faudrait déjà que mes clients saisissent des descriptions uniques avant de penser à faire du spinning… Mais effectivement ça peut être intéressant !

  10. Bonjour,

    Une très bonne astuce ! Je vais testé ça rapidement. Comme le dit Valentin la même chose sous PrestaShop sera vraiment bien, c’est à étudié.

  11. Bonjour Merci pour votre spiner. Avez vous prévu une mise a jour prochainement ??? pour juillet ou Aout ? Merci et bon courage. Vive effispin 🙂

    1. Cédric GIRARD

      Bonjour Gérard

      Oui, une mise à jour (colossale !) est en cours de finition… J’ai d’ailleurs peut-être eu les yeux plus gros que le ventre 🙂 mais le résultat devrait plaire !

  12. Bonjour,

    Très pratique ! Merci bien pour ce script qui peu-être très utile.

  13. Bonsoir,

    Je l’ai mis dans function.php mais j’ai toujours les mm extrait pour les tag et les catégories.

    Faut il faire autre chose? merci de m’aider.

    1. auto-pedia.fr

      Bonjour Zoé,
      Avez-vous bien rédigé le début de votre article de manière à ce qu’il soit spinnable comme indiqué en commentaire du code ? {texte base| texte a remplacer}

  14. Bonjour, merci bien pour ce script très pratique, il va très certainement me servir 🙂

  15. Je dois avoir un soucis dans mon code, lorsque je fais cette manip ça me met une erreur php 🙁

  16. Merci du conseil, je vais le tester. c’est effectivement un truc qui me bloquait depuis quelques mois!

  17. Je me pose une question, doit on effectuer un changement important lorsqu’on veut faire du multi spin?

    Tu devais faire une mise à jour? si oui il y aura quoi de nouveau?

    1. Cédric GIRARD

      Bonsoir

      La v2.0 est toujours sur le feu, on va dire « en pause hivernale » (hum…) mais je terminerai. Ces temps ci j’ai peu de temps à y consacrer malheureusement !

      Le multispin fonctionne très bien, je n’ai pas encore encodé la sauvegarde/restauration de projets (totalement différente de la v1.x d’effiSpin au passage…)

      Y’aura donc au programme le multispin (avec fonctionnalités matricielles), l’intégration plus fine de base de données, l’alimentation de blogs WordPress via XML RPC, etc.

      Beaucoup de choses fonctionnent mais ne sont pas encore débuguées…

  18. Merci pour se hack je vais essayé tous de suite.
    Cela marche aussi pour un multisite?

  19. bonjour,
    j’ai mis le code dans le fichier function, il mélange bien les contenus ce qui me donne des textes différents sur les tags et les catégories mais sur l’article complet, il me donnes les deux textes en même temps…quelqu’un a une idée d’où ça peut venir ?

    1. Cédric GIRARD

      Bonjour

      Ahhh c’est étrange !!! Tu n’aurais pas deux fois la fonction pour afficher l’excerpt dans ton code ?…

      Parce que techniquement je vois pas comment ça peut être possible autrement 🙂

      Tu peux coller ton code dans une balise < code > ici même !

  20. Salut Cédric,
    j’ai essayé de te poster le code du fichier function mais ça passe pas ou alors ça part direct en spam peut être.
    est ce que tu veux que je te l’envoie sur ton formulaire de contact ?

  21. hello,
    Ta réponse ma mis sur la voie et j’ai trouvé la solution,
    j’ai rajouté un filtre sur the_content également.
    Je pense que ça doit être propre à certain thème.
    en tous cas merci.

  22. ah oui je rajoute le code ça peut servir pour quelqu’un d’autre
    add_filter( 'the_content', 'spinnable_excerpt_content' );

    1. Oui effectivement, on peut appliquer le filtre à tout ce que l’on veut de filtrable 😉

  23. Cette astuce demande finalement beaucoup de travail, (spinner chaque excerpt) pour un risque finalement relativement minime non ?

    Je ne suis pas spécialiste wordpress donc j’imagine sans doute pas l’utilité du script mais j’admire l’optimisation et la recherche du détails.

  24. Bonjour, j’ ai le même soucie que Zoé. J’ai intégré le script dans mon fichier functions.php. Puis j’ai copier coller pour voir dans un aticle »{texte base| texte a remplacer}  » puis enregistré et c’est écrit « {texte base| texte a remplacer} « ..j’ ai du oublier quelque chose… une troisième video ou capture d’écran d’intégration et d’utilisation serait bienvenue pour la touriste que je suis^^. Ha, j’oubliai, merci beaucoup pour ce script et le logiciel…enfin quelque chose de nouveau (pour moi) dans le monde seo.

  25. avec certain theme,il faut filtrer le contenu également et pas seulement l’extrait, voir mon post plus haut.

  26. Oui, je l’est bien vue (si tu parle de add_filter( ‘the_content’, ‘spinnable_excerpt_content’ ); )mais je ne sais pas où l’ajouter ..

  27. Salut salut,

    Je viens de voir cette possibilité et j’ai direct inclus ça sur notre site (voir url pseudo) mais j’ai un soucis, quand je recharge je n’est pas de changement de texte et celui-ci n’a été effectif que pour la home.

    Du coup je me retrouve bien avec la home + une catégorie spinné mais la sous cat reste toujours comme la cat, normal docteur ?

      1. Cédric GIRARD

        Ah par contre la sous-catégorie, c’est effectivement pas normal… Lié peut-être à l’URL ? Je ne sais pas 🙁

  28. désolé je te réponds un peu tardivement, en fait il faut l’ajouter dans tous les fichiers de ton thème où il y a the_content. (par exemple loop.php, function.php) après faut tester parce que ça dépend du thème que tu utilises.

  29. un double classement quotidien des sites francophones basé sur les visites et les votes reçus par les sites.
    Weborama.fr permet ainsi aux internautes de découvrir les meilleurs sites du moment.

  30. bonjour,
    j’ai mis le code dans le fichier function, il mélange bien les contenus ce qui me donne des textes différents sur les tags et les catégories mais sur l’article complet, il me donnes les deux textes en même temps…quelqu’un a une idée d’où ça peut venir ?

    1. comme indiqué plus haut dans mon post précédent, il faut bien filtrer TOUS les contenus.
      Ce que tu indiques, montre qu’il y a un filtre qui n’a pas été appliqué correctement.

  31. Perso j’ai toujours pas confiance au Spinning d’ailleurs les gens ont déjà du mal à mettre des textes uniques alors lol le spinning mais merci je vais quand même tester pour voir .

  32. C’est un réel défaut de WordPress. J’espère que dans les prochaines version, cette optimisation des extraits sera rajoutée nativement. Tant dans un objectif d’ergonomie utilisateur que de référencement d’ailleurs !

  33. Bonjour et merci Cédric
    Justement les tags devenaient un sujet épineux pour quelques un de mes sites …
    Je rajoute ce blog dans mes bookmarks 😉
    Olivier

  34. Merci pour ce script, je vais bidouiller mon function.php et je voir ce que ça donne.
    Encore un article stp, ça fait 5 mois 🙁

  35. Superbe, merci pour le partage, il est vraiment trop fort ce @515banque !! mais comment fait-il pour penser à ça ?? Comme beaucoup de tools, une fois que tu l’as ça te parait évident mais franchement j’y aurait pas pensé tout seul.

    Ca règle un des principaux problèmes de wordpress concernant le DC et ça permet beaucoup plus de liberté pour utiliser les pages tag et catégorie qui peuvent potentiellement être « bankable » (et ainsi transformer une lacune en véritable potentiel).

  36. Cédric, il faut suivre le fil des comment et les diverses interventions de chacun pour arriver à un résultat qui fonctionne. Ce sujet est super intéressant, mais as tu utilisé déjà ce plugin, qui pourrait permettre de faciliter la tache de tout le monde ? Je ne l’ai pas encore testé mais en faisant quelques recherches, ce lien m’est apparu : https://wordpress.org/plugins/advanced-excerpt/

    1. Cédric GIRARD

      Bonjour Olivier

      En principe le seul fait de copier/coller le code dans le functions.php doit suffire, si le thème est correctement développé (si le filtre sur « the_excerpt » ne fonctionne pas c’est que le thème utilise « the_content » partout, par exemple)

      On peut étendre cette fonction à « the_content » en ajoutant un filtre comme suit :

      add_filter( 'the_content', 'spinnable_excerpt_content' );

  37. Sympa comme technique
    Je viens de tomber la dessus alors que je cherchais totalement autre chose et ça va envoyer du bois mixé à une API sémantique que j’utilise déjà

    Merci bcp vraiment !!!

Les commentaires sont fermés.

ut diam venenatis et, dolor Aenean velit, Retour haut de page