Исключение из sitemap.xml страниц с определенным типом — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
(Новая страница: « category:Вопросы и уроки разработки сайтов на UMI.CMS '''Задача:''' Исключить из выдачи по запрос…»)
(нет различий)

Версия 18:44, 17 сентября 2013


Задача: Исключить из выдачи по запросу 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/