17.03.2017

Дополнительные возможности Aseo

Речь пойдет о нашем модуле Aseo с помощью которого можно заниматься продвинутой оптимизацией страниц под требования сео-продвижения с учетом различных нюансов.

Кроме базовых функций модуля существуют так же возможности которые можно реализовать путем некоторой доработки, а так же популярные проблемы о которых пойдет речь ниже

Проблема с фильтром - не всегда при установленном фильтре срабатывает редирект на новую aseo-ссылку.

Скорее всего суть в том, что если вы ставите в фильтре галку "Свойство-А", фильтр в УРЛ запихивает не только "Свойство-А", но диапазон цен - от 8525 (минимальной) до 213725 (максимальной). Получается что вы фильтруете витрину по 2м параметрам - по цене и по свойству "Свойство-А". Несмотря на то, что цену вы не трогали в фильтре, фильтр все равно ставит крайние значения цены в УРЛ и думает как будто вы их меняли. При том сторонние модули могут генерить настоящий честный УРЛ в котором нет фильтрации по цене, а есть только по "Свойство-А" - если вы создали aseo запись по честному УРЛ без цен, либо вы создали запись с ценами, но минимальная или максимальная цена в витрине поменялась, то фильтр перестает редиректится на правильную ссылку.

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

Как мы исправляли этот момент на примере сайта sef.com.ua: В шаблоне компонента catalog.smart.filter в файле templates.php надо добавить код, который будет записывать в JS-переменную минимальную и максимальную цену фильтра, либо писать вообще любые числовые свойства с диапазонами. Мы нашли место где выводятся именно числовые свойства с диапазонами и добавили такой код:



То есть мы добавили id тегов input-ов (минимального и максимального) и крайние значения в JS-массив.
Далее открываем код script.js из того же шаблона фильтра и пишем там:
$("#smartFilterForm").on('submit', function(){
	if(rangeLimits) {
	for(var i=0; i < rangeLimits.length; i++) {
			var curLimInp = $('#'+rangeLimits[i][0]);
			if(curLimInp.val() == rangeLimits[i][1]) {
				curLimInp.remove();
			}
		}
	}
	return true;
});

То есть мы подписываемся на submit формы фильтра (если фильтр у вас сделан простым отправлением формы методом GET) и проверяем - если текущие значения диапазонов равны крайним (то есть числовые свойства с диапазонами не трогали) то просто вырезаем инпуты из формы фильтра, чтобы они не попали в УРЛ.

Как добавить aseo запись в хлебные крошки

Для этого в шаблоне компонента хлебных крошек надо добавить такой код:
// == aseo MOD
if(isset($GLOBALS['ASEO_REWRITE'])) {
	$newUrl = $GLOBALS['ASEO_REWRITE']['NewUrl'];
	if($pos = strpos($newUrl, '?')) $newUrl = substr($newUrl, 0, $pos);

	$oldUrl = $GLOBALS['ASEO_REWRITE']['OldOriginalUrl'];
	if($pos = strpos($oldUrl, '?')) $oldUrl = substr($oldUrl, 0, $pos);
	
	
	$res = ipoldriver::GetResMass();
	$title = '';
	if($res['H1']) $title = $res['H1']; elseif($res['TITLE']) $title = $res['TITLE'];
	
	if($title) {
		$arResult[$itemSize-1]["LINK"] = $newUrl;
		$arResult[$itemSize] = array("TITLE"=>$title);
		$itemSize++;
	}
	
}
// end mod

Код добавит в arResult хлебных крошек вашу aseo запись если она сейчас активна.

Если требуется вручную определить наличие оптимизированной aseo-записи для определенного УРЛ фильтра.


На сайте sef.com.ua был установлен модуль, который в карт.товара добавляет ссылки к списку свойств товара ведущие на отфильтрованную по этому свойству витрину. Логично, чтобы ссылки сразу были в новом ЧПУ-виде если страница данного фильтра уже была оптимизирована через aseo и ей был задан новый УРЛ.
В этом случае мы просто добавили в шаблон в место где выводится ссылка на фильтр такой код:
// Этот параметр уже был до нас, но тем не менее вы можете использовать его - он как раз генерит ссылку на витрину отфильтрованную по определнному свойству.
$PropHref = $arResult['LAST_SECTION']['SECTION_PAGE_URL']."?arrFilter_".$arValues['ID']."_".abs(crc32($arValues['VALUE_ENUM_ID'])).'=Y&set_filter=Y';

//Далее мы включем свой код из модуля aseo который проверяет - если страница данного фильтра оптимизирована и ей задан новый УРЛ то функция вернет его.
if(CModule::IncludeModule("ipol.aseo")) {
	$PropHrefNew = ipoldriver::GetNewURL($PropHref);
	if($PropHrefNew) $PropHref = $PropHrefNew;
}
// Далее просто идет вывод ссылки на свойстве.
?>



