Кейс, позволяющий автоматически делать заголовок Title страницы товара Virtuemart совпадающим с названием товара. Данное решение не требует хаков ядра.
Как убрать категорию из Title на странице товара Virtuemart без хака

Сегодня представляю вашему вниманию маленький кейс, позволяющий автоматически делать заголовок Title страницы товара Virtuemart совпадающим с названием товара. Данное решение не требует хаков ядра. После него вы можете смело обновлять Virtuemart. Изменения не будут стерты.

Проблема заголовков товаров Virtuemart

Допустим, у нас есть категория «Одежда» и в ней товар «Футболка». Если перейти на страницу товара, заголовок Title этой страницы будет: "Одежда : Футболка". Это, мягко говоря, неправильно с точки зрения поисковой оптимизации (SEO).

Title должен быть таким же, как и H1, т.е. совпадать с названием товара.  Думаю, в чем-то сео-оптимизаторы могут здесь со мной поспорить, но что они точно не будут отрицать, так это то, что Title формата «Название категории: Название товара» не является правильным.

Не знаю, что движет разработчиками Virtuemart и почему они не исправляют  от версии к версии эту проблему. Исправим самостоятельно. Решение, описанное ниже, почему-то не встречается в Интернете. На других сайтах решение есть, но оно требует хака. Решение из этого кейса обходится без него.

Делаем заголовки страниц Title товаров Virtuemart идентичными названиям товаров

Решение состоит из двух шагов:

Шаг 1. Переопределяем макет карточки товара в используемый вами шаблон Joomla. Для этого копируем файл:

components /com_virtuemart/views/productdetails/tmpl/default.php

в:

 /templates/ваш_шаблон/html/com_virtuemart/productdetails/

Если каких-то каталогов во втором пути не хватает, создайте их сами. Если копируемый файл уже существует, то не заменяем его, а переходим сразу к шагу 2.

Шаг 2. Открываем файл:

/templates/ваш_шаблон/html/com_virtuemart/productdetails/default.php

И после строчки:

defined('_JEXEC') or die('Restricted access');

Вставляем следующий код:

//Исправляем Title страницы товара
$document = JFactory::getDocument();
if ($this->product->customtitle) {
	$document->setTitle(strip_tags(html_entity_decode($this->product->customtitle,ENT_QUOTES)));
} else {
	$document->setTitle(strip_tags(html_entity_decode($this->product->product_name,ENT_QUOTES)));
}

После этого сохраняем файл, обновляем страницу и видим, что Title теперь совпадает с названием товара.

Кстати, данный вариант не ломает пользовательское название страницы. Вы можете заполнить соответствующую опцию в настройках товара и при этом Title изменится на введенный вами.

Подставляя другие переменные из макета карточки товара в данный код, вы можете автоматически создавать уникальные заголовки для страниц товаров. Например, сделав их вида:

 «[Название товара] от [производитель] по цене всего [цена]»

В результате у вас получится что-то вроде:

 «Футболка от Nike по цене всего 999руб»

И для каждого товара автоматически будет генерироваться аналогичный уникальный заголовок.

P.S.: А здесь вы можете почитать подробнее про управление заголовками Title в Joomla.

Об авторе
Об авторе
Wedal (Виталий). Веб-разработчик полного цикла (Full Stack). Создатель и автор сайта Wedal.ru.
Основной профиль – создание сайтов и расширений на CMS Joomla.

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

Для отправки комментария введите код с картинки:
Защитный код
Обновить

Комментарии  

0 # Сергей 14.09.2017 14:56
А покажите пожалуйста пример именно кода " «Футболка от Nike по цене всего 999руб»" который необходимо вставить
Ответить | Ответить с цитатой | Цитировать
+1 # Wedal 15.09.2017 05:39
Сергей, это зависит от особенностей вашего магазина. Можно, например, вот так:

Код:$document->setTitle(strip_tags(html_entity_decode($this->product->product_name.' от '.$this->product->mf_name.' по цене всего '.round($this->product->prices['salesPrice'], 2).' руб',ENT_QUOTES)));

Это не очень хороший код, т.к. "руб" также должен выводиться через переменную. Но этот код наиболее простой.
Ответить | Ответить с цитатой | Цитировать
0 # павел 19.09.2017 22:15
а как в товарах
keywords также по шаблону
и в категориях
title
description
keywords
??? спасибо
Ответить | Ответить с цитатой | Цитировать
+1 # Wedal 20.09.2017 05:38
павел,
Код:$document = JFactory::getDocument();
$document->setDescription( "Your meta description" );
$document->setMetaData('keywords', "keyword1,keyword2, etc.");
$document->setMetaData('robots', "index,follow");
$document->setMetaData('author', "Jobin Jose");


