SEO оптимизиране на osCommerce

Тази статия е за SEO оптимизиране на онлайн магазин от вида osCommerce.
На първо място, ако сега избираш софтуер за онлайн магазин или вече си избрал, но още не си го пуснал онлайн е по-добре да избереш нещо различно от osCommerce. Причините са няколко: няма стандартни SEO възможности, сериозни дупки в сигурността позволяващи компрометиране на сайта, остаряла визия и др.
Тази статия приема, че ти се налага да ползваш osCommerce и вече имаш инсталирана версия osCommerce Online Merchant v2.2 RC2a, в главната уеб директория на стандартен хостинг с активиран mod_rewrite. Това е последната стабилна версия в момента, но ще сработи и с по-стари версии на софтуера.
Преди да правиш промени те съветвам да направиш пълно резервно копие на всички файлове на сайта.

Първото, което трябва да направиш е съкращаване на URL адреси. Има готови модули за това, но за съжаление не работят с адреси на кирилица.

I. Човешки интернет адреси (SEO friendly URL)

Следния код модифицира osCommerce така, че интернет адресите на категориите да съдържат имената на категориите, а продуктовите страници да съдържат името на продукта. Работещ пример може да видиш в този сайт за био козметика. Например вместо да се ползва адрес http://organic-bg.com/?cPath=2 за достъп до втората категория, адреса е http://organic-bg.com/Проблемна-кожа-c2.

Промяната е бърза, лесна и безопасна. Извършва се в 3 стъпки:

1. Пренасочване.

Отвори файла .htaccess. Потърси редове като

RewriteEngine On
RewriteBase /

Ако нямаш такива редове ги добави и след тях добави следните редове:

RewriteRule [^/]+-c([0-9]+)/[^/]+-s([0-9]+)/[^/]+-p([0-9]+)/? /product_info.php?cPath=$1_$2&products_id=$3 [NC,L,QSA]
RewriteRule [^/]+-c([0-9]+)/[^/]+-p([0-9]+)/? /product_info.php?cPath=$1&products_id=$2 [NC,L,QSA]
RewriteRule [^/]+-c([0-9]+)/[^/]+-s([0-9]+)/? /?cPath=$1_$2 [NC,L,QSA]
RewriteRule [^/]+-p([0-9]+)/? /product_info.php?products_id=$1 [NC,L,QSA]
RewriteRule [^/]+-c([0-9]+)/?$ /?cPath=$1 [NC,L,QSA]

Запиши файла и отвори сайта през браузър. Ако получиш грешка 500 Internal Server Error първо провери правата на файла .htaccess дали са 755. Презареди страницата, ако грешката стои вероятно нямаш активиран mod_rewrite на уеб сървъра. Свържи се с твоя хостинг доставчик, за да ти активира този модул. Той е длъжен да го направи, защото това е стандартна опция.

2. Функции.

Отвори файла includes/functions/html_output.php
В края на файла преди реда ?> добави следните две функции:

