10

Drupal et les balises title et meta sans modules SEO

Drupal meta tagsLe CMS Drupal et ses thèmes par défaut entre autres demandent un certain nombre de modifications afin d'être optimisés pour les moteurs de recherche. Pour la partie metatags (descripton, robots...), il existe le module Nodewords qui est assez complet (il faut bien le paramétrer dès le début) mais ça fait toujours un module de plus à charger ce qui ralentit toujours un petit peu le CMS. Pour la balise title, il existe le module Page Title qui est bien mais pas forcément souple selon ce qu'on veut faire. Dans le cas d'un site ou ces deux modules ne conviendraient pas ou en cas de bugs, voici quelques astuces pour mettre en place les balises <meta> et <title> à l'aide du module CCK entre autre et quelques lignes de code.
CCK (Content Construction Kit) est souvent activé pour d'autres raisons (dépendance modules) et permet de créer des champs personnalisés pour différents types de contenu. Voilà comment nous allons l'utiliser sous Drupal 6:

Balises meta pour les différents types de contenu

Dans admin/content/node-type/story/fields (Gestion du contenu › Actualité > Gérer les champs) pour le type de contenu "Actualité/story":
On va créer un nouveau champ pour la balise meta robots par exemple:

- Etiquette: metarobot
- Nom du champ: field_metarobot
- Type de champ: texte
- Elément du formulaire pour l'édition de données : champ texte
On peut aussi paramétrer une valeur par défaut dans l'édition du champ type par exemple: noindex,nofollow

Ensuite dans admin/content/node-type/story/display (Gestion du contenu › Actualité > Afficher les champs), on va passer en hidden l'etiquette, le résumé et le noeud complet pour pas que ces valeurs s'affichent dans la page lors de l'affichage d'un noeud el les contrôler directement dans les templates du thème.

Balises meta dans les templates de Drupal

On va dans la template page.tpl.php utiliser la variable $head déjà existante (elle contient le <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/> )pour afficher nos <meta>.
En haut de page.tpl.php on va placer le code suivant:

switch($node->type) {
case "story" :
if ($node->field_metarobot[0]['value']=='') $meta_full .= '<meta name="robots" content="noindex, nofollow">';
else $meta_full .= '<meta name="robots" content="'.$node->field_metarobot[0]['value'].'">';
$meta_full .= '<meta name="description" content="'.$node->field_metadesc[0]['value'].'">';
$titre=$node->title;
break;
case "page" :
if ($node->field_metarobot[0]['value']=='') $meta_full .= '<meta name="robots" content="noindex, nofollow">';
else $meta_full .= '<meta name="robots" content="'.$node->field_metarobot[0]['value'].'">';
$meta_full .= '<meta name="description" content="'.$node->field_metadesc[0]['value'].'">';
$titre=$node->title;
break;
}

$head=$head.$meta_full;

Si le nom de l'utilisateur Drupal qui écrit l'article est sous la forme Prénom+Nom, on pourra aussi ajouter la balise <meta name='author' content='Anne Onim'> qui doit être prise en compte par Google:

$meta_full .= '<meta name="author" content="'.$node->name.'">';

Plus bas dans la template page.tpl.php, on appelle la variable $meta_full remplie précédemment pour insérer les meta tags dans la page:

<html lang="fr">
<head>
<title><?php print $titre ?></title>
<link rel="apple-touch-icon" href="/iphone.png" />
<?
php if ($meta_full!=null && $meta_full!='') print $head.$meta_full;
print $styles;
?>

Balises Title dans les templates de Drupal

Ici on va utiliser la variable $titre pour le <title>. On a une fonction qui affiche les termes taxonomy, les numéros des pages selon où on se trouve, exemple:

Pour les vues (module views), pages de recherche, galerie image, on pourra utiliser arg(0), arg(1) et arg(2) selon le schéma d'URL mis en place sur le site:

default :
//on vérifie qu'on est pas sur la homepage
if (!$is_front) {
//on affiche le numéro des pages
$p = $_GET['page'];
if ($p != null && $p != '' && $p!=0)  $numeropage=" | Page ".($p+1);
else $numeropage="";
switch(arg(0)) {
//galerie images
case 'image' :
$tax =  taxonomy_get_term(arg(2));
$titre= 'Photos '.$tax->name;
break;
//résultats de recherche
case 'search' :
$titre= 'Recherche sur: '.search_get_keys();
break;
//pour une vue (views) spécifique avec le path /actus
case 'actus' :
$titre= 'News Économie | Actualités et informations';
break;
//pour des termes taxonomy
case 'taxonomy':
if (arg(2) == 24) {
//liste actus Banque et assurances (url : taxonomy/term/24/all)
$titre= 'Actualités Banque et Assurances | '.$numeropage;
} elseif (arg(2) == 25) {
//liste actus Finances Publiques  (url : taxonomy/term/25/all)
$titre= 'Actualités Finances Publiques  | '.$numeropage;
}
}
}
//pour la homepage
else{
$titre = $site_name;
}

