VirtueMart: метатеги, заголовок, описание, ключевые слова для каждого товара (title, description, keywords)


И все-таки мне удалось найти способ вставки разных по содержанию метатегов для каждого товара в компоненте VirtueMart (1.1.9) на Joomla 1.5.

Как известно  VirtueMart берет метатеги исключительно из настроек джумлы. Но нет предела совершенству. После некрасивых и некорректных способов мне попался очень чистый и гениальный вариант. Теперь каждому товару можно прописать свои Title, Description и Keywords. Думаю, оптимизаторам интернет-магазинов, SEO-шникам и людям, далеким от копания внутри кода php, статья понравится и принесет пользу. Нужно просто скопировать и вставить...

Итак, позволю себе перепост простого и рабочего способа, взятого по прямой ссылке отсюда: http://www.staandi.ru/virtuemart/37-vm-articles/50-meta-key-description-vmproduct.
и частично отсюда:
http://www.staandi.ru/virtuemart/37-vm-articles/48-pole-tovara-virtuemart

На всякий случай, прикрепляю скриншот статьи с сайта, откуда взят перепост.

Идем по пунктам:
1. Подключаемся с помощью phpMyAdmin к  БД, в которую ставили virtuemart. Находим таблицу vm_product (если при установке задавали префикс базы данных, то будет префикс_vm_product ), и нажимаем кнопку "Структура".

2.  В этой таблице добавляем три поля:
1. product_title_tag //для заголовка страницы (тег title)
2. product_desc_tag //для описания товара (тег description)
3. product_key_tag // для ключевых слов (тег keywords)

Поля создаем со следующими параметрами:

3. Дальше надо изменить файл product.product_form.php  по адресу: "administrator/components/com_virtuemart/html/". Ищем следующий код:
<tr class="row1">
                      <td width="21%"><div style="text-align:right;font-weight:bold;">
                        :</div>
                      </td>
                      <td width="79%">
                        <input type="text" class="inputbox"  name="product_url" value="<?php $db->sp("product_url"); ?>" size="32" maxlength="255" />
                      </td>
                </tr>

И сразу после него вставляем это:
<!-- product title -->
                <tr class="row0">
                      <td width="21%"><div style="text-align:right;font-weight:bold;">
                        :</div>
                      </td>
                      <td width="79%">
                        <input type="text" class="inputbox"  name="product_title_tag" value="<?php $db->sp("product_title_tag"); ?>" size="32" maxlength="255" />
                      </td>
                </tr>                
                <!-- product description -->
                <tr class="row1">
                      <td width="29%" valign="top"><div style="text-align:right;font-weight:bold;">
                          :</div>
                      </td>
                      <td width="71%"  valign="top">
                          <textarea class="inputbox" name="product_desc_tag" id="short_desc" cols="35" rows="6" ><?php echo $db->sf("product_desc_tag"); ?></textarea>
                      </td>
                </tr>                
                <!-- product keywords -->
                <tr class="row0">
                      <td width="29%" valign="top"><div style="text-align:right;font-weight:bold;">
                          :</div>
                      </td>
                      <td width="71%"  valign="top">
                          <textarea class="inputbox" name="product_key_tag" id="short_desc" cols="35" rows="6" ><?php echo $db->sf("product_key_tag"); ?></textarea>
                      </td>
                </tr>

Хотелось бы отметить, что у авторов статьи до знака двоеточия пропущена одна строка php, которая отвечает за отображение названий полей внутри админки.  В коде вашего файла вы это увидите.  Просто перед двоеточием, аналогично строке:

<?php echo $VM_LANG->_('PHPSHOP_PRODUCT_FORM_URL') ?>

Вставлем соответственно перед тремя другими двоеточиями строки:

<?php echo $VM_LANG->_('PHPSHOP_PRODUCT_FORM_TITLE_TAG') ?>
<?php echo $VM_LANG->_('PHPSHOP_PRODUCT_FORM_DESCRIPTION_TAG') ?>
<?php echo $VM_LANG->_('PHPSHOP_PRODUCT_FORM_KEY_TAG') ?>

Если вы их не поставите, то не увидите названия полей "Заголовок", "Описание", "Ключевые слова" при редактировании товара.

4. Чтобы отображались названия новых полей в файл English.php по адресу /administrator/components/com_virtuemart/languages/product после строки
'PHPSHOP_PRODUCT_FORM_SKU' => 'SKU',
вставляем нужные заголовки
'PHPSHOP_PRODUCT_FORM_TITLE_TAG' => 'Title',
    'PHPSHOP_PRODUCT_FORM_DESCRIPTION_TAG' => 'Description',
    'PHPSHOP_PRODUCT_FORM_KEY_TAG' => 'Keywords',
