Optimiser le référencement d'un blog Dotclear : balises TITLE et META
Par Olivier Duffez, vendredi 11 mai 2007
Fort utilisés, les blogs DotClear, dans leurs versions 1.2.x, possèdent bien des qualités en terme de référencement (titres des billets, écriture des URL, propreté et organisation du code...) ; néanmoins ils s'avèrent relativement pauvres au niveau de l'optimisation des balises descriptives que l'on trouve dans l'entête de la page HTML générée. Ainsi, par défaut la balise TITLE contient systématiquement (s'il existe) le nom du billet ou le nom de la catégorie, suivi du nom du blog. En clair, cela signifie qu'hormis les pages affichant le contenu des billets et le contenu des catégories, toutes les pages se "contentent" d'une balise TITLE identique !
Cet article a été rédigé par Cédric Girard, membre de WebRankInfo.
Voici à quoi ressemble la balise HEAD de votre fichier template.php par défaut dans Dotclear :
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=<?php dcInfo('encoding'); ?>" />
<meta name="MSSmartTagsPreventParsing" content="TRUE" />
<?php dcHeadLinks(); ?>
<link rel="alternate" type="application/rss+xml" title="RSS" href="<?php dcInfo('rss'); ?>" />
<link rel="alternate" type="application/xml" title="Atom" href="<?php dcInfo('atom'); ?>" />
<meta name="DC.title" content="<?php dcInfo(); ?>" />
<title><?php dcSinglePostTitle('%s - '); dcSingleCatTitle('%s - ');
dcSingleMonthTitle('%s - '); dcCustomTitle('%s - '); dcInfo(); ?></title>
<link rel="stylesheet" type="text/css" href="<?php dcInfo('theme'); ?>/style.css" media="screen" />
<?php dcPostTrackbackAutoDiscovery(); ?>
</head>
Ajoutons à cela l'absence de balise meta Description et de balise meta Keyword (qui peut être utile pour éviter le Duplicate Content si les deux autres sont identiques) et on comprend assez vite l'intérêt d'une petite optimisation à ce niveau !
Procéder avec méthodologie
Il convient maintenant de définir quels sont nos besoins, et ce que nous allons faire pour y arriver. Le premier élément de réflexion est celui de la balise META Description : l'idéal serait de pouvoir disposer du titre du billet, suivi d'un petit résumé de ce dernier... Une solution assez élégante consiste à récupérer par exemple les 25 premiers mots du billet (en réalité de son chapo s'il existe, ou du contenu du billet si le chapo est vide) et de le concaténer à son titre, suivi de trois petits points.
Nous obtiendrions par exemple :
[Référencement] Optimiser un blog Dotclear - Fort utilisés, les blogs DotClear, dans leurs versions 1.2.x, possèdent bien des qualités en terme de référencement (titres des billets, écriture des URL, propreté et organisation...
C'est "tout simplement" ce qui ressortira en résumé dans Google sous l'URL du billet ! La présence des trois petits points viendra apporter la petite touche de confort pour l'internaute et provoquera en lui l'irrésistible envie de découvrir la suite de votre contenu 
Le second élément concerne simplement la balise HTML Title, qui par défaut ne prend en charge que les billets et les catégories, et pas de la manière la plus élégante puisque l'on peut rapidement arriver à une balise comportant un certain nombre pour ne pas dire un nombre certain de mots ! Une solution consistera à détecter l'affichage d'un billet ou non, et en conséquence, d'affiche uniquement le titre du billet (sans le titre du blog derrière). Ceci pour améliorer la densité des mots-clés contenus dans le titre du billet sans interférence de ceux contenus dans le titre du blog.
Ainsi, pour l'affichage de ce billet, au lieu de :
[Référencement] Optimiser un blog Dotclear - Actualités Google - Actualités Référencement
Où les termes "Actualités" et "Google" sont superflus dans le contexte du billet, et où le mot "référencement" est répété de manière inutile , nous aurions plus simplement :
[Référencement] Optimiser un blog Dotclear
Le troisième élément concerne la balise META Keywords.Obsolète dans l'absolu pour le référencement dans les moteurs "modernes", elle a son utilité pour tout autre chose : la gestion du Duplicate Content. En effet, il est possible que, dans le cadre d'un blog on arrive à plusieurs pages ayant un titre et une description identiques, mais ne reflétant pas le même contenu. L'exemple que je citerai concerne l'utilisation de certains plugins, comme le très connu Tags pour Dotclear (gestion de la folksonomie par nuage de mots) : il est tout-à-fait possible (et c'est le cas sur mon blog !) qu'un tag corresponde à une catégorie de billets ! Et dans ce cas, on a bien un "duplicate content" pour deux pages potentiellement différentes. La solution consiste donc à reprendre la description et à afficher les mots qu'elle contient, filtrés et séparés par des virgules, dans la balise META Keywords.
Nous obtiendrions par exemple pour ce billet (j'insiste sur le fait que le contenu de cette balise a peu d'importance en soit) :
Référencement, Optimiser, un, blog, Dotclear, Fort, utilisés, les, blogs, DotClear, dans, leurs, versions, 1, 2, x, possèdent, bien, des, qualités, en, terme, de, référencement, titres, des, billets, écriture, des, URL, propreté, et, organisation
Dans le cas concrêt de la catégorie "Référencement" du blog, nous aurions :
Référencement,Actualités,Google,Actualités,Référencement
Et dans le cas d'un tag "Référencement" indépendant de la catégorie mais générant par défaut un Duplicate content :
tag,Référencement,Actualités,Google,Actualités,Référencement
Donc deux balises META Keywords différentes pour deux pages différentes !
Dernière chose, on apportera un soin tout particulier à la prise en charge de deux plugins couramment utilisés sur les blogs Dotclear : le plugin Tags dont on a fait objet ci-dessus, et le plugin Table des matières, qui est lui aussi un cas particulier.
Une petite difficulté
Une chose à laquelle je n'avais pas pensé lorsque je me suis attelé à optimiser mon blog, était le fait que les méthodes d'affichage de Dotclear produisent non pas des chaînes de caractères à "inclure" dans le code HTML, mais directement des flux HTML : impossible d'en récupérer le contenu dans des variables !
Il a fallu donc "feinter" et utiliser les fonctions de bufferisation de sortie de PHP, avec les méthodes ob_start, ob_getcontents et ob_end_clean, de manière à récupérer le flux HTML généré : méthode peu élégante mais très efficace.
Je passe sur l'aspect technique lié aux manipulations de chaînes de caractères qui ne sont que de l'algorithmique classique (et parfois peu orthodoxe chez moi je l'admets !)
Le nouveau code d'entête
Je ne vais pas repasser en revue tous les aspects décrits ci-dessus, le code est commenté et parle (je pense) de lui-même. J'ai dans un soucis de lisibilité, créé deux fonctions qui figurent au début du code PHP. La première permet de retourner les n premiers mots d'un texte (chaque mot étant séparé par un espace), la seconde de "filtrer" le texte pour le retourner "optimisé" pour la balise META Keywords.
Concernant la prise en charge des plugins Table des matières et Tags, vous noterez que le code ci-dessous fonctionne bien évidemment en leur présence, mais ne nécessite pas de modifications si vous ne les utilisez pas !
Le code "optimisé" est donc le suivant :
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=<?php dcInfo('encoding'); ?>" />
<meta name="MSSmartTagsPreventParsing" content="TRUE" />
<?php dcHeadLinks(); ?>
<link rel="alternate" type="application/rss+xml" title="RSS" href="<?php dcInfo('rss'); ?>" />
<link rel="alternate" type="application/xml" title="Atom" href="<?php dcInfo('atom'); ?>" />
<meta name="DC.title" content="<?php dcInfo(); ?>" />
<?php
// Fonction permettant de retourner les x premiers mots d'un texte
function s_premiersmots($MyString,$nbmots,$separ)
{
$StringTab=explode(" ",$MyString);
for($i=0;$i<$nbmots;$i++)
{
$NewString.=$separ."$StringTab[$i]";
}
return $NewString;
}
// Fonction de nettoyage de chaîne de caractère (code pas nickel mais ça fonctionne !)
function s_nettoyerpourkeywords($MyString)
{
$NewString=trim($MyString);
// Suppression des caractères et codes inutiles
$NewString=str_replace(array('(', ')', '!', '?', '+', '...', '"', '[',']', ':', '"', ','), array('', '', '', '', '', '', '', '', '', '', '', ''), $NewString);
// Remplacement des séparateurs "utiles" par des espaces"
$NewString=str_replace(array('/','.','-'),array(' ',' ',' '),$NewString);
// Compression des espaces en trop éventuels générés par l'étape précédente
$NewString=str_replace(array(' ',' '),array(' ',' '),$NewString);
//Remplacement des espaces par des virgules
$NewString=str_replace(' ',',',$NewString);
return $NewString;
}
// On utilise le cache HTML pour récupérer les valeurs retournées par Dotclear (qui renvoie un flux HTML et non des valeurs en retour de fonctions... à mon grand désespoir !)
// Récupération du titre complet normal affiché par défaut par Dotclear
ob_start();
dcSinglePostTitle('%s - ');dcSingleCatTitle('%s - ');dcSingleMonthTitle('%s - ');dcCustomTitle('%s - ');dcInfo();
$TitreComplet = strip_tags(ob_get_contents());
ob_end_clean();
// Récupération du titre du billet seulement (sera vide si l'on n'affiche pas un billet seul)
ob_start();
dcSinglePostTitle('%s');
$TitreDuBillet = trim(strip_tags(ob_get_contents()));
ob_end_clean();
########## Gestion du cas particulier du plugin "Table des matières" (ne pas supprimer cette section même si vous ne l'utilisez pas !)
if ($mode == 'tocHome')
{
// Si l'on arrive ici, TitreDuBillet sera de toute façon vide donc on ne s'occupe que du titre complet, auquel on ajoute "table des matieres"
$TitreComplet = 'Table des matieres - '.$TitreComplet;
}
else
{
// Récupération des 25 premiers mots du chapo
ob_start();
dcPostChapo();
$DebutDuBillet = trim(s_premiersmots(trim(str_replace('"', '', strip_tags(ob_get_contents()))), 25, ' '));
ob_end_clean();
if(strlen($DebutDuBillet)==0)
{
// Le chapo est vide, donc récupération du début du contenu du billet (le cas échéant), soit les 25 premiers mots
ob_start();
dcPostContent(25); // Une surcharge de la méthode dcPostContent permet de récupérer le nombre de mots spécifié : bien pratique !
$DebutDuBillet = trim(str_replace('"','',strip_tags(ob_get_contents())));
ob_end_clean();
}
};
########## Gestion du plugin Tags : récupération du tag en cours, le cas échéant
if(class_exists(twTags))
{
ob_start();
twTags::title();
$TagEnCours = trim(strip_tags(ob_get_contents()));
ob_end_clean();
}
########## Définition des différentes balises dédiées SEO
if(strlen($TitreDuBillet)>0)
{
// On définit la balise Titre par le titre du billet en cours (si billet en cours il y a !)
$BaliseTitre=$TitreDuBillet;
if(strlen($DebutDuBillet)>0)
{
// Définition de la balise Description par le contenu du billet (25 premiers mots du chapo, ou du billet, selon cas)
$BaliseDescription=$TitreDuBillet." - ".$DebutDuBillet."...";
}
else
{
// Gestion des billets "vides" de texte
$BaliseDescription=$TitreDuBillet;
};
}
else
{
// On n'est pas dans un billet, donc gestion de l'unicité du titre et de la description (qui seront identiques) avec prise en charge des tags
$BaliseTitre=(strlen($TagEnCours)>0?"$TagEnCours - ":"").$TitreComplet;
$BaliseDescription=$BaliseTitre;
};
// Génération de la balise keywords pour éviter le duplicate content
// si on est sur un tag, ajout du keyword "tag" pour éviter le Duplicate content éventuel avec un nom de catégorie de billets
$BaliseKeywords=(strlen($TagEnCours)>0?"tag,":"") . s_nettoyerpourkeywords($BaliseDescription);
########## Écriture des balises ##########
// Écriture de la balise TITLE
echo "<title>$BaliseTitre</title>";
// Écriture de la balise Description
echo "<meta name=\"description\" lang=\"fr\" content=\"$BaliseDescription\">";
echo "\n"; // On saute une ligne
// Écriture de la balise Keywords (permet d'éviter le duplicate content)
echo "<meta name=\"keywords\" lang=\"fr\" content=\"$BaliseKeywords\">";
?>
<meta name="Robots" content="follow,index">
<link rel="stylesheet" type="text/css" href="<?php dcInfo('theme'); ?>/style.css" media="screen" />
<?php dcPostTrackbackAutoDiscovery(); ?>
</head>
On notera que j'ai rajouté une balise META Robots au passage... Le résultat de cette optimisation un peu brutale mais efficace est visible sur mon blog : http://blog.aube-nature.com
Améliorations possibles et à venir
Manquent à ce petit bout de code la prise en charge des affichages par dates et par périodes (par exemple sur un mois donné), dont je n'ai pas encore trouvé de moyen élégant de récupérer le contenu ni de générer une description significative. J'étudie la possibilité de générer en texte la date pour l'inclure dans les keywords pour éviter le Duplicate content... À suivre !
Note d'Olivier Duffez : Merci à Cédric Girard, membre de WebRankInfo, qui a été rédigé cet article. Pour compléter, vous pouvez lire les articles suivants :

Ajoutez ce blog à vos favoris Technorati !




Commentaires
1. Le vendredi 11 mai 2007 à 13:55, par Moira
2. Le vendredi 11 mai 2007 à 17:29, par liliAn
3. Le vendredi 11 mai 2007 à 23:13, par cs76
4. Le dimanche 13 mai 2007 à 11:41, par Coolman
5. Le dimanche 13 mai 2007 à 18:04, par jef
6. Le mardi 15 mai 2007 à 08:46, par marina
7. Le mardi 15 mai 2007 à 14:23, par Clair de Lune
8. Le jeudi 17 mai 2007 à 11:16, par Laurent Brixius
9. Le lundi 21 mai 2007 à 17:37, par nina
10. Le vendredi 25 mai 2007 à 13:15, par Chris
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.
A lire aussi dans l'actualité WebRankInfo
Dans la foulée du nouveau design de WebRankInfo (v3), j'ai mis à jour la rubrique actualités sur WRI. Alors que l'ancien système était "fait maison", j'écris désormais cet article grâce à Dotclear, cet excellent logiciel de blog que je recommande vivement.
L'équipe de Google Code vient de publier les résultats de son étude portant sur l'utilisation du code HTML dans un échantillon d'un milliard de pages web. Des statistiques intéressantes à consulter...
Depuis des lustres on parle d'optimisation des balises meta pour le référencement, pourtant elles n'ont que peu d'influence. Cet article a pour objectif de vous aider à savoir lesquelles utiliser.
Ce qu'il faut savoir pour bien référencer un blog dans Google et les autres moteurs de recherche : mise à jour de l'article sur le référencement d'un blog.
La question revient souvent dans tous les forums consacrés au référencement : . Entre ceux qui sont pour et ceux qui pensent que cela ne sert plus à rien, la question est dure à trancher pour celui qui aborde la question. Je n'ai pas d'ambition d'être exhaustif sur le sujet, mais voici mon point de vue et quelques points qui me font penser que les balises META ne sont pas aussi inutiles que certains peuvent laisser le penser.
Le référencement est sans doute un mélange entre une science et un art... en tout cas il semble indispensable d'effectuer régulièrement des tests pour mieux comprendre le fonctionnement des algorithmes des moteurs de recherche. Voici les tests en cours sur WRI ces jours-ci...
Vous allez lancer un nouveau site et vous aimeriez être sûr de ne rien oublier dans l'optimisation du référencement ? Alors lisez ces conseils...
Est-ce que Google tient compte de toutes les balises meta ? C'est sans doute un classique mais cette fois la réponse vient de Google directement... L'occasion de revenir sur chaque balise pour préciser son intérêt pour le référencement.
Le Centre de recherche en référencement Ranking Metrics vient de mettre en ligne son blog. Axé sur le référencement, il servira à publier des articles décrivant des méthodes de référencement, ainsi que des études exclusives.
Yahoo vient d'annoncer le support d'une nouvelle valeur pour la balise meta robots : "noydir" sert désormais à préciser qu'on ne veut pas que Yahoo utilise (dans les pages de résultats de son moteur de recherche) le titre du site tel qu'il est référencé dans l'annuaire de Yahoo. Explications...