// ganbox.com : SEO friendly URLs
// Човешки интернет адреси
function URL_rewrite($url) {
  global $languages_id;
  $matches = array();
  if(preg_match("/cPath=([0-9]*)_?([0-9]+)?(&products_id=)?([0-9]+)?(.*)?/", $url, $matches)>0 && preg_match("/action=/", $url)==0) {
    // намира име на категория
    if(isset($matches[1])) {
      $cat_id = $matches[1];
      $cat_query = tep_db_query("select categories_id, categories_name from " . TABLE_CATEGORIES_DESCRIPTION . "
        where categories_id = '"
. (int)$cat_id  . "' and language_id = '" . (int)$languages_id . "' limit 1");
      $cat_string = tep_db_fetch_array($cat_query);
      $cat_string = URL_safe($cat_string['categories_name']);
    }
    // намира име на подкатегория
    if(isset($matches[2])) {
      $subcat_id = $matches[2];
      $cat_query = tep_db_query("select categories_id, categories_name from " . TABLE_CATEGORIES_DESCRIPTION . "
        where categories_id = '"
. (int)$subcat_id . "' and language_id = '" . (int)$languages_id . "'  limit 1");
      $subcat_string = tep_db_fetch_array($cat_query);
      $subcat_string = URL_safe($subcat_string['categories_name']);
    }
    // намира име на продукт
    if(isset($matches[4])) {
      $prod_id = $matches[4];
      $prod_query = tep_db_query("select products_name, products_id from " . TABLE_PRODUCTS_DESCRIPTION . "
        where products_id = '"
. (int)$prod_id . "' and language_id = '" . (int)$languages_id . "'  limit 1");
      $prod_string = tep_db_fetch_array($prod_query);
      $prod_string = URL_safe($prod_string['products_name']);
    }
    // допълнителни данни
    if(isset($matches[5])) {
      $extras = $matches[5];
      // изтрива излишните знаци &
      $extras = substr($extras, 1);
    }

    // почистване на index.php от URL
    if(preg_match("/(.*)index\.php/", $url)>0) {
      $url = preg_replace("/index\.php.*/", "", $url);
    }

    // почистване на product_info.php от URL
    if(preg_match("/(.*)product_info\.php/", $url)>0) {
      $url = preg_replace("/product_info\.php.*/", "", $url);
    }

    // сглобява ново URL
    if(isset($cat_string) && $cat_string != "") {
      $url .= $cat_string."-c".$cat_id;

      // добавя низ за подкатегория
      if(isset($subcat_string) && $subcat_string != "") {
        $url .= "/".$subcat_string."-s".$subcat_id;
      }

      // добавя име на продукт
      if(isset($prod_string) && $prod_string != "") {
        $url .= "/".$prod_string."-p".$prod_id;
      }

      // добавя допълнителни данни
      if(isset($extras) && $extras != "") {
        $url .= "/?".$extras;
      }
    }
  } else if(preg_match("/products_id=([0-9]+)(.*)?/", $url, $matches)>0 && preg_match("/action=/", $url)==0) {
    // намира име на продукт
    if(isset($matches[1])) {
      $prod_id = $matches[1];
      $prod_query = tep_db_query("select products_name, products_id from " . TABLE_PRODUCTS_DESCRIPTION . "
        where products_id = '"
. (int)$prod_id . "' and     language_id = '" . (int)$languages_id . "' limit 1");
      $prod_string = tep_db_fetch_array($prod_query);
      $prod_string = URL_safe($prod_string['products_name']);
    }
    // допълнителни данни
    if(isset($matches[2])) {
      $extras = $matches[2];
      // изтрива излишните знаци &
      $extras = substr($extras, 1);
    }

    // почистване на product_info.php от URL
    if(preg_match("/(.*)product_info\.php/", $url)>0) {
      $url = preg_replace("/product_info\.php.*/", "", $url);
    }

    // сглобява ново URL
    if(isset($prod_string) && $prod_string != "") {
      $url .= $prod_string."-p".$prod_id;
    }

    // добавя допълнителни данни
    if(isset($extras) && $extras != "") {
      $url .= "/?".$extras;
    }
  } // else

  return $url;
}

// ganbox.com
// Имената на категории и продукти се почистват от неподходящи за URL знаци
function URL_safe($str) {
  $str = strtolower($str);
  $str = preg_replace("/[^АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюяa-z0-9-]+/i","-",$str);
  return $str;
}

Запиши и качи файла. Дотук все още нищо няма да се промени по твоя интернет магазин.

3. Активиране

Във същия файл includes/functions/html_output.php намери function tep_href_link. В края на тази функция са редовете:

return $link;
}

Преди тези два реда добави реда:

// ganbox.com: SEO mod
$link = URL_rewrite($link);

