Выбрать курс
0  /  17

Умная карта сайта

Установка модуля

  1. Зайдите по ссылке https://marketplace.1c-bitrix.ru/solutions/solverweb.sitemap/, нажмите кнопку «Попробовать».


  1. Укажите адрес вашего сайта (Например https://solverweb.ru.ru/) и нажмите кнопку «Попробовать»


  2. Откроется страница загрузки модуля на сайт. Проверьте, что напротив модуля стоит галочка, и нажмите кнопку «Загрузить». Так же убедитесь, что напротив других модулей не стоит галочек. Вы должны точно понимать, что делаете, так как при обновлении других модулей может быть нарушена работоспособность сайта.

  3. Во всплывающем окне поставьте "ознакомьтесь с лицензионным соглашением" и подтвердите свое согласие с ним.

  4. Дождитесь загрузки модуля и нажмите кнопку «Установить».

  5. Убедитесь, что модуль установлен без ошибок.

  6. Можно приступать к настройке модуля.


Настройка модуля

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

Исключения

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



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

В целом, данный функционал устарел, так как не способен решить какие-то серьезные задачи. Под более серьезные задачи (например, добавление тегов, добавление виртуальных разделов, удаление страниц по маске и т.п.) мы сделали API. Для того, чтобы с ним работать, нужны минимальные знания PHP и понимание работы Bitrix Events. Так же вы можете обратиться к нам.

Мультидоменность (через 1 папку)

Существует несколько видов реализации многосайтовости. Если речь идет о совершенно разных сайтах в разных папках, то данный функционал модуля доступен из коробки. Но, часто многосайтовость завязана на одну папку и по адресу https://domain/sitemap.xml. Так же, в зависимости от домена, должна быть своя карта.

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

Рассмотрим варианты:

Карт не много или они отличаются содержимым

Это более простой способ. В нем отсутствует необходимость разработки (однако, правки в настройки веб сервера вносить в любом случае придется, эту проблему без жестких костылей невозможно решить на уровне решения), но под каждый сайт нужно создавать отдельную карту.

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

{код}

Под каждый сайт, создаем отдельную карту сайта

2020-10-03_17-53-45.png

Путь им задаем вида /sitemap/<SUBDOMAIN>/sitemap, пример:

2020-10-03_18-00-59.png

Если домен без WWW, то у основного домена папка должна быть default (/sitemap/default/sitemap).

Генерируем карты, убеждаемся в том, что создалась папка sitemaps/, в ней для каждого поддомена есть папка и в них лежат карты сайта.

После чего удаляем все карты в корне по маске sitemap*.xml.

Если у Вас Apache, вносите в .htaccess после 
RewriteEngine On
следующее
RewriteCond %{SERVER_NAME} ^domain\.ru$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^sitemap(.*).xml$ /sitemaps/default/sitemap$1.xml [L]
 
RewriteCond %{SERVER_NAME} ^(.*)\.domain\.ru$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^sitemap(.*).xml$ /sitemaps/%1/sitemap$1.xml [L]
 
<FilesMatch "sitemaps">
  Order allow,deny
  Deny from all
</FilesMatch>
Если у Вас nginx, вносите в server {} (Пожалуйста, убедитесь, что у Вас хватает компетенции. Если нет, пишите нам, не нужно ломать сервер.)
location / {
  if ($server_name ~ "^domain\.ru$"){
    rewrite ^/sitemap(.*).xml$ /sitemaps/default/sitemap$1.xml break;
  }
  if ($server_name ~ "^(.*)\.domain\.ru$"){
    rewrite ^/sitemap(.*).xml$ /sitemaps/%1/sitemap$1.xml break;
  }
}

location ~ sitemaps {
  deny all;
}
На этом все. Если разобраться не получается, не отчаивайтесь, пишите в поддержку, мы поможем.

Карты отличаются только доменом (более сложный способ)

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

Создаем и настраиваем обычную карту сайта на основной домен, прописываем ей путь /sitemap/sitemap, как показано на скрине.

2020-10-03_16-34-34.png

Заходим на фтп, и удаляем из корня все файлы по маске sitemap*.xml (если их не удалить, в некоторых случаях может не работать).

{код}

Создаем файл sitemapController.php в корне сайта, меняем первую строку на Ваш домен, прописанный в настройках карты сайта:

<?
$mainDomain = 'https://solverweb.ru'; //Заменить на свой
 
$host = htmlspecialchars($_SERVER['SERVER_NAME']);
if(strpos($_SERVER["REQUEST_URI"],'../') !== false) die('');
 
if ((isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") || (isset($_SERVER["HTTP_X_FORWARDED_PROTO"]) && $_SERVER["HTTP_X_FORWARDED_PROTO"] == "https") || (isset($_SERVER["HTTP_X_FORWARDED_SCHEME"]) && $_SERVER["HTTP_X_FORWARDED_SCHEME"] == "https")){
	$protocol = "https";
}
else{
	$protocol = "http";
}
 
 
$curDomain = $protocol."://".$host;
 
$sitemapsPath = '/sitemaps/www';
$path = $_SERVER['DOCUMENT_ROOT'] . $sitemapsPath . $_SERVER["REQUEST_URI"];
 
if (file_exists($path))
{
        header('Content-Type: text/xml; charset=utf-8');
	$current = file_get_contents($path);
	$current = str_ireplace($mainDomain, $curDomain, $current);
	echo $current;
}else {
	include $_SERVER['DOCUMENT_ROOT']. "/404.php";
}
Если у Вас Apache, вносите в .htaccess после 
RewriteEngine On
следующее:
RewriteRule ^sitemap(.*).xml$ /sitemapController.php [L]
Если у Вас nginx, вносите в server {} (пожалуйста, убедитесь что у Вас хватает компетенции, если нет, пишите нам, не нужно ломать сервер)
location / {
    rewrite ^/sitemap(.*).xml$ /sitemapController.php break;
}
На этом все. Если разобраться не получается, не отчаивайтесь, пишите в поддержку, мы поможем.

Типовые ошибки

Неправильные адреса

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

Адреса в настройках инофблоков должны быть равны адресам в настройках компонента.

2020-10-04_12-06-10 (2).png

2020-10-04_12-14-45.png

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

Проблемы с лицензией

Битрикс очень сильно намудрил с лицензией, из-за этого даже у некоторых опытных разработчиков возникают проблемы. Есть 2 варианта активирования лицензии всех модулей, в зависимости от того истек ли демо период или нет.

Общая часть

Необходимо зайти в Marketplace -> Обновления платформы -> Активация купона и вбить туда свой номер купона, после чего нажать кнопку активировать.

2020-10-04_12-22-08.png

После чего Вам всплывет сообщение о статусе активации купона. Если вы сделали все правильно, то сообщение будет вот такое:

2020-10-04_12-22-35.png

На этом все не все, но очень многие считают, что все и более ничего не делают. Однако же, такой способ достаточен только в том случае, если купон вбит до установки модуля, если нет, идем дальше.

1. Демо период закончился

Переходим в Установленные решения и наблюдаем так вот такую картину:

2020-10-03_13-33-47.png

У нас один и тот же модуль 2 раза, один куплен, но не установлен, второй истек. Проблема в том, что первый модуль обфусцирован, и просто так его теперь не получится зарегистрировать, нужно установить полноценный модуль.

2. Демо период не закончился

Перейдите в "Обновление решений" и зарегистрируйте его.

2020-10-04_12-50-41.png

Все, теперь модуль будет корректно работать.

Кастомизация через API (события)

{код}

На больших сайтах бывают случаи, когда разработчики реализовывают что-либо, не укладывающееся в логику битрикса, либо страницы которые генерируются компонентами на лету. Админка о них не знает, и модуль их не видит. Выход есть. Если оно как-то генеруется, значит в компоненте есть описанная логика, осталось разобрать ее и  добавить в карту сайта. 

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

Событие Вызывается Аргументы С версии
OnBeforeSectionGetList
событие перед выборкой разделов &$arSectionsFilter, &$sectionPageUrl, $iblock, $arMap, &$arSectionsSelect 0.9.25
OnBeforeSectionParse
событие перед сбором разделов &$arSection, $iblock, self::$arMap 0.9.25
OnAfterSectionParse событие после сборка разделов &$data, &$arSections, $arSection, $iblock, $arMap 0.8.9
OnBeforeElementGetList событие до выборки элементов &$arElementsFilter, &$detailPageUrl, $iblock, $arMap, &$arElementsSelect 0.9.23
OnBeforeElementParse
событие перед сбором элементов &$arElement, $iblock, $arMap 0.8.9
OnAfterElementParse
событие после сбора элементов &$element, &$arSections, $arElement, $iblock, $arMap 0.8.9
OnBeforeXMLGenerate
событие перед формированием XML карты &$arMap['DATA'], $arMap 0.8.9
OnBeforeSplitIndexGenerate
событие перед формированием XML листа карт сайта (только при разбивки карты на части) &$xmldata, &$fileName 0.9.25

Примеры

Замена ссылки (добавление OID для торг предов)

Задача, добавить ?oid={ID} торговым предложениям в карте, не добавляя в битриксе, т.к. меняется ссылка на самом сайте. Решение в init.php

{код}

AddEventHandler("solverweb.sitemap", "OnAfterElementParse", "OnAfterElementParse");
function OnAfterElementParse(&$element, &$arElements, $arElement) {
	if ($arElement['IBLOCK_ID'] == 23)
		$element['url'] = $arElement["DETAIL_PAGE_URL"].'?oid='.$arElement["ID"];
}

Добавление страниц тегирования в решении Digital Web Delux

{код}
AddEventHandler("solverweb.sitemap", "OnAfterSectionParse", "OnAfterSectionParse");
function OnAfterSectionParse(&$section, &$arSections, $arSection) {
	if ($arSection['IBLOCK_ID'] == 15) {
		$arTags = [];
		// $tagPath = $arSection["SECTION_PAGE_URL"];
		$rsProducts = CIBlockElement::GetList(
			[],
			[
				"IBLOCK_ID" => $arSection["IBLOCK_ID"],
				"=SECTION_ID" => $arSection["ID"],
				"!TAGS" => false,
				"ACTIVE_DATE" => "Y",
				"ACTIVE" => "Y",
				"CATALOG_AVAILABLE" => "Y",
				"INCLUDE_SUBSECTIONS" => "Y"
			],
			false,
			false,
			["ID", "TAGS", "IBLOCK_SECTION_ID"]
		);
		while($arProduct = $rsProducts->GetNext()){
			if(!empty($arProduct["TAGS"]))
				$arTags = array_merge($arTags, explode(",", $arProduct["TAGS"]));
		}
		$arTags = array_unique($arTags);
		if (!empty($arTags));
			foreach($arTags as $inx => $tagName)
				$arSections[$arSection['ID']][] = [
					// 'url' => $tagPath."tag/".$tagCode."/",
					'url' => $section['url']."tag/".Cutil::translit($tagName, LANGUAGE_ID, array("change_case" => "L", "replace_space" => "-", "replace_other" => "-"))."/",
					'mod' => $section['mod'],
					'freq' => $section['freq'],
					'prior' => $section['prior']
				];
 
		// \Bitrix\Main\Diag\Debug::writeToFile(array('tagName'=>$tagName));
	}
}

Исключение страниц по маске

Задача исключить из выгрузки страницы вида "/catalog/abrazive/shkurka-"
AddEventHandler("solverweb.sitemap", "OnBeforeXMLGenerate", "OnBeforeXMLGenerateFunction");
function OnBeforeXMLGenerateFunction(&$arMap) {
	foreach($arMap as $map => $arItems)
		foreach($arItems as $key => $item)
			if (strpos($item['url'], '/catalog/abrazive/shkurka-') !== false)
				unset($arMap[$map][$key]);
}

CRON

Мы рекомендуем настраивать генерацию карты сайта на крон, так как  с агентами могут возникать проблемы. На кроне карта будет генерироваться стабильнее, но данное действие требует определенных знаний. По-этому, если карта будет настроена на агента, ничего страшного.

Для тех, кто все же имеет эти знания, поехали...

Создайте файл sitemapGen.php в папке /local/php_interface/ (если такой папки нет, ее нужно создать).
<?php
$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/../..");
 
$pass = "СЮДА ВБИТЬ ПАРОЛЬ";
 
if($pass == "СЮДА ВБИТЬ ПАРОЛЬ" && !is_cli()) die('Защита от дурака, переменная $pass не установлена.');
$access = false;
 
function is_cli()
{
	if( defined('STDIN'))return true;
	if( empty($_SERVER['REMOTE_ADDR']) and !isset($_SERVER['HTTP_USER_AGENT']) and count($_SERVER['argv']) > 0) return true;
	return false;
}
 
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
include_once($_SERVER["DOCUMENT_ROOT"]. "/bitrix/modules/main/include/prolog_before.php");
set_time_limit(0);
 
if(is_cli() || $_GET["PWD"] == $pass)
	$access = true; 
 
CModule::IncludeModule("solverweb.sitemap");
 
if($access)
	if(SWSitemapGenerate::Generate() == NULL) echo "OK";
 else
	include $_SERVER["DOCUMENT_ROOT"]."/404.php";
?>
Дальше есть 2 варианта запуска, это через интерпретатор или через wget (на самом деле вариантов больше, но придумать в каких вариантах они могут пригодиться, мы не смогли).

Запускаем через интерпретатор в режиме PHP CLI

Это более сложный способ, но более правильный.

Заходим в SSH.

Пишем "whereis php", выбираем из вариантов тот, который используется на сайте и прописываем в CRON команду:



Прописываем в Cron строку вида:

/opt/php74/bin/php /var/www/domain/data/www/domain/local/php_interface/sitemapGen.php

Периодичность выбирайте сами, исходя из ваших потребностей.

Запускаем через wget

Это более простой способ, но менее правильный. Просто запускаем в крон команду.

wget -O /dev/null -q https://domain/local/php_interface/sitemapGen.php?PWD=<Пароль>
У такой реализации есть свои плюсы, например, если на сервере нет крона вообще, можно поставить с другой машины (да-да, в 2020 году не у всех хостингов есть CRON) или слова SSH, интерпретатор вызывают беличий транс. Но есть и свои минусы, которые не очень имеет смысл расписывать.

Для этого способа обязательно нужно установить пароль в переменной $pass файла sitemapGen.php, иначе он работать не будет! После чего зайдите по ссылке https://domain/local/php_interface/sitemapGen.php?PWD=&lt;Пароль&gt; и убедитесь, что все работает. Если вы все сделали верно, вы получите в ответ ОК.

Платная настройка модуля

Мы можем настроить модуль за Вас, вникнув в структуру сайта. Выберем правильную стратегию автогенерации, внесем изменения в модуль, исходя из особенностей Вашего сайта. Данная услуга является платной, стоимость оговаривается до начала работ, стоимость конечная, то есть не уменьшаться, не увеличиваться она не будет. В письме необходимо предоставить доступы к ftp/ssh, административный доступ к 1С-Битрикс. Так же, при необходимости,мы можем запросить у Вас доступ к хостингу, например, в случае, если необходимо изменить какую-то настройку сервера.

Поддержка

Консультации по работе модуля и помощь в настройке - бесплатны.


Услуга по настройке модуля (не путайте "помочь настроить" и "настроить за Вас"). Если у Вас не получается - мы поможем бесплатно. Доработки под особенности вашего сайта оказываются на возмездной основе, по тарифам компании.

Мы оказываем любую техническую поддержку для сайтов на 1С-Битрикс (не только модуля).