5. Обратите внимание: если у Вас используется русский язык, то эти заголовки нужно вставить также в файл russian.php (и так со всеми используемыми языками). Разумеется, желательно сделать перевод:
   'PHPSHOP_PRODUCT_FORM_TITLE_TAG' => 'Заголовок',
    'PHPSHOP_PRODUCT_FORM_DESCRIPTION_TAG' => 'Описание',
    'PHPSHOP_PRODUCT_FORM_KEY_TAG' => 'Ключевые слова',
6. Далее в файле ps_product.php по пути administrator/components/com_virtuemart/classes/ ищем кусок кода
// Insert into DB
        $fields = array ( 'vendor_id' => $vendor_id,
                        'product_parent_id' => vmRequest::getInt('product_parent_id'),
                        'product_sku' => vmGet($d,'product_sku'),
                        'product_name' => vmGet($d,'product_name'),
                        'product_desc' => vmRequest::getVar('product_desc', '', 'default', '', VMREQUEST_ALLOWHTML),
                        'product_s_desc' => vmRequest::getVar('product_s_desc', '', 'default', '', VMREQUEST_ALLOWHTML),
И вставляем три строки между product_name и product_desc, чтобы в целом получилось так:
// Insert into DB
        $fields = array ( 'vendor_id' => $vendor_id,
                        'product_parent_id' => vmRequest::getInt('product_parent_id'),
                        'product_sku' => vmGet($d,'product_sku'),
                        'product_name' => vmGet($d,'product_name'),
                        'product_title_tag' => vmGet($d,'product_title_tag'),
                        'product_desc_tag' => vmGet($d,'product_desc_tag'),
                        'product_key_tag' => vmGet($d,'product_key_tag'),
                        'product_desc' => vmRequest::getVar('product_desc', '', 'default', '', VMREQUEST_ALLOWHTML),
                        'product_s_desc' => vmRequest::getVar('product_s_desc', '', 'default', '', VMREQUEST_ALLOWHTML),

Обратите внимание: код встречается в файле дважды, и добавлять нужно строки дважды.

Можно тестировать что получилось:

7. Далее открываем файл /administrator/components/com_virtuemart/html/shop.product_details.php и находим код:
// Set Dynamic Page Title
if( function_exists('mb_substr')) {
$page_title = mb_substr($product_name, 0, 64, vmGetCharset() );
} else {
$page_title = substr($product_name, 0, 64 );

}
$vm_mainframe->setPageTitle( @html_entity_decode( $page_title, ENT_QUOTES, vmGetCharset() ));

// Prepend Product Short Description Meta Tag "description"
if( vmIsJoomla('1.5')) {
$document = JFactory::getDocument();
$document->setDescription(strip_tags( $db_product->f("product_s_desc")));
} else {
$mainframe->prependMetaTag( "description", strip_tags( $db_product->f("product_s_desc")) );
}
и заменяем его на это:
// Set Dynamic Page Title
if( function_exists('mb_substr')) {
$page_title = mb_substr($db_product->f("product_title_tag"), 0, 64, vmGetCharset() );
} else {
$page_title = substr($db_product->f("product_title_tag"), 0, 64 );
}
$vm_mainframe->setPageTitle( @html_entity_decode( $page_title, ENT_QUOTES, vmGetCharset() ));

// Prepend Product Short Description Meta Tag "description"
if( vmIsJoomla('1.5')) {
$document = JFactory::getDocument();
$document->setDescription(strip_tags( $db_product->f("product_desc_tag")));
$rsKeywords = $mosConfig_MetaKeys.", ";
$rsKeywords .= implode(', ',explode(' ', $product_name));
foreach( $pathway as $item ) {
$rsKeywords .= ', ' . $item->name;
}
$document->setMetaData( 'keywords', $db_product->f("product_key_tag") );
$document->setMetaData( 'title', $db_product->f("product_title_tag") );
// INSERT END
} else {
$mainframe->prependMetaTag( "description", strip_tags( $db_product->f("product_desc_tag")) );
}
После этого в карточке продукта в административной панели можно установить отдельные ключевые слова, метатеги и заголовок страницы для каждого товара, которые будут отображаться на странице расширенного описания товара.

Как это будет выглядеть в карточке товара можно посмотреть здесь.

Обратите внимание - если в административной панели у товара не будет заполнено поле title, то в расширенном описании товара в заголовке будет отображаться адрес страницы.

Надеюсь, у вас все получится. Метод проверенный, красивый и рабочий :) 

49 коммент.:

Игорь Целковский комментирует...

Добрый день подскажите пожалуйста, сдеалл как всё написано, в админке отображается ключевые слова, описание и заголовок, а на странице не выводится , просто ничего не написано...

Sagio комментирует...

Перепроверьте пункты 6 и 7, все ли правильно сделали. Заполните эти поля и в коде страницы (Ctrl+U) увидите. Должно работать. Проверено.

Игорь Целковский комментирует...

Проверил, всё заново, проблема осталось всё точно также. Я как раз и через код страницы и смотрю, там пусто во всех полях = (
А возможно такое, чтобы Вы файлы прислали рабочие я их перезалью, может где то пробел или я даж не знаю =((
7726947@mail.ru если есть шанс, что перезаливка поможет может попробывать.

Sagio комментирует...

Отдельных рабочих Файлов у меня нет. В статье находятся изменения для оригинальных файлов. Так как первоначальная статья пока не рабочая, могу предложить ее скриншот https://picasaweb.google.com/lh/photo/9Z_lVDe_PKmmoxvZ0csU1q8Bo77ddbvNQ7eG52dCQe4?feat=directlink.

сверьте еще раз, может получится.

Игорь Целковский комментирует...

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

Sagio комментирует...

Так в SQL-таблице вы сами должны были поля создать, это в начале статьи. Вы их не создали?

Игорь Целковский комментирует...

Создал , в bak_vm_product я их создавал они там есть. Но в jos_vm_product их нету, а как я понимаю в jos_ отображаются сами товары. Сюда по количеству товаров и полям...

Sagio комментирует...

Нужно создавать в jos_vm_product. Насписано же, что надо создавать в "префикс_vm_product".

Игорь Целковский комментирует...

Так там нету кнопки создать, Вы можете напистаь какой sql-запрос надо прописать. Я пожтому содал в бак т.к. в jos возможности такой физически нету кроме как sql запроса, но у меня с sql на ВЫ)

Sagio комментирует...

SQL не напишу. И так все просто. В таблице внизу будет ссылка создать поле. Создаете и заполняете его. А как вы могли создать в bak, но не можете в jos??? Почему нет физической возможности? У вас нет прав на создание полей? Откройте эти права и не мучайтесь.

Игорь Целковский комментирует...

Всё спасибо, я прописал запрос. А в этой статье указаны теги для товаров, а есть ли похожая статья только для вывода тегов на категории ??

Sagio комментирует...

Хорошо. Может и есть, но мне такая статья не попадалась.

Анонимный комментирует...

Автору респект, Все работает.Единственное название полей выводится в одну строчку,есть решение?

Sagio комментирует...

Назвние полей? Где именно? В админке? Или...?

kreolka_8 комментирует...

Спасибо! То что искала. Лучше самой все прописать, чем модулем и автоматически!

Sagio комментирует...

Пожалуйста! :)

Андрей комментирует...

Большое спасибо за статью.

Sagio комментирует...

Пожалуйста :)

Анонимный комментирует...

Здравствуйте! Сделал все как описано в статье. Запись в базу данных ведется, в том месте где происходит вывод данных эхом все выводится, но вот в мета теги не идет desc и key. Title на странице выводится. В CMS стоит плагин SEOsimple, отключение которого не приводит к желаемому результату. Такое ощущение что сама Joomla блокирует мои теги и рисует свои. Спасибо за помощь.

Анонимный комментирует...

Все просто и понятно! 10 минут - и к товарам в Вирте чудесным образом добавляются keywords, title и description. Спасибо большое! Остается только открытым вопрос о выводе тегов в категориях...

Sagio комментирует...

Если не получается, поищите, что еще может блокировать теги. На дефолтной джумле все должно работать.

Денис комментирует...

Не работает в категориях и карточках товара virtuemart, если установлен компонент sh404sef. Блокирует код в файле components/com_sh404sef/shPageRewrite.php строки 287 - 300 и components/com_sh404sef/meta_ext/com_virtuemart.php. В
карточке продукта virtuemart работает только тэг description.

Sagio комментирует...

Странно, что работает только description, уже тогда бы все не работали. Но спасибо, у кого установлен sh404sef, будут иметь ввиду.

Resident комментирует...

Добрый день! Хорошая статья, но добиться желательного результата у меня не получилось. После манипуляций, в админке появились поля. После заполнения и сохранения ноль.В коде странице кейворд пустые, дескрипшен от SH404. Если заходишь в товар котрый редактировал, то поля пустые.
У меня Joomla 1.5 + SH404SEF + Virt 1.9. Комментом выше Денис пишет о том что, что-то блокируется... Я не очень силен в этом, но очень хочется реализовать нормальное seo для вирта. Буду благодарен за помощь или подсказку куда хоть копать...

Unknown комментирует...

Автору благодарность! Делал все по порядку - все получилось (правда вернулся п.6 - по ошибке только в 1 место вставил)!

Анонимный комментирует...

Спасибо ! Все работает ! Благодарю Вас за труды мне очень приятно ! Скажите , а то , что когда не делаешь описание товара остается заголовок как ссылка - это не чего страшного ? если останется на некоторых материалах и отличается это от того, как было до изменений в плане SEO?

Анонимный комментирует...

Все получилось, правда не сразу,делал ошибки с кодом с начало,но потом все вышло!Хорошо бы еще было бы решение в категорий товаров.А так автору статьи спасибо!

Игорь комментирует...

Спасибо. За статью давно это решение искали. Решали чуть по-другому (все формаировалось на атомате исходя из расширенного описания товара) - но ваш вариант качественнее, хоть и больше ручной работы.

Анонимный комментирует...

Автору РЕСПЕКТ!!!

Сергей комментирует...

Так подскажите, что нужно делать если установлен SH404SEF. Писали что он что, то блокирует. Действительно, когда отключаешь SH404SEF, то все ок. Как решить проблему???

Анонимный комментирует...

Напишите пожалуйста, что нужно сделать, что бы SH404SEF не блокировал keywords, title и description

Sagio комментирует...

Лично я не люблю это расширение и не использую его, поэтому посоветовать ничего не могу, sorry... надеюсь, кто-нибудь вам подскажет.

Анонимный комментирует...

Для категорий :http://roket.kiev.ua/index.php?option=com_content&view=article&id=28:-virtuemart-18-description-keywords&catid=1:articls&Itemid=6

Всё сделал как написано,но в просмотре кода,появилось кроме title ещё и meta title
то есть их теперь два, причём если писать в новый meta title ,то заполняются оба одинаково.Это не очень хорошо,так как воспринимается как дубль страницы.Как это исправить.
Вадим.

Анонимный комментирует...

Все поля появляются. Пишу, сохраняю. В товарах кот. были надписи сохраняются, но в коде ничего нет. А новый товар вообще ошибка.

Анастасия комментирует...

А у меня ничего не получается.....начнем с того, что я не могу найти phpMyAdmin..... Никогда бы не подумала, что мне придется такие вещи делать... Подскажите пожалуйста где мне искать это phpMyAdmin ?

Sagio комментирует...

Ищите его в панели управления вашего хостинга.

Анонимный комментирует...

Сделал все как написано, но когда захожу на сайт в какой либо товар то там пустая страница нет вообще ничего. При нажатии Ctrl+U следующий код div id="vmMainPage".
ЧТО ДЕЛАТЬ?

Sagio комментирует...

Значит что-то сделали не так. Перепроверьте.

Анонимный комментирует...

Все работает с первого раза, афтору зачОт !

DarkAiR комментирует...

было бы вообще супер, если бы для категорий то же самое описали )