Запиши и качи файла. Сега презареди сайта и всичко трябва да работи.
Ако нещо се обърка, може бързо да спреш промените като коментираш последно добавения ред ето така:

//$link = URL_rewrite($link);

Заб. Ако твоят онлайн магазин е в поддиректория като domain.com/shop, тогава кодът ще бъде малко по-различен. Свържи се със SEO експерт за повече информация.
Заб. Така написания код работи с всички езикови версии на сайта.
Заб. Ако при първоначалното влизане в сайта, при преминаване на мишката над линковете в менюто виждаш в края на интернет адресите променлива подобна на osCsid=a835b29ac42d801f56a3c75e1560bd6e е много добра идея да напавиш следното: влез в админ панела на сайта избери Настройки / Sessions / „Force Cookie Use“ отдясно избери True и натисни бутона [Обнови]. По същия начин включи опцията „Prevent Spider Sessions“.

II. Пренасочване на стари URL адреси

Пренасочване на интернет адресите на продуктовите страници и страниците на категориите.
Тази стъпка може да се пропусне, ако твоя интернет магазин е съвсем нов и все още не е посетен от ботовете на търсачките. Дали това е така може да научиш като в Google потърсиш за site:domain.com, като domain.com се замества с адреса на твоя сайт. Ако вече има индексирани продуктови страници е силно препоръчително да кажеш на търсачките, че си променил URL адресите. Ако не го направиш, рискуваш сайта да получи наказание за дублирано съдържание, защото всяка страница ще се достъпва с два различни адреса.
Един начин да направиш това е като в .htaccess за всяка страница зададеш пренасочване от тип 301. Ако имаш малко продукти това не е проблем и дори е за предпочитане. Но ако имаш десетки и стотици продукти? Тогава трябва да бъдеш умен и да измислиш по-мързеливо решение 😉

Виртуален редирект

Автоматично пренасочва всички стари адреси, към новите описателни адреси. Например при написване на адрес http://organic-bg.com/?cPath=2 се пренасочва към адрес http://organic-bg.com/Проблемна-кожа-c2. Пренасочването е от тип 301, което паказва на ботовете на търсачките, че адреса е трайно променен и това е единственото правилно пренасочване.
За да сработи този хак се нуждае от двете функции от предишната стъпка.
Отвори файла includes/application_top.php
В края на файла преди реда съдържащ ?> добави кода:

// ganbox.com : virtual permanent redirect
// пренасочва стари адреси на продуктови страници и страници на категории към новите адреси
if(isset($_GET['cPath']) || isset($_GET['products_id'])){
  $old_url = $_SERVER['REQUEST_URI'];
  $new_url = URL_rewrite($old_url);
  if($new_url and $new_url!=$old_url){
  $new_url = preg_replace('#\?cPath=([0-9]*)_?([0-9]+)?#', '', $new_url);
  header("HTTP/1.1 301 Moved Permanently");
  header("Location: $new_url");
  exit();
  }
}

Запиши и качи файла. От този момент бот или човек запаметил, или букмаркнал стар URL адрес ще бъде пренасочван към новия адрес. Nice аа? 🙂

III. Мета тагове

Промяна на мета тагове: title и description на продуктовите страници.
Има готов модул за промяна на мета таговете. Казва се Header Tags SEO и дава възможност за промяна на мета таговете на страница от админ панела на магазина. Проблемът е, че инсталирането е доста сложно, защото се променя базата данни и доста файлове.
Моето решение по въпроса е значително по-лесно за инсталиране и сравнително лесно за поддръжка.

Как работи?

Тагът title и мета тага description автоматично се попълват със заглавието на продукта, като го взема от базата данни. В директория meta, поставена в главната уеб директория, се намират текстови файлове с описания на продуктите. За всеки продукт може да се създаде файл с разширение .txt като на първия ред се пише описание за description тага, на втория ред се пише текста за title тага и на третия ред може да се напишат ключови думи. Файлът на продукт започва с буквата p и съдържа номер на продукта. Например p74.txt е името на файла с описания на продукт с номер 74. Най-хубавото е, че файловете с описания не са задължителни.

