ИС и Sitemap

#
ИС и Sitemap
На сайте есть ИС, для элементов которых существуют отдельные страницы (к примеру, "Новости", а есть ИС, элементы которых выводятся на главной странице ИС, и для них нет отдельных страниц (к примеру, "Отзывы".
В настройках узла структуры для этих ИС не указан "XSL шаблон для отображения элемента информационной системы".
Но в sitemap попадают элементы всех ИС.

Отсюда вопрос: Можно ли сделать сделать так, что бы только для некоторых информационных систем их элементы попадали в sitemap?
Т.е. элементы ИС "Новости" должны попадать в sitemap, а элементы ИС "Отзывы" - нет!

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

p.s. вижу 2 направления решения проблемы:
а) отталкиваться от того, установлен ли "XSL шаблон для отображения элемента информационной системы"
б) где-то делать проверку по id ИС.
#
Re: ИС и Sitemap
Пока нашел такой способ решения:
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 ИС, элементы которой надо исключить из индексации.

Остается найти более эффективный способ: Проверять, установлен ли шаблон для вывода элементов, или нет.
#
Re: ИС и 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);


Вот полный код:
<?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();


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>


4. Теперь для того, что бы не выводить в sitemap дочерние элементы раздела, достаточно просто на вкладке "sitemap" этого раздела в структуре сайта частоту обновления поставить "никогда".

Это своего рода получается "костыль", т.к. мы применяем параметр частоты обновления не по назначению, но другого удобного способа пока не придумал. Да и к тому же, через хуки можно переименовать названия на форме центра администрирования)
Авторизация