p.s. данный код выполняется в цикле по свойствам товара на странице карточки товара при выводе таблицы со списком свойств.

Блок "облако тегов" из оптимизированных aseo-записей.

На одном из сайтов нам необходимо было выводить в витрине блок наподобие облака тегов.


Чтобы в этом блоке были все дочерние ссылки на страницы созданные через aseo. Чтобы данные ссылки быстрее индексировались, а так же чтобы пользователи активнее на них кликали и наращивали ПФ.

Например у нас есть страница витрины "Кальяны"
И на этой страницы путем фильтрации по размеру мы сделали страницы "Маленький кальян, большой кальян" и путем фильтрации по цвету "Красный кальян".
Кроме добавления этих трех новых страниц в карту сайта (о добалении в карту сайта написано в faq к модулю) мы захотели вывести в витрине "Кальяны" блок под названием "популярные теги" с этими тремя ссылками.
Для этого нам просто надо было сделать следующее:
1. Получить текущий УРЛ без гет-параметров - например /catalog/kalyany/
2. Вызвать aseo-метод для получения записей с входным параметром текущего УРЛ + %, то есть:
$res = sqlipoldriver::Get("/catalog/kalyany/%");
		
while($arr = $res->Fetch())
{
	$RealUrl = $arr["URL"];
	$NewURL = ipoldriver::GetNewURL($RealUrl);
	$RealUrl = ipoldriver::formaturl($RealUrl, array('cut:', 'cut*'));
	
	$Href = $RealUrl
	if($NewURL) $Href = $NewURL;
	
	$HrefTag = ''.$arr["TITLE"].'';
}


Таким образом мы получим все страницы созданные через aseo путем фильтрации витрины /catalog/kalyany/ и можем вывести их в данной витрине как блок ссылок.

PHP-макросы в мета-тегах.


Вам захотелось, чтобы Тайтл в витрине имел такой вид:
"Купить стабилизаторы по цене от 10.000 рублей в интернет магазине voltmarket."

Вы можете открыть стандартную форму SEO-настройки инфоблока и задать шаблон:
"Купить {=this.Name} в интернет магазине voltmarket." - где вместо this.name битрикс подставит имя раздела. Но как вывести минимальную цену товаров? Битрикс не дает такой возможности, так как цену надо вычислять для каждого раздела индивидуально.

Модуль aseo позволяет вам добавить в мета-теги такой макрос:
"Купить {=this.Name} #по цене от [#PHP_minPrice#] рублей# в интернет магазине voltmarket."

После чего вам нужно будет сходить в шаблон компонента витрины в файл component_epilog.php и дописать код, который рассчитает минимальную цену товара в витрине, после чего запишет ее в глобальную переменную $minPrice.

Модуль Aseo в конце выполнения страницы увидит, что существует глобальная переменная $minPrice и заменит макрос
#по цене от [#PHP_minPrice#] рублей# на фразу "по цене от 10.000 рублей"

Зачем нужны дополнительные символы # по краям? В случае если глобальной переменной $minPrice не существует (например в разделе нет товаров и ваш скрипт не смог посчитать цену), чтобы не выводить кривую фразу "по цене от рублей", модуль aseo просто вырежет из мета-тега весь блок ограниченный решетками целиком.


Таким образом вы можете легко добавлять в мета-теги любую информацию, хранящуюся и вычисляющуюся в вашем PHP-коде и управлять ее расположением.

Пример

Кроме того, есть и более простой кейс, например вы хотите в карточке товара в мета-тегах вывести свойство - производитель.
Это можно сделать стандартной настройкой, вы пишете "Стабилизатор, производитель: {=this.property.MANUFACTURER}"
Но что если у некоторых товаров не указан производитель, тогда вы получите не красивый тайтл "Стабилизатор, производитель:".

При наличии модуля aseo без дополнительного программирования вы легко можете написать так:
"Стабилизатор#, производитель: [{=this.property.MANUFACTURER}]#" - тогда модуль aseo проверит наличие контента в квадратных скобках. Если производитель там будет, тогда скобки раскроются. Если нет - тогда уберется весь блок ограниченный макросами.

Aseo и Cannonnical.


в модуле aseo можно выставить создаваемым страницам canonnical. Однако часто бывает что канонникал ставится скриптом. При этом задача стоит "указать canonnical на себя вырезая мета-теги".
В этом случае для canonnical используется параметр REQUEST_URI однако если мы находимся на aseo-странице, то REQUEST_URI даст старый УРЛ а не новый.
В этом случае надо не забывать ставить проверку на aseo функцией ipoldriver::GetNewURL($RealUrl); где $RealUrl - это REQUEST_URI и для выставления канноникла использовать уже результат функции GetNewURL если он существует - это и будет текущим УРЛ-ом.