SEO мета тагове

Отвори файла product_info.php

Замести реда
<title><?php echo TITLE; ?></title>
с редовете
<title><?php echo $meta_title; ?></title>
<meta name="description" content="<?php echo $meta_desc?>" />
<meta name="keywords" content="<?php echo $meta_keys?>" />

След реда
require(‘includes/application_top.php’);
добави кода:

// ganbox.com : SEO meta tags
$meta_title = TITLE; // стойност по подразбиране
$meta_desc = $meta_keys = '';
$prod_id = isset($HTTP_GET_VARS['products_id']) ? (int)$HTTP_GET_VARS['products_id'] : 0;
if($prod_id > 0) {
  // намира име на продукт
  $prod_query = tep_db_query("select products_name, products_id from " . TABLE_PRODUCTS_DESCRIPTION . "
    where products_id = '"
. (int)$prod_id . "' and   language_id = '" . (int)$languages_id . "' limit 1");
  $prod_string = tep_db_fetch_array($prod_query);
  $prod_string = URL_safe($prod_string['products_name']);
  $meta_title = mb_substr($prod_string,0,90);
  $meta_desc = $prod_string;
}
$desc_file = $_SERVER['DOCUMENT_ROOT'] . DIR_WS_CATALOG .'meta/p'.$prod_id.'.txt';
if(file_exists($desc_file)){
  $aLines = file($desc_file);
  if(!empty($aLines[0])) $meta_desc = mb_substr(trim($aLines[0]),0,900); // description
  if(!empty($aLines[1])) $meta_title = mb_substr(trim($aLines[1]),0,90); // title
  if(!empty($aLines[2])) $meta_keys = mb_substr(trim($aLines[2]),0,900); // keywords
}

Сега остава да създадеш директория meta, да я качиш в главната уеб директория и за всеки продукт, който желаеш да качиш съответен файл с описания. Продуктите, които нямат файл с описания ще ползват въведеното заглавие при добавяне на продукт.
Заб. Ако получиш грешка заради функция mb_substr() това означава, че твоя хостинг не поддържа mb_string библиотеката (къде ги намирате такива измислени хостинги бе хора?). Свържи се с твоя хостинг доставчик и изискай поддръжка на mb_string. Друг вариант е да заместиш всички функции mb_substr със substr.

Всичко описано дотук е само много малка макар и важна част от SEO за osCommerce. Това е нещо като подготовка за SEO оптимизиране. Без тези промени твоят сайт няма големи шансове за добро класиране. Ако не можеш да се справиш с тези промени или искаш професионални SEO услуги, може да се свържеш с мен от страница Контакт.

Прочетена:11063
« Предишна публикация

Евтино решение за нов външен диск

Евтино решение за нов външен диск След като осъзнах, че имам нужда от поне 500 GB диск, на който да правя архив на по-важните си файлове, снимки и видео, започнах да търся какви дискове се предлагат. ... Повече информация »

Следваща публикация »

Транслитерация в Google

Last update: 2016-12-11 Става въпрос за начина, по който Гугъл превръща думи написани с латински символи към думи на кирилица и обратно. Правилното разбиране на транслитерацията ще ти помогне за правилен избор на име на домейн ... Повече информация »

15 коментара

  1. gan 24.10.2010
  2. genata 11.12.2010
  3. gan 12.12.2010
  4. genata 12.12.2010
  5. gan 12.12.2010
  6. Момчил 10.07.2011
  7. evgeni 21.07.2011
  8. evgeni 24.07.2011
  9. Пепи 29.03.2012
  10. Пепи 29.03.2012
  11. Петьо 31.05.2012
  12. Тодор Найденов 22.09.2012