osCommerce : optimiser un titre de page

S'il est prouvé que les moteurs, Google en tête, affectionnent les titres (et noms) de page différents, c'est également pertinent pour nos favoris. En effet, un visiteur passionné de notre site, monté avec osCommerce, et qui désire conserver 7 pages dans ses marque-pages ne verra que... 7 titres identiques (TITLE, soit le nom de la boutique).
Voici les pistes principales ; l'objectif étant de remplacer et/ou étoffer TITLE par des occurrences ad hoc, notamment pour les deux pages principales (accueil/catégories et produits).

Accueil & Catégories ./index.php

ajouter le code suivant :

$titrePage = TITLE;
if(!empty($manufacturers['manufacturers_name'])) 
	$titrePage = $manufacturers['manufacturers_name'].' > '.TITLE;
elseif(!empty($categories['categories_name'])) 
	$titrePage = $categories['categories_name'].' > '.TITLE;

avant cette ligne :

require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_DEFAULT);

puis, un peu plus loin, remplacer TITLE par la variable $titrePage (modification générique) :

<title><?php echo $titrePage; ?></title>

Produits ./product_info.php

commenter le code :

$product_info_query = tep_db_query("select p.products_id, pd.products_name, pd.products_description, p.products_model, p.products_quantity, p.products_image, pd.products_url, p.products_price, p.products_tax_class_id, p.products_date_added, p.products_date_available, p.manufacturers_id from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and pd.products_id = p.products_id and pd.language_id = '" . (int)$languages_id . "'");
$product_info = tep_db_fetch_array($product_info_query);

rechercher et commenter cette ligne (en début de page) :

$product_check = tep_db_fetch_array($product_check_query);

et coller juste après :

$titrePage = TEXT_PRODUCT_NOT_FOUND.' &gt; '.TITLE;
if($product_check = tep_db_fetch_array($product_check_query)) {
	$product_info_query = tep_db_query("select p.products_id, pd.products_name, pd.products_description, p.products_model, p.products_quantity, p.products_image, pd.products_url, p.products_price, p.products_tax_class_id, p.products_date_added, p.products_date_available, p.manufacturers_id from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and pd.products_id = p.products_id and pd.language_id = '" . (int)$languages_id . "'");
	$product_info = tep_db_fetch_array($product_info_query);
	$titrePage = htmlentities($product_info['products_name'],ENT_QUOTES).' &gt; '.TITLE;
}

comme on l'a vu ci-avant, modifier la balise <title> :

<title><?php echo $titrePage; ?></title>

Critiques produits ./product_reviews.php ou ./products-reviews_info.php

sous le code :

$breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_PRODUCT_REVIEWS, tep_get_all_get_params()));

ajouter ceci pour product_reviews.php :

// html_entity_decode() permet de nettoyer les constantes/variables déjà écrites en entités HTML
$titrePage = htmlentities(html_entity_decode(NAVBAR_TITLE),ENT_QUOTES).' : '.htmlentities($product_info['products_name'],ENT_QUOTES).' &gt; '.TITLE;

ou ceci pour products_reviews_info.php :

// html_entity_decode() permet de nettoyer les constantes/variables déjà écrites en entités HTML
$titrePage = htmlentities(html_entity_decode(NAVBAR_TITLE),ENT_QUOTES).' : '.htmlentities($review['products_name'],ENT_QUOTES).' &gt; '.TITLE;

et modifier la balise <title> :

<title><?php echo $titrePage; ?></title>

Autres pages

sous le code :

// NB: constante dépend de chaque page
$breadcrumb->add(NAVBAR_TITLE, tep_href_link(constante));

ajouter ceci :

// html_entity_decode() permet de nettoyer les constantes/variables déjà écrites en entités HTML
// selon la page remplacer NAVBAR_TITLE par NAVBAR_TITLE_1 (ex. advanced_search.php)
$titrePage = htmlentities(html_entity_decode(NAVBAR_TITLE),ENT_QUOTES).' &gt; '.TITLE;

et modifier la balise <title> :

<title><?php echo $titrePage; ?></title>

La logique est donc assez simple : récupérer un titre de page, éventuellement via une requête SQL et l'injecter dans la balise <title>. Le gros problème du vétéran osCommerce, outre son ossature en tableaux, est de mélanger les requêtes SQL avec l'affichage*. Par conséquent, il est parfois nécessaire (comme pour product_info.php) de déplacer certaines requêtes en début de script PHP.

(*) C'est mal ! Non recommandé dans le cadre d'une optimisation serveur. Il faut débuter par toutes requêtes bdd, fermer la connexion, puis traiter et afficher.

URL rewriting (serveur Apache)

Une fois ces quelques modifications réalisées, le top est d'ensuite implémenter l'URL rewriting (réécriture d'URL à la volée), grâce au fichier .htaccess, par exemple avec Ultimate SEO URLs. Ainsi, l'optimisation pour le référencement prend tout son sens.

J'ai installé Ultimate SEO URLs en modifiant la fonction strip() car elle ne donnait pas entière satisfaction selon la version PHP :

// include/classes/seo.class.php
// transforme une occurrence en titre de page compatible W3C
function strip($string) {
	// remplace toute accentuation connue par son équivalent au standard ASCII
	$acc_str = "ŠŽšžŸ¥ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåçèéêëìíîïñòóôõöøùúûüµýÿ";
	$sim_str = "SZszYYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuuyy";
	$string = strtr(stripslashes($string), $acc_str, $sim_str);
	// convertit tout espace ou occurrence non alphanumérique en underscore '_'
	// le tiret '-' serait préférable mais l'URL rewriting les utilise déjà
	$string = preg_replace('/[^a-z0-9]/i', '_', trim($string));
	// on retourne le résultat nettoyé des doublons
	return preg_replace('/[_]+/', '_', $string);
}

http://dev.ppan.net [Haut de page]