Une structure en Silo sur WordPress

J’ai lu par-ci par-là (il y a quelques temps déjà) des trucs sur les cocons sémantiques et sur le SEO siloing.

Et comme la semaine dernière, j’ai voulu un peu faire ma veille SEO, j’ai repris un peu le code. Et j’ai décidé de transformer mon blog en Silo efficace. Voici comment:

Tout d’abord, bizarrement, ce nom de silo n’est pas très convainquant. Vu les shémas que j’ai pu croiser, on parle plus d’un escalier qu’autre chose. Le Cocon sémantique est sans doute plus adapté… même si je n’ai pas chercher plus loin les différences.

Bref, pour faire mon escalier très logiquement (et la structure de Google est faite sur ce principe aussi), il faut que ma page d’accueil mène sur mes categories, mes catégories sur mes articles… SANS avoir accès à la home.

En gros, si tu arrives sur un article la catégorie /seo (site.com/seo/comment-faire-une-structure-en-escalier.html) de mon blog, il ne faut pas que tu puisse revenir sur ma home via cette page. Je remplace donc le lien de ma home (généralement dans le header) par le lien de la catégorie en cours.

Ça en fait:

Home:

home_ja

Par (dans un article):

home_ja2Par exemple ici, tu lis un article qui concerne WordPress, donc en header, tu as un lien vers la catégorie WordPress et non ma page d’accueil

Logique non ? Si tu regarde des articles sur le SEO, ceux sur la vente ne t’interessent sûrement pas. Donc mon lien de home se tranforme en site.com/seo pour chacun des articles à thématique SEO.

Quand tu retombes sur la page de la catégorie, là ok, tu peux revenir sur la page d’accueil.

T’as tout compris où je rééxplique ?

Bon un dessin pour t’expliquer:

silo-seo-wordpress

Bon maintenant, si tu n’as rien pigé, cass’toi!!

La suite…

Oui, parce qu’avec WP, on a des soucis qui se présentent… et c’est Lumière de Lune qui m’a fait tilté. Il va falloir revoir les Widgets avec leurs liens à la con. Afficher les articles récents des catégories en cours, les derniers commentaires sur cette catégorie seulement, etc…

Pas mal de chose en fait.

Mais avec un peu d’acharnement, c’est assez facile.

On va commencer par le lien dans le header du site tout d’abord.

Alors comme j’utilise les thèmes Genesis de Studiopress, vous allez devoir modifier un peu le code de ce petit hook à placer dans le fichier functions.php de votre thème:

add_filter( 'genesis_seo_title', 'child_header_title', 10, 3 );
function child_header_title( $title, $inside, $wrap ) {
	
	if(is_singular('post')){
		
	$category_id = get_the_category();
	$id = $category_id[0]->term_id;
	
	$name = ucfirst($category_id[0]->name);
	 
    $inside = sprintf( '<a href="%s" title="%s">%s</a>', get_category_link( $id ),esc_attr( $name ), get_the_category_by_ID($id) );
   
		
	}else{		$inside = sprintf( '<a href="%s" title="%s">%s</a>', esc_url( home_url()),esc_attr( get_bloginfo( 'name' ) ), get_bloginfo( 'name' ) );	}
	 return sprintf( '<%1$s class="site-title">%2$s</%1$s>', $wrap, $inside );
}

La fonction est assez simple:

  1. Si c’est un article seul
  2. On récupère la première categorie de cet article (certains articles peuvent en avoir plusieurs)
  3. On réecrit l’url de la catégorie avec les différentes fonctions WP
  4. On affiche
  5. Sinon, on laisse l’url de la home… comme d’hab!

Facile non ?

Maintenant, on pourrait tout simplement s’arrêter là et virer tous les widgets avec des liens internes.

Mais comme le bloggueur aime truster son « EgoRank« , il va vouloir rajouter une liste d’articles récents et les derniers commentaires… pour faire voir que ça Moov sur son site.

Comment qu’on fait pour ne pas envoyer le lecteur dans une autre catégorie ?

Pour le widget des derniers articles, simple:

