Управляем мета-тегом keywords в Virtuemart 1.1 из админки

Что-то я давно не писал больших нуд(ж)ных статей с нуж(д)ным контентом…

Решил я разродиться на этот раз на тему SEO, а именно:

  1. убиваем мета-тег Keywords (для тех, кому не нужен);
  2. учим Virtuemart ставить этот тег к товару из специально обученного поля в админке;
  3. учим Virtuemart ставить этот тег к категории из специально обученного поля в админке.

Мета-тег keywords хоть и говорят, что не учитывается поисковиками, все же, как выяснилось, имеет значение и  кейворды, в неумелых руках, больше вредны, чем полезны, хотя, в умелых руках могут сослужить очень хорошую службу. Говоря про последние, я имею в виду профессиональных специалистов по поисковой оптимизации (сам я не специалист, но с одним таким гуру я работаю).

Собственно, в Joomla 1.5 есть возможность ставить кейворды, но Virtuemart 1.1.x совершенно не умеет с ними обращаться.

Почему тут нет ни слова о том, как рулить тегом description. Virtuemart сам прекрасно ставит его из краткого описания товара и, по сути, действия отличаются не сильно. Ну, и в рунете информации по этой теме — валом, другое дело, что по кейвордам надо подумать.

Итак, погнали…

База данных

Для начала создадим по дополнительному полю в таблицах jos_vm_category и jos_vm_product в базе. Первая для категорий, вторая для товаров.

ALTER TABLE `jos_vm_category` ADD `category_meta_keyword` VARCHAR(255) NOT NULL AFTER `category_description`;

ALTER TABLE `jos_vm_product` ADD `product_meta_keyword` VARCHAR(255) NOT NULL AFTER `product_desc`;

Можно сделать их руками, тогда так:

Поле: category_meta_keyword;
Тип: VARCHAR;
Длина/значения: 255;
По умолчанию: НЕТ;
Сравнение: utf8_general_ci;

Я сделал их после поля с описанием, мне так удобнее и логичнее, потом я смогу найти их и в базе, и в коде если что.

После того, как поля созданы, можно приступать к коду.

Удаляем пустые keywords из Joomla

head.php

В Джумле есть такая пакостная «особенность» — если тег keywords пустой (например, убрали из настроек текст) — в коде все равно появляется это:

<meta name="keywords" content="" />

что не есть гут. Чтобы было гут и пустого тега не было — открываем файл

/libraries/joomla/document/html/renderer/head.php

и, примерно в строке 77, ищем код

$strHtml .= $tab.'<meta name="'.$name.'" content="'.str_replace('"',"'",$content).'"'.$tagEnd.$lnEnd;

меняем его на

if($content != ""){ // Если значение тега пустое - не выводим его
$strHtml .= $tab.'<meta name="'.$name.'" content="'.str_replace('"',"'",$content).'"'.$tagEnd.$lnEnd;
}

или, если хотим убрать мета-тег keywords, вместо

