Что-то я давно не писал больших нуд(ж)ных статей с нуж(д)ным контентом…
Решил я разродиться на этот раз на тему SEO, а именно:
- убиваем мета-тег Keywords (для тех, кому не нужен);
- учим Virtuemart ставить этот тег к товару из специально обученного поля в админке;
- учим 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 в запрос, чтобы его оттуда извлечь и буквально тут же применили полученный результат…
Как видно, ничего сверхъестественного я не написал, это скорее записка на будущее, узелок на память.
Удачи! Читайте, пишите Спасибо, кому помогло 🙂
Полезно! но.. По хорошему сделал бы сразу для всех мета: title keywords description
что бы не надеяться на удачу а удобно прописать все в одном месте….
а в общем идея понятна.. доходчиво объяснил.. спасибо!