add_filter( 'widget_posts_args', 'silo_ja_widget_posts_args');
function silo_ja_widget_posts_args($args) {
	if ( is_category() or is_single() ) { //si categorie ou article
		$category = get_the_category();
		return array(
			'posts_per_page' => 5,//nombre d'articles
			'no_found_rows' => true, 
			'post_status' => 'publish', 
			'ignore_sticky_posts' => true,
			'cat' => $category[0]->term_id//id de la categorie
			 );
	}
	else {
		return $args;
	}
}

Là, c’est facile, on ne fait qu’un hook sur la fonction du Widget derniers articles et on ajoute le paramètre de la categorie en cours. On pourrait en faire un shortcode pour choisir le nombre d’articles à afficher. 5 c’est bien, je vous laisse chercher pour le shortcode. Moi je n’en ai pas besoin.

Maintenant, plus chiant à trouver… les commentaires des articles de la dîtes catégorie.

Il n’y a malheureusement pas moyen de faire ça simplement. Les commentaires étant rattachés à des articles et pas à des catégories.

Il faut donc faire une grosse liste des derniers commentaires (genre les 50 derniers) et pour chacun voir si l’ID de l’article auquel appartient ce commentaire est également listé dans la catégorie en cours… CHAUD!

On y va… avec un petit shortcode.. qu’on placera facilement dans un Widget Text. Mais pour que ça marche, il faut activer les shortcodes dans les Widgets:

add_filter('widget_text','do_shortcode');

 

Truc de ouf! Une seule ligne… 🙂

Ensuite on construit notre shortcode:

add_shortcode('last_comments', 'silo_ja_widget_comments_args');
function silo_ja_widget_comments_args($args) {
	extract(
    shortcode_atts(
      array(
        'title' => 'Derniers Commentaires',
        'num' => '5',
      ),
      $args
    )
  );
	$category = get_the_category();
	$firstCategory = $category[0]->term_id;
	$i = 0;
	$comments = get_comments("number=50&status=approve");
	$excerptLen = 50;
	echo '<h4 class="widget-title widgettitle">'.$title.'</h4>';
	echo '<ul id="recentcomments">';
	foreach ($comments as $comment){
		$comm_post_id = $comment->comment_post_ID;
		if (in_category($firstCategory, $comm_post_id)){
			$i++;
			if($i >= $num){break;}else{
				// Output the comment, author and whatever you need
			// I'll just output the comment excerpt to keep my code simple
			$aRecentComment = get_comment($comment->comment_ID);
						$aRecentCommentTxt = trim( mb_substr( strip_tags( apply_filters( 'comment_text', $aRecentComment->comment_content )), 0, $excerptLen ));
						if(strlen($aRecentComment->comment_content)>$excerptLen){
							$aRecentCommentTxt .= "...";
						}
		   
		   echo  '<li class="recentcomments">' . /* translators: comments widget: 1: comment author, 2: post link */ sprintf(_x('<span class="recentcommentsauthor">%1$s</span> a dit %2$s', 'widgets'), get_comment_author_link($comment->comment_ID), '<a href="' . esc_url( get_comment_link($comment->comment_ID) ) . '">' . $aRecentCommentTxt . '</a>') . '</li>';
			}
		}
	}
	echo '</ul>';
}

Et voilà, on insère juste le shortcode dans le Widget Text et c’est fini:

shortcode_lastcomments

 

Voilà!

Bon ce n’est pas parfait dans le code. Je suis certain qu’il y a des trucs à améliorer.

Si quelqu’un a le filtre pour modifier dynamiquement les urls en header pour les thèmes normaux (qui ne tournent pas sous genesis), n’hésitez pas.

Et si vous avez d’autres trucs et bouts de code à apporter… pareil.

Jérémy

P.S. Vous pouvez en principe voir le résultat de tout ça sur mon blog. Commentaires en liens avec la catégorie WordPress, lien en header vers la catégorie WordPress également et enfin les derniers articles de la catégorie WordPress 🙂