Bref

J'utilise CCK pour les balises <h1> également, je fais ainsi des variations de mots-clé entre la balise <title> et <h1>. Exemple de code dans ma template apr_s avoir créer un champ field_h1 pour le type de contenu page:

switch($node->type) {
case 'page' :
if ($node->field_h1[0]['value']=='') print('<h1>'.$title.'</h1>');
else print('<h1>'.$node->field_h1[0]['value'].'</h1>');
print('<div class="contenupage">'.$content.'</div>');
break;
..................
}

Tous ces éléments sont présentés de manière assez succincte afin de vous donner des pistes et idées pour que ces balises meta et title soient gérées directement dans vos templates plutôt que via un module qui risquerait d'alourdir le CMS et qui ne vous permettrait pas forcément de faire tout ce que vous souhaiteriez.

10 commentaires

  1. Très bn article, comme toujours !!

    J’ai testé cette astuce et ça permet quand même d’économiser au moins 3 modules, ce qui n’ai pas négligeable.
    Par contre petite question qui sera je pense utile à beaucuop de personne :
    Sur un site (que tu commence à connaître ;)) j’ai du utiliser le plugin metatag (équivalent de nodeword pour Drupal 7).
    Et je n’ai pas réussi à trouver un token qui permet de compléter en auto par défaut la meta description d’une page en reprenant un extrait du début du texte.
    Tous les token que j’ai trouver reprennent le texte inscris dans le champs edit summary (donc il faut écrire une description alors que je veux que cela se fasse automatiquement).

    Si vous avez une soluce ou un token que je ne connais pas, je vous écoute 😉

  2. Article intéressant, mais cette méthode va vite fait montrer ses limites pour la plupart des cas. Page Title est surtout utile pour créer différents patterns de titre pour chaque pages catégories, types de d’articles… Pour Nodewords, c’est plus pratique car il permet de gérer automatiquement plusieurs balises (canonical, noindex, description etc), et surtout personnaliser les metas tag de la page d’accueil et autres pages spécifiques (pagination, erreur 404, etc).

    En fait, on peut se passer de ces modules à conditions de s’y connaitre en php et d’être prêt à coder plusieurs lignes, ce qui reviendrait à refaire le module pour gérer les différents cas que j’ai cité.

    • Je suis d’accord, je me mettais dans le cas d’un site avec peu de pages / rubriques pour éviter de charger les modules, Drupal devenant vite une usine à gaz quand il sont trop nombreux à être activés.

  3. En tant que développeur/intégrateur Drupal je viens rajouter mon grain de sel 🙂

    Il est généralement peu recommandé de mettre du code métier dans les templates (.tpl.php) de Drupal, pour une question de visibilité et d’optimisation.

    La bonne méthode est de le mettre dans le fichier template.php du thème via les preprocess (http://api.drupal.org/api/drupal/modules–system–theme.api.php/function/hook_preprocess_HOOK/7)
    Cela permet de rendre les données/le métier commun(es) à toutes les déclinaisons de template (page.tpl.php, page–story.tpl.php, etc.)

    Par exemple :

    function montheme_preprocess_page(&$vars) {
    $vars[‘head’] .= ”;
    }

    Je ne rentre pas dans les détails, mais j’espère que ça vous parlera…

    • Mais tu fais bien de mettre ton “grain de sel”;) Je ne suis pas développeur et c’est vrai que je n’ai pas forcément le réflexe de passer par les preprocess, c’est pourtant plus propre et plus souple à terme 😉 Merci pour le lien et tes infos, tiens je vais aller faire un tour sur ton blog du coup! 🙂

  4. Bonjour.
    Je suis sous Drupal 7 et j’utilise le thème Omega. Malheureusement, la variable $node n’est pas accessible (impossible donc d’utiliser $node->type ou autre). Par contre, j’ai édité html.tpl.php du thème pour pouvoit modifier la balise title. Quelqu’un a une idée ?

  5. J’ai trouvé !
    Dans le fichier html.tpl.php du thème voici mon code :

    if(!$is_front){
    switch(arg(0)){
    case “adherent”:
    $nodeID = node_load(arg(1));
    $field_nom_societe = field_get_items(‘node’, $nodeID, ‘field_nom_societe’);
    $titre = $field_nom_societe[0][‘value’];
    // Mettez tous les field qui vous intéresse puis recomposez
    $head_title = “Voici le nom de la société : $titre”;
    break;
    // etc.
    }
    }

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *