Um Bilder der Artikel und Kategorien im modified eCommerce Shop für Suchmaschinen freundlicher darzustellen ist nicht viel Aufwand zu betreiben.
Hier möchte ich eine einfache und schnelle Variante vorstellen wie die Dateinamen von Kategorie- und Artikelbildern automatisch mit den entsprechenden Stichwörtern versehen werden können.
Download
{phocadownload view=file|id=23}
Download ab Shopversion 2.0
Für die modified eCommerce Shopsoftware ab Version 2.0 könnt ihr euch das erweiterte Modul mit neuen Funktionen und einer umfangreicheren konfiguration hier bestellen:
Suchmaschinenfreundliche Bilder für die modified eCommerce Shopsoftware ab Version 2.0
Beispiel
Changelog
/* 2012-11-11 v1.0 [NEW] erste Version der neuen Komponente 2012-11-17 v1.1 [FIX] Korrekturen zur Berechnung der Bildgrößen 2014-01-06 v2.0 [FIX] Korrekturen zur Verwendung des Moduls in den Suchergebnissen. Besten Dank an *Reinhold* für den Bericht und Fix. [UPDATE] Komponente und Anleitung für modified eCommerce v1.06 aktualisiert 2014-01-12 v2.1 [ADD] Name als Grundlage zur Generierung der Dateinamen als weitere Auswahl hinzu gefügt [ADD] optionaler Fallback auf weitere Grundlage (Name) für fehlende Angaben zum Artikel [ADD] seoImages auch in Boxen wie z.B. "Zuletzt angesehen" oder "Bestseller" anwenden 2014-10-07 v2.2 [FIX] Tippfehler in Informationstexten korrigiert [FIX] Slash (/) in Dateinamen berücksichtigen. Besten Dank an *CojaX* [FIX] SQL-Fehlern bei Artikeln ohne speziellem Bild vorbeugen 2014-10-11 v2.3 [ADD] Trennzeichen '-' für SEO-URL's ebenfalls unterstützen 2014-10-14 v2.4 [ADD] Umlaute in Dateinamen ausschreiben ('ae' statt 'ä') [FIX] SEO Dateinamen ebenso im Artikellisting einer Kategorie verwenden 2014-10-28 v2.5 [FIX] umzuschreibende Umlaute anhand des ASCII-Wertes erkennen [ADD] Keywords für die weiteren Bilder der Reihe nach arrangieren [ADD] Trennzeichen für einzelne Wörter: Leerzeichen, Komma, Punkt, -, +, \, /, & [FIX] doppelte Keywords eliminieren [ADD] Anleitung für SEO-Images in den Boxen "Zuletzte angesehen", "Angebote" und "Neue Artikel" */
Kurzanleitung zur Installation der SEO Images
ACHTUNG: Alle Modifikationen sind in Blöcken zusammen gefasst:
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images Hier stehen die Änderungen. Bitte kopiere die Kommentare mit um später diese Änderungen wieder zu erkennen // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images
1. Backup erstellen
Bitte leg ein Backup vom Shop und der Datenbank an bevor du die folgenden Schritte ausführst!
KEINE HAFTUNG FÜR FEHLFUNKTIONEN NACH DER INSTALLATION
2. Sprachdateien aktualisieren
[SHOP_ROOT]/lang/german/admin/configuration.php
Füge am Ende der Datei ein
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images define('SEARCH_ENGINE_FRIENDLY_IMAGES_TITLE', 'Suchmaschinenfreundliche Bilder?'); define('SEARCH_ENGINE_FRIENDLY_IMAGES_DESC', 'Die Dateinamen der Katgorie- und Artikelbilder können automatisch für Suchmaschinen optimiert angezeigt werden.
Funktioniert nur im Zusammenhand mit "‘ . SEARCH_ENGINE_FRIENDLY_URLS_TITLE . ‚"!‚); define(‚SEARCH_ENGINE_FRIENDLY_IMAGES_KEYWORDS_TITLE‘, ‚Feld für die Keywords‘); define(‚SEARCH_ENGINE_FRIENDLY_IMAGES_KEYWORDS_DESC‘, ‚Keywords aus diesem Feld des Artikels/der Kategorie werden verwendet um die Dateinamen der Bilder zu generieren
keywords: Daten aus dem Feld "Zusatz-Begriffe für Suche" des Artikels / der Kategorie
meta_keywords: Daten aus dem Feld "Meta Keywords" des Artikels / der Kategorie
title: Name des Artikels / der Kategorie‘); define(‚SEARCH_ENGINE_FRIENDLY_IMAGES_KEYWORDS_FALLBACK_TITLE‘, ‚Fallback Grundlage‘); define(‚SEARCH_ENGINE_FRIENDLY_IMAGES_KEYWORDS_FALLBACK_DESC‘, ‚Diese Daten werden genutzt um die Dateinamen der Bilder zu generieren wenn in dem "‘ . SEARCH_ENGINE_FRIENDLY_IMAGES_KEYWORDS_TITLE . ‚" keine Daten vorliegen.
false: keine Generierung Suchmaschinenfreundlicher Dateinamen
title: Name des Artikels / der Kategorie‘); define(‚SEARCH_ENGINE_FRIENDLY_IMAGES_KEYWORDS_LIMIT_TITLE‘, ‚Anzahl der Keywords‘); define(‚SEARCH_ENGINE_FRIENDLY_IMAGES_KEYWORDS_LIMIT_DESC‘, ‚Maximale Anzahl an Keywords die für die Suchmaschinenfreundlichen Dateinamen der Bilder verwendet werden.‘); // EOF – Timo Paul (mail[at]timopaul[dot]biz) – 2014-10-14 – SEO-Images
3. Konfiguration einspielen
Bitte führe das SQL-Script config.sql in deinem RDBMS (z.B. PHPmyAdmin) aus.
DELETE FROM `configuration` WHERE `configuration_key` LIKE 'SEARCH_ENGINE_FRIENDLY_IMAGES%'; INSERT INTO `configuration` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `last_modified`, `date_added`, `use_function`, `set_function`) VALUES ('SEARCH_ENGINE_FRIENDLY_IMAGES', 'false', '16', '30', CURDATE(), CURDATE(), NULL, "xtc_cfg_select_option(array('true', 'false'),"), ('SEARCH_ENGINE_FRIENDLY_IMAGES_KEYWORDS', 'keywords', '16', '32', CURDATE(), CURDATE(), NULL, "xtc_cfg_select_option(array('keywords', 'meta_keywords', 'name'),"), ('SEARCH_ENGINE_FRIENDLY_IMAGES_KEYWORDS_FALLBACK', 'false', '16', '33', CURDATE(), CURDATE(), NULL, "xtc_cfg_select_option(array('false', 'name'),"), ('SEARCH_ENGINE_FRIENDLY_IMAGES_KEYWORDS_LIMIT', '3', '16', '34', CURDATE(), CURDATE(), NULL, NULL) ;
Bei einem Update einer füheren Version kann das selbe Script verwendet werden.
4. neue Dateien aufspielen
a) Shop-Core
Bitte kopiere den Inhalt aus dem Verzeichnis shop_root per FTP (z.B. FileZilla) in das Home-Verzeichnis von deinem Shop. Es werden keine Dateien überschrieben!
b) Template
Zusätzlich die Dateien aus dem Ordner /shop_root/templates/xtc5/smarty/ in das Unterverzeichnis [SHOP_ROOT]/templates/[DEIN_TEMPLATE]/smarty/ kopieren
5. Shopdateien aktualisieren
a) [SHOP_ROOT]/.htaccess
Suche nach Zeile
RewriteRule (.*):.:([0-9]+)\.html$ index.php?manufacturers_id=$2 [QSA,L]
Füge unter dieser Zeile ein
## BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images # ##-- Bilder (:__:) RewriteCond %{REQUEST_URI} (.*)/[^/]*:__:([_0-9]+)\.(jpg|jpeg|gif|png)$ [NC] RewriteRule ^(.*)/[^/]*:__:([_0-9]+)\.(jpg|jpeg|gif|png)$ $1/$2.$3 [qsappend,L,NC] # ## EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images
Suche nach Zeile
#RewriteRule (.*)-.-([0-9]+)\.html$ index.php?manufacturers_id=$2 [QSA,L]
Füge unter dieser Zeile ein
## BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images # ##-- Bilder (-__-) #RewriteCond %{REQUEST_URI} (.*)/[^/]*-__-([_0-9]+)\.(jpg|jpeg|gif|png)$ [NC] #RewriteRule ^(.*)/[^/]*-__-([_0-9]+)\.(jpg|jpeg|gif|png)$ $1/$2.$3 [qsappend,L,NC] # ## EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images
b) [SHOP_ROOT]/includes/classes/product.php
Suche nach Zeile
$products_image = $this->productImage($array['products_image'], $image);
Ersetze diese Zeilen durch
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images //$products_image = $this->productImage($array['products_image'], $image); $products_image = $this->productImage($array['products_image'], $image, $array); // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images
Suche nach Zeile
function productImage($name, $type) {
Ersetze diese Zeilen durch
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images //function productImage($name, $type) { function productImage($name, $type, $data = false) { // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images
Suche nach Zeile
return $path.$name;
Füge vor dieser Zeile ein
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images if (SEARCH_ENGINE_FRIENDLY_URLS == 'true' && SEARCH_ENGINE_FRIENDLY_IMAGES == 'true') { if (!function_exists('getSeoImage') && file_exists(DIR_WS_MODULES . '/seo_images.php')) { require_once DIR_WS_MODULES . '/seo_images.php'; } $name = getSeoImage($name, is_array($data) ? $data : $this->data); } // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images
c) [SHOP_ROOT]/includes/modules/product_listing.php
Suche nach Zeilen
$category_query = xtDBquery("SELECT cd.categories_description, cd.categories_name, cd.categories_heading_title, c.listing_template, c.categories_image FROM ".TABLE_CATEGORIES." c, ".TABLE_CATEGORIES_DESCRIPTION." cd WHERE c.categories_id = '".$current_category_id."' AND cd.categories_id = '".$current_category_id."' ".$group_check." AND cd.language_id = '".$_SESSION['languages_id']."' LIMIT 1");
Ersetze diese Zeilen durch
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images //$category_query = xtDBquery("SELECT cd.categories_description, // cd.categories_name, // cd.categories_heading_title, // c.listing_template, // c.categories_image // FROM ".TABLE_CATEGORIES." c, // ".TABLE_CATEGORIES_DESCRIPTION." cd // WHERE c.categories_id = '".$current_category_id."' // AND cd.categories_id = '".$current_category_id."' // ".$group_check." // AND cd.language_id = '".$_SESSION['languages_id']."' // LIMIT 1"); $category_query = xtDBquery("SELECT cd.categories_description, cd.categories_name, cd.categories_meta_keywords, cd.categories_heading_title, c.listing_template, c.categories_image FROM ".TABLE_CATEGORIES." c, ".TABLE_CATEGORIES_DESCRIPTION." cd WHERE c.categories_id = '".$current_category_id."' AND cd.categories_id = '".$current_category_id."' ".$group_check." AND cd.language_id = '".$_SESSION['languages_id']."' LIMIT 1"); // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images
Suche nach Zeile
$module_smarty->assign('CATEGORIES_NAME', $category['categories_name']);
Füge vor dieser Zeile ein
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images if ($image && SEARCH_ENGINE_FRIENDLY_URLS == 'true' && SEARCH_ENGINE_FRIENDLY_IMAGES == 'true') { if (!function_exists('getSeoImage') && file_exists(DIR_WS_MODULES . '/seo_images.php')) { require_once DIR_WS_MODULES . '/seo_images.php'; } $image = getSeoImage($image, $category); } // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images
d) [SHOP_ROOT]/includes/modules/default.php
Suche nach Zeile
$listing_sql = "-- /includes/modules/default.php
Füge vor dieser Zeile ein
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images $select .= 'pd.products_keywords, pd.products_meta_keywords, '; // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-14 - SEO-Images
Suche nach Zeile
$categories_query = xtDBquery($categories_query);
Füge vor dieser Zeile ein
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-28 - SEO-Images $categories_query = str_replace('cd.categories_name,', 'cd.categories_name, cd.categories_meta_keywords,', $categories_query); // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-28 - SEO-Images
Suche nach Zeilen
if ($categories['categories_image'] != '') { $image = DIR_WS_IMAGES.'categories/'.$categories['categories_image']; if(!file_exists($image)) $image = DIR_WS_IMAGES.'categories/noimage.gif'; $image = $image;
Füge nach diesen Zeilen ein
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-28 - SEO-Images if (SEARCH_ENGINE_FRIENDLY_URLS == 'true' && SEARCH_ENGINE_FRIENDLY_IMAGES == 'true') { if (!function_exists('getSeoImage') && file_exists(DIR_WS_MODULES . '/seo_images.php')) { require_once DIR_WS_MODULES . '/seo_images.php'; } $image = getSeoImage($image, $categories); } // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-28 - SEO-Images
Suche nach Zeile
$category_query = xtDBquery($category_query);
Füge vor dieser Zeile ein
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-28 - SEO-Images $category_query = str_replace('cd.categories_name,', 'cd.categories_name, cd.categories_meta_keywords,', $category_query); // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-28 - SEO-Images
Suche nach Zeilen
if ($category['categories_image'] != '') { $image = DIR_WS_IMAGES.'categories/'.$category['categories_image']; if(!file_exists($image)) $image = DIR_WS_IMAGES.'categories/noimage.gif'; $image = $image;
Füge nach diesen Zeilen ein
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-28 - SEO-Images if (SEARCH_ENGINE_FRIENDLY_URLS == 'true' && SEARCH_ENGINE_FRIENDLY_IMAGES == 'true') { if (!function_exists('getSeoImage') && file_exists(DIR_WS_MODULES . '/seo_images.php')) { require_once DIR_WS_MODULES . '/seo_images.php'; } $image = getSeoImage($image, $category); } // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-28 - SEO-Images
e) [SHOP_ROOT]/popup_image.php
Suche nach Zeile
foreach ($mo_images as $mo_img) {
Füge nach dieser Zeile ein
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2012-11-17 - correct SEO-Iamge Filenames $mo_img['image_name'] = preg_replace('#^[^/]+' . SEO_SEPARATOR . '__' . SEO_SEPARATOR . '([_0-9]+\.[a-z]{3,4})$#i', '/${1}', $mo_img['image_name']); // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2012-11-17 - correct SEO-Iamge Filenames
f) [SHOP_ROOT]/templates/[DEIN_TEMPLATE]/source/boxes/last_viewed.php
Suche nach Zeile
$random_query = xtDBquery($random_query);
Füge vor dieser Zeile ein
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-28 - SEO-Images $random_query = str_replace('pd.products_name,', 'pd.products_name, pd.products_keywords, pd.products_meta_keywords, ', $random_query); // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-28 - SEO-Images
g) [SHOP_ROOT]/templates/[DEIN_TEMPLATE]/source/boxes/specials.php
Suche nach Zeilen
if ($random_product = xtc_random_select("select p.products_id, pd.products_name, p.products_price, p.products_tax_class_id, p.products_image, s.expires_date, p.products_vpe, p.products_vpe_status, p.products_vpe_value, s.specials_new_products_price from ".TABLE_PRODUCTS." p, ".TABLE_PRODUCTS_DESCRIPTION." pd, ".TABLE_SPECIALS." s where p.products_status = '1' and p.products_id = s.products_id and pd.products_id = s.products_id and pd.language_id = '".$_SESSION['languages_id']."' and s.status = '1' ".$group_check." ".$fsk_lock." order by s.specials_date_added desc limit ".MAX_RANDOM_SELECT_SPECIALS)) {
Ersetze diese Zeilen durch
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-28 - SEO-Images //if ($random_product = xtc_random_select("select // p.products_id, // pd.products_name, // p.products_price, // p.products_tax_class_id, // p.products_image, // s.expires_date, // p.products_vpe, // p.products_vpe_status, // p.products_vpe_value, // s.specials_new_products_price // from ".TABLE_PRODUCTS." p, // ".TABLE_PRODUCTS_DESCRIPTION." pd, // ".TABLE_SPECIALS." s where p.products_status = '1' // and p.products_id = s.products_id // and pd.products_id = s.products_id // and pd.language_id = '".$_SESSION['languages_id']."' // and s.status = '1' // ".$group_check." // ".$fsk_lock." // order by s.specials_date_added // desc limit ".MAX_RANDOM_SELECT_SPECIALS)) { if ($random_product = xtc_random_select("select p.products_id, pd.products_name, pd.products_keywords, pd.products_meta_keywords, p.products_price, p.products_tax_class_id, p.products_image, s.expires_date, p.products_vpe, p.products_vpe_status, p.products_vpe_value, s.specials_new_products_price from ".TABLE_PRODUCTS." p, ".TABLE_PRODUCTS_DESCRIPTION." pd, ".TABLE_SPECIALS." s where p.products_status = '1' and p.products_id = s.products_id and pd.products_id = s.products_id and pd.language_id = '".$_SESSION['languages_id']."' and s.status = '1' ".$group_check." ".$fsk_lock." order by s.specials_date_added desc limit ".MAX_RANDOM_SELECT_SPECIALS)) { // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-28 - SEO-Images
h) [SHOP_ROOT]/templates/[DEIN_TEMPLATE]/source/boxes/whats_new.php
Suche nach Zeilen
if ($random_product = xtc_random_select("-- templates/xtc5/source/boxes/whats_new.php SELECT distinct p.products_id, p.products_image, p.products_tax_class_id, p.products_vpe, p.products_vpe_status, p.products_vpe_value, p.products_price, pd.products_name FROM ".TABLE_PRODUCTS." p LEFT JOIN ".TABLE_PRODUCTS_DESCRIPTION." pd ON (p.products_id = pd.products_id AND pd.language_id = '".(int) $_SESSION['languages_id']."' AND pd.products_name != '') LEFT JOIN ".TABLE_PRODUCTS_TO_CATEGORIES." p2c ON p.products_id = p2c.products_id LEFT JOIN ".TABLE_CATEGORIES." c ON c.categories_id = p2c.categories_id AND c.categories_status = 1 WHERE p.products_status = 1 " . $fsk_lock . " " . $group_check . " " . $current_prd . " " . $days . " ORDER BY p.products_date_added desc LIMIT ".MAX_RANDOM_SELECT_NEW))
Ersetze diese Zeilen durch
// BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-28 - SEO-Images //if ($random_product = xtc_random_select("-- templates/xtc5/source/boxes/whats_new.php // SELECT distinct // p.products_id, // p.products_image, // p.products_tax_class_id, // p.products_vpe, // p.products_vpe_status, // p.products_vpe_value, // p.products_price, // pd.products_name // FROM ".TABLE_PRODUCTS." p // LEFT JOIN ".TABLE_PRODUCTS_DESCRIPTION." pd // ON (p.products_id = pd.products_id AND pd.language_id = '".(int) $_SESSION['languages_id']."' AND pd.products_name != '') // LEFT JOIN ".TABLE_PRODUCTS_TO_CATEGORIES." p2c // ON p.products_id = p2c.products_id // LEFT JOIN ".TABLE_CATEGORIES." c // ON c.categories_id = p2c.categories_id AND c.categories_status = 1 // WHERE p.products_status = 1 // " . $fsk_lock . " // " . $group_check . " // " . $current_prd . " // " . $days . " // ORDER BY p.products_date_added desc // LIMIT ".MAX_RANDOM_SELECT_NEW)) if ($random_product = xtc_random_select("-- templates/xtc5/source/boxes/whats_new.php SELECT distinct p.products_id, p.products_image, p.products_tax_class_id, p.products_vpe, p.products_vpe_status, p.products_vpe_value, p.products_price, pd.products_name, pd.products_keywords, pd.products_meta_keywords FROM ".TABLE_PRODUCTS." p LEFT JOIN ".TABLE_PRODUCTS_DESCRIPTION." pd ON (p.products_id = pd.products_id AND pd.language_id = '".(int) $_SESSION['languages_id']."' AND pd.products_name != '') LEFT JOIN ".TABLE_PRODUCTS_TO_CATEGORIES." p2c ON p.products_id = p2c.products_id LEFT JOIN ".TABLE_CATEGORIES." c ON c.categories_id = p2c.categories_id AND c.categories_status = 1 WHERE p.products_status = 1 " . $fsk_lock . " " . $group_check . " " . $current_prd . " " . $days . " ORDER BY p.products_date_added desc LIMIT ".MAX_RANDOM_SELECT_NEW)) // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2014-10-28 - SEO-Images
6. Installation / Konfiguration
Im Shop-Backend unter „Erweiterte Konfiguration“ >> „Meta-Tags/Suchmaschinen“ sind am Ende der Liste drei neue Konfigurationsmöglichkeiten zu finden.
a) Suchmaschinenfreundliche Bilder?
De-/Aktiviert das Modul „SEO Images“
b) Feld für die Keywords
Wählbar ob die Daten aus dem Feld „keywords“ (Zusatz-Begriffe für Suche), „meta_keywords“ (Meta Keywords) oder „name“ (Name) verwendet werden sollen.
c) Fallback für die Keywords
Sollten in dem unter b) angegebenen Feld keine Daten vorhanden sein, werden optional die hier angegebenen verwendet
d) Anzahl der Keywords
Anzahl der zu verwendenden Keywords zur generierung der Suchmaschinenfreundlichen Dateinamen als Ganzzahl (3-7 sind zu empfehlen).
7. Fertig
Das war es auch schon. Nun wollen wir gemeinsam zusehen wie das Ranking unserer Bilder in den Suchmaschinen steigt.