19 Comments

  1. Bonjour Jérémy.
    L’article est sympa, et les hacks pour restreindre les widgets à la catégorie en cours sont super utiles, merci.
    Le squeeze du lien vers la home est intéressant aussi, mais une structure en silo, ça n’interdit absolument pas de faire un lien vers la home.

    Juste pour être précis, le principe du silo, popularisé par Bruce Clay en 2003 (je crois que c’était l’article http://www.bruceclay.com/eu/seo/silo.htm), c’est d’organiser un site en arbre thématique, du plus général, la home, au plus précis, les feuilles, et de mailler de manière à éviter qu’un nœud ne linke vers une page qui ne soit pas un ascendant (thème englobant – prise de contexte), un collatéral (thème proche – affinités), ou un descendant dans l’arbre (affinage – siloing).
    En ce sens, faire un lien vers la home, qui traite un thème englobant, n’est pas interdit, et c’est même une bonne idée de mettre un fil d’ariane, pour renforcer la compréhension de l’arbre, concentrer le plus de jus sur la home pour attaquer les requètes de tête de traine, un peu moins sur les noeuds de 1er niveau qui attaquent une traine moins concurrentielle, et ainsi de suite avec la traine la moins concurrentielle sur les feuilles qui ne reçoivent par principe pas de jus de fil d’ariane.

    Ceci dit, c’est une des originalités du cocon justement (avec le glissement sémantique pour remplacer le glissement thématique du silo d’origine) que de permettre de choisir un ou d’autres hubs (concentrateurs) que la home, et de mixer l’isolation thématique du silo avec une structure plus souple qui permet de s’éloigner (un peu) de la structure en arbre. C’est même ce qui permet à certains de proposer des solutions « multitêtes ». 😀 Et dans ce cas là, OUI ! On a absolument besoin de pouvoir ne pas faire de lien vers la home. Mais c’est utile pour le cocon, pas pour les silos.

    Enfin c’est mon avis.

    • C’est marrant parce qu’on a discuté exactement de ça avec Jérémy pour les liens pointant vers ascendants, et j’ai bien mis dans mon tweet « Silo de l’extreme ». Mais ça reste du siloing quand meme si ce n’est qu’il est encore beaucoup plus hermétique que celui proposé par Bruce Clay

    • Je suis d’accord avec toi Mathieu.

      Mais la définition du siloing avec lien en home possible, pour moi, ça s’appelle une « structure de base » d’un site. C’est pour cette raison que pour moi un Silo ne veut pas dire grand chose. C’est juste une logique nommée autrement.

      Je me rapprocherais plus du cocon effectivement. Mais je préfère le terme d’escalier qui est un peu plus parlant en image.

      Mais bon, je vais tenter de rendre mon blog le plus hermetique possible pour voir ce que ça donne.

      Mon objectif est de faire un « Patator » de jus des catégories vers la home… à valider dans quelques mois (peut-être) 🙂

  2. Le souci avec WordPress, c’est que si l’on veut aller au bout des choses, le plus dur est d’intégrer les mêmes permaliens sur les articles et les pages… Le plus simple est donc d’associer les catégories du blog aux pages. C’est ce que j’ai fait sur mon site http://www.creanico.fr
    Du coup, les silos sont respectés et matérialisés par les urls, les menus, le fil d’ariane, le maillage interne,… afin de rendre parfaitement étanche les silos !
    Sur Cocon.se, on distingue très bien les silos, c’est propre.
    Depuis la refonte de mon site, qui fait à peine 100 pages, mon site a grandement multiplié sa visibilité et son positionnement sur les mots clés !
    Google aime les silos !!!

      • Salut Walid,
        Désolé pour le délai de réponse… n’ayant pas de notif je ne retombe dessus que maintenant…
        Pour associer les catégories au pages, c’est un dev spécifique que j’ai fait réaliser. C’était clairement le plus simple pour avoir articles + pages + customs posts types (via ACF) sur les memes structures d’url.
        J’ai un article là dessus en brouillon depuis des mois pour expliquer comment j’ai fait… faut que je le sorte !

      • Bon… un 4ème commentaire pour ce soir… j’ai retrouve les codes utiliser, si cela peut vous servir :

        Ajout du support de la taxo des catégories pour les pages :
        function support_category_for_pages() {
        register_taxonomy_for_object_type(‘category’, ‘page’);
        }
        add_action(‘admin_init’, ‘support_category_for_pages ‘);

        Si vous utilisez des custom posts comme moi, pensez à rajouter le support des catégories avec la ligne suivante lorsque vous initiez vos custom posts :
        ‘taxonomies’ => array( ‘category’)

        Voila, je vous ai tout dit !
        Walid, tu peux l’ajouter à ton article si besoin en complément.

  3. Super intéressant cet article 🙂

    Personnellement j’aurais plus une question concernant la gestion des menus déroulants (usuellement intégrés sur les sites WordPress) car ce sont eux qui régissent bien souvent la « visibilité » ; dans mon idée j’aurais aimer aller jusqu’au bout des choses et obfusquer les liens qui ne sont pas censés faire partie de la « branche » dans laquelle l’internaute / le bot se trouve, sans pout autant nuire à l’expérience utilisateur (on peut d’ailleurs imaginer la même chose pour certains plugins / widgets)

    Je vais faire des tests !

    • Salut Chef!

      Je ne sais pas trop si je saisis, mais tu parles de bloquer les catégories aussi ? Ou les permettre mais avec des restrictions ?

      C’est un truc auquel je pensais aussi.

      J’essaye déjà de trouver un idée pour faire une home clean tout en restant sur le modèle de blog.

      Mais n’hésite pas à poster si tu trouves des trucs sympas. 🙂

      • Alors en fait c’est (en gros) étendre ta technique, mais sur les menus WordPress.

        Exemple :
        – si on est sur la home, n’afficher que les liens la racine de chaque silo (on peut visuellement afficher les liens enfants mais on va obfusquer ces derniers)
        – si on est dans un silo, on ne va afficher que les liens vers les parents de la branche (pas les oncles et tantes, uniquement parents / grandes-parents / arrières-grands-parents… comme dans le fil d’ariane), éventuellement les frères et soeurs (à voir), et évidemment les enfants s’il y en a

        Je sais pas si je suis clair 🙂

        Pour l’obfuscation j’utilise ça, ça fonctionne bien : http://www.effi10.com/seo-optimisation-maillage-interne/

        Dans un WordPress on peut notamment utiliser les « Walkers » pour modifier à la volée le code des menus 😉

      • En fait quand j’y pense : dans un WordPress, dès lors que tu utilises le fil d’ariane (Yoast SEO fait ça super bien, notamment avec les custom post types évolués, expérience perso) t’as même pas besoin de te faire ch.. à gérer les menus, tu peux TOUT obfusquer dès que t’es pas sur la home !

        Vu que dans le fil d’ariane on n’aura que les liens vers les parents de branche directe (parent / grand-parent / arrière-grand-parent / etc.) et que je pars du principe que les liens vers les enfants sont réalisés dans le contenu la plupart du temps (pages archives !)

        J’ai bon ?… :-p

  4. Salut,

    Merci beaucoup pour cet article. Est-ce que tu penses que cela est adaptable à un site e-commerce, sous Prestashop notamment ? Car sur un site e-commerce, les internautes s’attendent à retourner sur la page d’accueil en cliquant sur le logo du site, non ? Merci !

  5. Pour les plus courageux qui —en plus de l’article — liront les commentaires jusqu’au bout je propose une toute petite correction qui passera inaperçu mais vous éviteras probablement quelques sueurs si vous travaillez avec un site un peu plus … disons « élaboré » qu’un simple blog.
    Sur la partie
    add_filter( ‘genesis_seo_title’, ‘child_header_title’, 10, 3 );
    dans
    function child_header_title( $title, $inside, $wrap ) { … }
    remplacer : is_single() par is_singular(‘post’) vous évitera quelques problemes avec des CPT n’ayant pas des catégories comme ceux des post comme par exemple avec bbpress ou Woocommerce etc …

    Voilà,
    David

Répondre à Diaz Annuler la réponse.

Votre adresse de messagerie ne sera pas publiée.


*