Sagio комментирует...

К сожалению, это не мое изобретение, а просто перепост, поэтому не могу описать такое для категории, но думаю по аналогии можно было бы сделать :)

Вячеслав комментирует...

Всё работает, спасибо огромное!!!! Медленно но уверено прошёлся по всем файлам, с первого раза всё ок!!! Joomla 1.5.25, VirtueMart 1.1.4

Анонимный комментирует...

Не получилось. Все перепроверил раза 4... Что блокирует? Стоит Tag Meta Manager. Отключил, появляется title, а description - пуст, киворды не появляются ни в одном случае.
Joomla 1.5.22, VirtueMart 1.1.4

Sagio комментирует...

Что могу сказать? Перепроверьте еще раз или установите это все на демо-джумлы с магазином. Ищите, что блокирует...

Анонимный комментирует...

Скажите пожалуйста, почему яндекс и гугл не создаёт сниппеты с описанием из созданного поля декрипшн? Татл товара отображается как надо, но вместо описания идёт текст шапки страницы и пункты меню. Спасибо.

Анонимный комментирует...

Все замечательно описано, но только не сохраняются данные введенные в данные поля, с чем это может быть связано?

Sagio комментирует...

Значит не записываются в базу. Перепроверьте еще раз по статье, все должно работать.

Николай комментирует...

А как изменить title в категории?

Unknown комментирует...

Спасибо, все получилось =)

Да, в категории было бы тоже неплохо изменить.

Технологии Blogger.

Followers

Kоличество просмотров