ИС и Sitemap
lipton_ice_tea
11 января 2018 г.
На сайте есть ИС, для элементов которых существуют отдельные страницы (к примеру, "Новости", а есть ИС, элементы которых выводятся на главной странице ИС, и для них нет отдельных страниц (к примеру, "Отзывы".
В настройках узла структуры для этих ИС не указан "XSL шаблон для отображения элемента информационной системы".
Но в sitemap попадают элементы всех ИС.
Отсюда вопрос: Можно ли сделать сделать так, что бы только для некоторых информационных систем их элементы попадали в sitemap?
Т.е. элементы ИС "Новости" должны попадать в sitemap, а элементы ИС "Отзывы" - нет!
Сейчас нашел только, что либо в sitemap можно задать индексацию для элементов всех ИС, либо вручную для каждого элемента указывать индексацию.
p.s. вижу 2 направления решения проблемы:
а) отталкиваться от того, установлен ли "XSL шаблон для отображения элемента информационной системы"
б) где-то делать проверку по id ИС.
В настройках узла структуры для этих ИС не указан "XSL шаблон для отображения элемента информационной системы".
Но в sitemap попадают элементы всех ИС.
Отсюда вопрос: Можно ли сделать сделать так, что бы только для некоторых информационных систем их элементы попадали в sitemap?
Т.е. элементы ИС "Новости" должны попадать в sitemap, а элементы ИС "Отзывы" - нет!
Сейчас нашел только, что либо в sitemap можно задать индексацию для элементов всех ИС, либо вручную для каждого элемента указывать индексацию.
p.s. вижу 2 направления решения проблемы:
а) отталкиваться от того, установлен ли "XSL шаблон для отображения элемента информационной системы"
б) где-то делать проверку по id ИС.
lipton_ice_tea
11 января 2018 г.
Пока нашел такой способ решения:
1. В ТДС "Google SiteMap" переключить вывод карты сайта на xsl
2. В xsl "GoogleSiteMap" заменить ~20 строчку:
на:
где 16 - id ИС, элементы которой надо исключить из индексации.
Остается найти более эффективный способ: Проверять, установлен ли шаблон для вывода элементов, или нет.
1. В ТДС "Google SiteMap" переключить вывод карты сайта на xsl
2. В xsl "GoogleSiteMap" заменить ~20 строчку:
<xsl:if test="show = 1">
на:
<xsl:if test="not(informationsystem_id) or (informationsystem_id != 16)">
где 16 - id ИС, элементы которой надо исключить из индексации.
Остается найти более эффективный способ: Проверять, установлен ли шаблон для вывода элементов, или нет.
lipton_ice_tea
14 января 2018 г.
Если кому надо, то вот вариант решения.
Т.к. я никогда не устанавливал вручную частоту обновления и приоритет в sitemap, то в данном способе будем автоматически генерировать приоритет в зависимости от вложенности узлов структуры, а в качестве параметра того, надо ли индексировать вложенные элементы (например элементы ИС или ИМ), будем использовать частоту обновления (параметр в xsl = changefreq) равную "никогда" (значение в xsl = 6). По аналогии можно использовать любой другой параметр, который доступен при выводе узлов структуры в xsl.
1. Первым делом заходим в ТДС "Google SiteMap" и на вкладке "Настройка страницы" раскомменчиваем строку 9 и пишем в ней:
2. Далее раскомменчиваем строки ~27,28 и с 63 до конца. Т.е. весь код, который отвечает за вывод xsl. А так же дописываем условие выборки элементов структуры:
Вот полный код:
3. Код Xsl-шаблона "GoogleSiteMap":
4. Теперь для того, что бы не выводить в sitemap дочерние элементы раздела, достаточно просто на вкладке "sitemap" этого раздела в структуре сайта частоту обновления поставить "никогда".
Это своего рода получается "костыль", т.к. мы применяем параметр частоты обновления не по назначению, но другого удобного способа пока не придумал. Да и к тому же, через хуки можно переименовать названия на форме центра администрирования)
Т.к. я никогда не устанавливал вручную частоту обновления и приоритет в sitemap, то в данном способе будем автоматически генерировать приоритет в зависимости от вложенности узлов структуры, а в качестве параметра того, надо ли индексировать вложенные элементы (например элементы ИС или ИМ), будем использовать частоту обновления (параметр в xsl = changefreq) равную "никогда" (значение в xsl = 6). По аналогии можно использовать любой другой параметр, который доступен при выводе узлов структуры в xsl.
1. Первым делом заходим в ТДС "Google SiteMap" и на вкладке "Настройка страницы" раскомменчиваем строку 9 и пишем в ней:
$type = 1;
2. Далее раскомменчиваем строки ~27,28 и с 63 до конца. Т.е. весь код, который отвечает за вывод xsl. А так же дописываем условие выборки элементов структуры:
$Structure_Controller_Show->structure()->queryBuilder()
->where('active', '=', 1)
->where('indexing', '=', 1);
->where('active', '=', 1)
->where('indexing', '=', 1);
Вот полный код:
<?php
Core_Session::close();
/*
* 0 - PHP-генерация
* 1 - XSL-генерация
*/
$type = 1;
// Создавать индекс
$createIndex = FALSE;
// Количество страниц в каждый файл
$perFile = 50000;
$oSite = Core_Entity::factory('Site')->getByAlias(Core::$url['host']);
$oSite_Alias = $oSite->getCurrentAlias();
if (is_null($oSite_Alias))
{
?>Site hasn't had a default alias!<?php
exit();
}
if ($type == 0)
{
$oCore_Sitemap = new Core_Sitemap($oSite);
$oCore_Sitemap
->createIndex($createIndex)
->perFile($perFile)
// Перегенерировать раз в 3 дня
->rebuildTime(60*60*24 * 3);
if (Core::moduleIsActive('informationsystem'))
{
$oCore_Sitemap
// Показывать группы информационных систем в карте сайта
->showInformationsystemGroups(Core_Page::instance()->libParams['showInformationsystemGroups'])
// Показывать элементы информационных систем в карте сайта
->showInformationsystemItems(Core_Page::instance()->libParams['showInformationsystemItems']);
}
if (Core::moduleIsActive('shop'))
{
$oCore_Sitemap
// Показывать группы магазина в карте сайта
->showShopGroups(Core_Page::instance()->libParams['showShopGroups'])
// Показывать товары магазина в карте сайта
->showShopItems(Core_Page::instance()->libParams['showShopItems'])
// Показывать модификации в карте сайта
->showModifications(Core_Array::get(Core_Page::instance()->libParams, 'showModifications', 1));
}
$oCore_Sitemap
// Раскомментируйте при наличии достаточного объема оперативной памяти
//->limit(10000)
->fillNodes()
->execute();
}
else
{
$Structure_Controller_Show = new Structure_Controller_Show($oSite->showXmlAlias(TRUE));
$Structure_Controller_Show->structure()->queryBuilder()
->where('active', '=', 1)
->where('indexing', '=', 1);
$Structure_Controller_Show
//->parentId(0)
->xsl(
Core_Entity::factory('Xsl')->getByName(Core_Page::instance()->libParams['xsl'])
);
if (Core::moduleIsActive('informationsystem'))
{
$Structure_Controller_Show
// Показывать группы информационных систем в карте сайта
->showInformationsystemGroups(Core_Page::instance()->libParams['showInformationsystemGroups'])
// Показывать элементы информационных систем в карте сайта
->showInformationsystemItems(Core_Page::instance()->libParams['showInformationsystemItems']);
}
if (Core::moduleIsActive('shop'))
{
$Structure_Controller_Show
// Показывать группы магазина в карте сайта
->showShopGroups(Core_Page::instance()->libParams['showShopGroups'])
// Показывать товары магазина в карте сайта
->showShopItems(Core_Page::instance()->libParams['showShopItems']);
}
$Structure_Controller_Show->show();
}
exit();
Core_Session::close();
/*
* 0 - PHP-генерация
* 1 - XSL-генерация
*/
$type = 1;
// Создавать индекс
$createIndex = FALSE;
// Количество страниц в каждый файл
$perFile = 50000;
$oSite = Core_Entity::factory('Site')->getByAlias(Core::$url['host']);
$oSite_Alias = $oSite->getCurrentAlias();
if (is_null($oSite_Alias))
{
?>Site hasn't had a default alias!<?php
exit();
}
if ($type == 0)
{
$oCore_Sitemap = new Core_Sitemap($oSite);
$oCore_Sitemap
->createIndex($createIndex)
->perFile($perFile)
// Перегенерировать раз в 3 дня
->rebuildTime(60*60*24 * 3);
if (Core::moduleIsActive('informationsystem'))
{
$oCore_Sitemap
// Показывать группы информационных систем в карте сайта
->showInformationsystemGroups(Core_Page::instance()->libParams['showInformationsystemGroups'])
// Показывать элементы информационных систем в карте сайта
->showInformationsystemItems(Core_Page::instance()->libParams['showInformationsystemItems']);
}
if (Core::moduleIsActive('shop'))
{
$oCore_Sitemap
// Показывать группы магазина в карте сайта
->showShopGroups(Core_Page::instance()->libParams['showShopGroups'])
// Показывать товары магазина в карте сайта
->showShopItems(Core_Page::instance()->libParams['showShopItems'])
// Показывать модификации в карте сайта
->showModifications(Core_Array::get(Core_Page::instance()->libParams, 'showModifications', 1));
}
$oCore_Sitemap
// Раскомментируйте при наличии достаточного объема оперативной памяти
//->limit(10000)
->fillNodes()
->execute();
}
else
{
$Structure_Controller_Show = new Structure_Controller_Show($oSite->showXmlAlias(TRUE));
$Structure_Controller_Show->structure()->queryBuilder()
->where('active', '=', 1)
->where('indexing', '=', 1);
$Structure_Controller_Show
//->parentId(0)
->xsl(
Core_Entity::factory('Xsl')->getByName(Core_Page::instance()->libParams['xsl'])
);
if (Core::moduleIsActive('informationsystem'))
{
$Structure_Controller_Show
// Показывать группы информационных систем в карте сайта
->showInformationsystemGroups(Core_Page::instance()->libParams['showInformationsystemGroups'])
// Показывать элементы информационных систем в карте сайта
->showInformationsystemItems(Core_Page::instance()->libParams['showInformationsystemItems']);
}
if (Core::moduleIsActive('shop'))
{
$Structure_Controller_Show
// Показывать группы магазина в карте сайта
->showShopGroups(Core_Page::instance()->libParams['showShopGroups'])
// Показывать товары магазина в карте сайта
->showShopItems(Core_Page::instance()->libParams['showShopItems']);
}
$Structure_Controller_Show->show();
}
exit();
3. Код Xsl-шаблона "GoogleSiteMap":
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
targetNamespace="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<xsl:output encoding="UTF-8" method="xml" indent="yes" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<xsl:template match="/site">
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<!-- Выбираем узлы в корне, для которых задан url -->
<xsl:apply-templates select="structure[link!='']"/>
</urlset>
</xsl:template>
<xsl:template match="*">
<!-- Приоритет для узла -->
<xsl:param name="priority" select="0.8"/>
<url>
<loc>http://<xsl:value-of select="/site/site_alias[current = 1]/name"/><xsl:value-of select="link"/></loc>
<changefreq>daily</changefreq>
<priority>
<xsl:choose>
<!-- Для главной страницы выводим приоритет 1 -->
<xsl:when test="link='/'">1</xsl:when>
<xsl:otherwise><xsl:value-of select="$priority"/></xsl:otherwise>
</xsl:choose>
</priority>
</url>
<!-- Если НЕ запрещено индексирование дочерних элементов -->
<xsl:if test="not(changefreq) or (6 > changefreq)">
<xsl:apply-templates select="child::*[active=1 and indexing=1 and link!='']">
<!-- Приоритет для дочерних элементов -->
<xsl:with-param name="priority" select="0.5"></xsl:with-param>
</xsl:apply-templates>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
targetNamespace="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<xsl:output encoding="UTF-8" method="xml" indent="yes" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<xsl:template match="/site">
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<!-- Выбираем узлы в корне, для которых задан url -->
<xsl:apply-templates select="structure[link!='']"/>
</urlset>
</xsl:template>
<xsl:template match="*">
<!-- Приоритет для узла -->
<xsl:param name="priority" select="0.8"/>
<url>
<loc>http://<xsl:value-of select="/site/site_alias[current = 1]/name"/><xsl:value-of select="link"/></loc>
<changefreq>daily</changefreq>
<priority>
<xsl:choose>
<!-- Для главной страницы выводим приоритет 1 -->
<xsl:when test="link='/'">1</xsl:when>
<xsl:otherwise><xsl:value-of select="$priority"/></xsl:otherwise>
</xsl:choose>
</priority>
</url>
<!-- Если НЕ запрещено индексирование дочерних элементов -->
<xsl:if test="not(changefreq) or (6 > changefreq)">
<xsl:apply-templates select="child::*[active=1 and indexing=1 and link!='']">
<!-- Приоритет для дочерних элементов -->
<xsl:with-param name="priority" select="0.5"></xsl:with-param>
</xsl:apply-templates>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
4. Теперь для того, что бы не выводить в sitemap дочерние элементы раздела, достаточно просто на вкладке "sitemap" этого раздела в структуре сайта частоту обновления поставить "никогда".
Это своего рода получается "костыль", т.к. мы применяем параметр частоты обновления не по назначению, но другого удобного способа пока не придумал. Да и к тому же, через хуки можно переименовать названия на форме центра администрирования)
Авторизация