Куда идем?

Сегодня представляю вашему вниманию маленький кейс, позволяющий автоматически делать заголовок 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
А покажите пожалуйста пример именно кода " «Футболка от Nike по цене всего 999руб»" который необходимо вставить
1
Сергей, это зависит от особенностей вашего магазина. Можно, например, вот так:


Код:

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



Это не очень хороший код, т.к. "руб" также должен выводиться через переменную. Но этот код наиболее простой.
0
а как в товарах
keywords также по шаблону
и в категориях
title
description
keywords
??? спасибо
1
павел,

Код:

$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
А вот такая проблемка - а если я хочу в кейвордс добавить название товара или категории, чтоб тянулось, как сделать?
0
вчера спрашивал - разобрался самостоятельно - вот решение
когда " "
тогда нужно еще раз внутрь вставлять " " и внутри писать выборку
пример
" ".$this->category->category_name." "
0
Здравствуйте!
а как проверить есть ли теги в карточке товара, то есть
если в карточке товара прописаны теги и тайтл - то берется оттуда
если ничего не прописано, то берется автоматом, что прописал я пример в моей карточке товара

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
павел, правильно написали, только в первом случае в SetTitle нужно подставить $this->product->customtitle.
0
А как вывести произвольное поля товара в title ?
Я прописал $this->product,'position'=>'ontop' , но это не работает.
0
Марк, это не так просто. Посмотрите в этой статье макеты настраиваемых полей: https://wedal.ru/rasshireniya-joomla/nastrojka-shablona-virtuemart-3.html#sub_customfields
В них вы найдете код разбора этих полей. Нужно выдернуть нужные вам значения полей, сформировать их них строку и уже ее подставлять в Title.
0
Я нашел в интернете как вывести значение определенного поля, но вставить его в 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
Марк,
замените:

Код:

$this->product->product_sku,$result


на:

Код:

$this->product->product_sku.' '.$result

0
Спаcибо!! :-)
0
Супер! А как вывести в тайтл текущее значение из позиции customfields?
0
Guest, также, только подставить значение из поля. Как его получить можно подсмотреть в коде макетов страницы товара VM или в подмакете customfield.php. Это может быть не так просто, т.к. поля выводятся в массиве и перебираются циклом. Лучше сделать для такого поля отдельную позицию макета (можно задать при настройке поля) и уже из нее получать значение.
0
У меня такой код для вывода значения в макете карточки товара.

Код:

<div class="typeproduct">
<?php // position typeproduct
echo shopFunctionsF::renderVmSubLayout('customfields',array('product'=>$this->product,'position'=>'typeproduct'));?>
</div>



А как взять это значение для вывода в title не знаю.
я не селен в php..((
Подскажите пожалуйста, как правильно сделать.
0
Виталий, в карточке товара временно поставьте такую конструкцию:

Код:

<pre> <?php print_r($this->product) ?></pre>


Так вы увидите все содержимое объекта товара. Там же найдете и поля.