В категориях аналогично, только код нужно вставлять не в макет карточки товара, а в макет категории.
Ответить | Ответить с цитатой | Цитировать
0 # павел 20.09.2017 22:56
А вот такая проблемка - а если я хочу в кейвордс добавить название товара или категории, чтоб тянулось, как сделать?
Ответить | Ответить с цитатой | Цитировать
0 # Павел 21.09.2017 09:14
вчера спрашивал - разобрался самостоятельно - вот решение
когда " "
тогда нужно еще раз внутрь вставлять " " и внутри писать выборку
пример
" ".$this->category->category_name." "
Ответить | Ответить с цитатой | Цитировать
0 # павел 30.09.2017 19:46
Здравствуйте!
а как проверить есть ли теги в карточке товара, то есть
если в карточке товара прописаны теги и тайтл - то берется оттуда
если ничего не прописано, то берется автоматом, что прописал я пример в моей карточке товара

if ($this->product->customtitle) {
$document->setTitle(strip_tags(html_entity_decode('Купить '.$this->product->product_name.' по цене '.round($this->product->prices['salesPrice'], 2).' руб.текст ',ENT_QUOTES)));
} else {
$document->setTitle(strip_tags(html_entity_decode('Купить '.$this->product->product_name.' по цене '.round($this->product->prices['salesPrice'], 2).' руб. текст ',ENT_QUOTES)));
}
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 02.10.2017 06:00
павел, правильно написали, только в первом случае в SetTitle нужно подставить $this->product->customtitle.
Ответить | Ответить с цитатой | Цитировать
0 # Марк 31.01.2018 10:33
А как вывести произвольное поля товара в title ?
Я прописал $this->product,'position'=>'ontop' , но это не работает.
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 01.02.2018 02:14
Марк, это не так просто. Посмотрите в этой статье макеты настраиваемых полей: https://wedal.ru/rasshireniya-joomla/nastrojka-shablona-virtuemart-3.html#sub_customfields
В них вы найдете код разбора этих полей. Нужно выдернуть нужные вам значения полей, сформировать их них строку и уже ее подставлять в Title.
Ответить | Ответить с цитатой | Цитировать
0 # Марк 01.02.2018 13:30
Я нашел в интернете как вывести значение определенного поля, но вставить его в title по прежнему не получается. Что делаю не так, подскажите. Вот код:
Код:<br />$document = JFactory::getDocument();<br />if ($this->product->customtitle) {<br /> $document->setTitle(strip_tags(html_entity_decode($this->product->customtitle,ENT_QUOTES)));<br />} else {<br /> //Забираем значение поля из бд<br /> $db = JFactory::getDBO();<br /> $id = $this->product->virtuemart_product_id;<br /> $db->setQuery("SELECT customfield_value FROM wxa43_virtuemart_product_customfields WHERE virtuemart_product_id= $id and virtuemart_custom_id=11");<br /> $db->query();<br /> //Значение записано в переменную $result<br /> $result = $db->loadResult();<br /> $document->setTitle(strip_tags(html_entity_decode($this->product->product_name.' '.$this->product->mf_name.' — купить за '.round($this->product->prices['salesPrice'], 2).' руб. в интернет-магазине ,арт. '.$this->product->product_sku,$result,ENT_QUOTES)));<br />}<br />
Значение $result выводится через echo $result на странице. А вот в title не отображается зараза !!
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 02.02.2018 01:59
Марк,
замените:
Код:$this->product->product_sku,$result
на:
Код:$this->product->product_sku.' '.$result
Ответить | Ответить с цитатой | Цитировать
0 # Марк 02.02.2018 04:20
Спаcибо!! :-)
Ответить | Ответить с цитатой | Цитировать
0 # Guest 01.07.2020 19:03
Супер! А как вывести в тайтл текущее значение из позиции customfields?
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 02.07.2020 07:31
Guest, также, только подставить значение из поля. Как его получить можно подсмотреть в коде макетов страницы товара VM или в подмакете customfield.php. Это может быть не так просто, т.к. поля выводятся в массиве и перебираются циклом. Лучше сделать для такого поля отдельную позицию макета (можно задать при настройке поля) и уже из нее получать значение.
Ответить | Ответить с цитатой | Цитировать
0 # Виталий 06.07.2020 11:02
У меня такой код для вывода значения в макете карточки товара.
Код:<div class="typeproduct">
<?php // position typeproduct
echo shopFunctionsF::renderVmSubLayout('customfields',array('product'=>$this->product,'position'=>'typeproduct'));?>
</div>


А как взять это значение для вывода в title не знаю.
я не селен в php..((
Подскажите пожалуйста, как правильно сделать.
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 13.07.2020 08:16
Виталий, в карточке товара временно поставьте такую конструкцию:
Код:<pre> <?php print_r($this->product) ?></pre>
Так вы увидите все содержимое объекта товара. Там же найдете и поля.
Ответить | Ответить с цитатой | Цитировать