if($content != ""){

из предыдущего кода, пишем

if ($name != 'keywords') {

Смысл в том, что в файле head.php генерируется все, что будет в тегах <head>…</head> и мета-теги генерируются с помощью разбора ассоциативного массива. Теперь, надеюсь, понятнее 🙂

Keywords в карточке товара Virtuemart

Делаем поле в админке. Для этого открываем файл /administrator/components/com_virtuemart/html/product.product_form.php и ищем там место, где собираются табы, а именно, примерно 352 строка. После этой строки вставляем это:

<tr> 
  <td width="29%" valign="top">
    <div style="text-align:right;font-weight:bold;">Тег META-Keyword:</div>
  </td>
  <td width="71%" >
    <input type="text" name="product_meta_keyword" size="60" value="<?php echo $db->sf("product_meta_keyword"); ?>" />
  </td>
</tr>

Это будет новое поле в админке Virtuemart, в которое довольный сеошник будет вводить ключевики для товара. Вставлять код можно в любое место области редактирования, лишь бы не напутать с версткой, а то перекосит все.

Теперь нужно научить Virtuemart сохранять содержимое поля.

Открываем файл /administrator/components/com_virtuemart/classes/ps_product.php и ищем там строку… даже нет… две строки 🙂 Ищем строку

'product_s_desc' => vmRequest::getVar('product_s_desc', '', 'default', '', VMREQUEST_ALLOWHTML),

и после нее вставляем

'product_meta_keyword' => vmGet($d,'product_meta_keyword'),

Делаем это в двух местах: первое место — примерно 278 строка, второе — 480. То есть, в двух функциях: add(&$d) и update(&$d)

Соответственно, функция add отвечает за добавление нового товара, а update — за обновление уже существующего.

Полдела сделано, теперь наша поделка умеет сохранять поле в базу и обновлять его.

Теперь надо сделать так, чтобы это дело все учитывалось. Для начала открываем файл /administrator/components/com_virtuemart/html/shop_browse_queries.php и добавляем в запрос наше поле product_meta_keyword, то есть, в строке 37 добавляем в запрос после `product_s_desc` наше `product_meta_keyword`, чтобы получилось так:

// These are the names of all fields we fetch data from
$fieldnames = "`product_name`,`products_per_row`,`category_browsepage`,`category_flypage`,`#__{vm}_category`.`category_id`,
				`#__{vm}_product`.`product_id`,`product_full_image`,`product_thumb_image`,`product_s_desc`,`product_meta_keyword`,`product_parent_id`,`product_publish`,`product_in_stock`,`product_sku`, `product_url`,
				`product_weight`,`product_weight_uom`,`product_length`,`product_width`,`product_height`,`product_lwh_uom`,`product_in_stock`,`product_available_date`,`product_availability`,`#__{vm}_product`.`mdate`, `#__{vm}_product`.`cdate`";

Здесь все.

Теперь открываем /administrator/components/com_virtuemart/html/shop.browse.php и примерно в строке 595 после строки

$products[$i]['product_details'] = $product_details;

пишем

$products[$i]['product_meta_keyword'] = $db_browse->f("product_meta_keyword");

Этим мы сделаем так, чтобы Virtuemart мог оперировать этой переменной в карточке товара. У меня была такая необходимость, поэтому я сделал так. В принципе, если вы сделаете так же — плохо не будет, вы будете точно уверены, где у вас лежит вызов этого кейворда и что он находится именно в конкретной карточке товара (если у вас из несколько, например), а магазину все равно, откуда вы добавляете мета-тег.

Осталось самая малость — добавить в карточку вызов переменной.

Открываем файл с карточкой товара (пусть будет /components/com_virtuemart/themes/default/templates/product_details/flypage.tpl.php) и пишем там:

<?php 
  if ( !empty($product_meta_keyword) ) {
    $document = JFactory::getDocument();
    $document->setMetaData( 'keywords', $product_meta_keyword );
  }
?>

На этом с товаром, можно считать, закончили.

 

Keywords в категории Virtuemart

Собственно, тут последовательность действий такая же, только применительно к категориям.

Открываем /administrator/components/com_virtuemart/html/product.product_category_form.php — тут добавим поле ввода в админке

Примерно в строке 66 заканчивается строка с названием категории, после нее вставим следующий код:

<tr>
   <td width="21%" nowrap><div align="right">Тег META-Keywords:</div></td>
   <td width="79%">
     <input type="text" name="category_meta_keyword" size="60" value="<?php echo shopMakeHtmlSafe( $db->sf('category_meta_keyword')) ?>" />
   </td>
</tr>

Теперь в файле /administrator/components/com_virtuemart/classes/ps_product_category.php находим также две функции — add и update.

function add

Находим строку 248 (примерно) и после строки

'category_description' => vmGet( $d, 'category_description', '', VMREQUEST_ALLOWHTML ),

добавляем строку

'category_meta_keyword' => vmGet( $d, 'category_meta_keyword', '' ), //Кейворды в категории из админки

function update

Находим строку 311 (примерно) и после строки

'category_description' => vmGet( $d, 'category_description', '', VMREQUEST_ALLOWHTML ),

добавляем ниже

'category_meta_keyword' => vmGet( $d, 'category_meta_keyword', '' ), //Кейворды в категории из админки

Настало время как-то вывести теперь поле в мета-тег.

В файле /administrator/components/com_virtuemart/html/shop.browse.php, не мудрствуя лукаво, ищем вот такой кусок (приблизительно строка 67):

if( $category_id ) {
/**
* CATEGORY DESCRIPTION
*/
$db->query( "SELECT category_id, category_name, category_meta_keywords FROM #__{vm}_category WHERE category_id='$category_id'");
$db->next_record();
$category_name = shopMakeHtmlSafe( $db->f('category_name') );

// Set Dynamic Page Title
$vm_mainframe->setPageTitle( $db->f("category_name") );

$desc = $ps_product_category->get_description($category_id);
$desc = vmCommonHTML::ParseContentByPlugins( $desc );
// Prepend Product Short Description Meta Tag "description" when applicable
$mainframe->prependMetaTag( "description", substr(strip_tags($desc ), 0, 255) );

}

И заменяем его на этот:

if( $category_id ) {
/**
* CATEGORY DESCRIPTION
*/
$db->query( "SELECT category_id, category_name, category_meta_keywords FROM #__{vm}_category WHERE category_id='$category_id'");
$db->next_record();
$category_name = shopMakeHtmlSafe( $db->f('category_name') );

// Кейворды к категории из админки
$category_meta_keywords = shopMakeHtmlSafe( $db->f('category_meta_keywords') );
if ( !empty($category_meta_keywords) ) {
$document = JFactory::getDocument();
$document->setMetaData( 'keywords', $category_meta_keywords );
}

// Set Dynamic Page Title
$vm_mainframe->setPageTitle( $db->f("category_name") );

$desc = $ps_product_category->get_description($category_id);
$desc = vmCommonHTML::ParseContentByPlugins( $desc );
// Prepend Product Short Description Meta Tag "description" when applicable
$mainframe->prependMetaTag( "description", substr(strip_tags($desc ), 0, 255) );

}

То есть, в строке 69 мы добавили наше поле category_meta_keywords в запрос, чтобы его оттуда извлечь и буквально тут же применили полученный результат…

Как видно, ничего сверхъестественного я не написал, это скорее записка на будущее, узелок на память.

Удачи! Читайте, пишите Спасибо, кому помогло 🙂

0

Управляем мета-тегом keywords в Virtuemart 1.1 из админки: 1 комментарий

  1. Андрей

    Полезно! но.. По хорошему сделал бы сразу для всех мета: title keywords description
    что бы не надеяться на удачу а удобно прописать все в одном месте….
    а в общем идея понятна.. доходчиво объяснил.. спасибо!

Добавить комментарий