Исключение из sitemap.xml страниц с определенным типом
Задача: Исключить из выдачи по запросу http://domain.ru/sitemap.xml данные о страницах с определенным типом.
Реализация: В стандартном файле .htaccess имеются строки:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^sitemap\.xml$ sitemap.php [L]
При запросе http://domain.ru/sitemap.xml выполняетcя системный скрипт sitemap.php, который осуществляет вывод данных.
Изменим имя скрипта, который осуществляет вывод данных на свой. Для этого заменим данные строки на следующие:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^sitemap\.xml$ sitemap_xml.php [L]
В корневую директорию системы добавим файл sitemap_xml.php со следующим содержанием:
<?php
header("Content-type: text/xml");
if (ob_get_level() > 0) {
ob_clean();
}
define("CURRENT_WORKING_DIR", str_replace("\\", "/", $dirname = dirname(__FILE__)));
require CURRENT_WORKING_DIR . '/libs/config.php';
echo '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
$cmsController = cmsController::getInstance();
$domainId = $cmsController->getCurrentDomain()->getId();
$dirName = CURRENT_WORKING_DIR . "/sys-temp/sitemap/{$domainId}/";
$dir = dir($dirName);
while (false !== ($file = $dir->read())) {
if (is_file($dirName . $file))
if (!checkPage('catalog','object',$dirName . $file))
readfile($dirName . $file);
}
$dir->close();
echo '</urlset>';
function checkPage($module, $method, $file_path){
if (!$module || !$method)
return false;
$hierarchy = umiHierarchy::getInstance();
$xml = new XMLReader();
$xml->open($file_path, 'UTF-8');
$xml->read();
$xml->read();
$url = $xml->readString();
$domain = cmsController::getInstance()->getCurrentDomain()->getHost();
$addr = substr(strstr($url, $domain), strlen($domain));
$element_id = $hierarchy->getIdByPath($addr);
$element = $hierarchy->getElement($element_id);
if (!($element instanceof iUmiHierarchyElement))
return false;
$type_id = $element->getTypeId();
$type = umiHierarchyTypesCollection::getInstance()->getType($type_id);
$mod = $type->getName();
$meth = $type->getExt();
if ($mod == $module && $meth == $method)
return true;
}
?>
Мы добавили функцию checkPage(). Данная функция принимает следующие параметры:
- $module - название модуля, отвечающего за базовый тип (например, 'catalog', 'photoalbum')
- $method - название метода, отвечающего за базовый тип (например, 'object', 'photo')
- $file_path - путь до xml файла
Функцию checkPage() возвращает true в случае, если тип страницы соответствует типу с модулем и методом, переданным в первом и втором параметрах соответственно. Список базовых типов можно посмотреть в настройках модуля "Шаблоны данных" http://domain.ru/admin/data/config/