Как сделать sitemap

В этой статье пойдет речь о том, как сделать самообновляющийся файл sitemap.xml (что это).

Более того, речь пойдет о файле сайтмэп для сайтов с огромным количеством страниц (10 000, 100 000). Страницы должны генерироваться из базы данных, вы должны хорошо понимать алгоритм образования страниц на вашем сайте, т.к. в примере приведены фиктивные данные для вывода определенных страниц.

Так как же сделать sitemap для таких сайтов так, чтобы сервер не упал от нагрузки?

Нам потребуется создать 3 файла.

1. Файл sitemap.php
В нем мы высчитываем количество записей, и генерируем ссылки на страницы для других сайтмепов, по 1000 на страницу, чтобы не было нагрузки на сервер. Ессно, нужно прописать свои названия таблиц, свое доменное имя и бд..

<?
header("content-type: text/xml;");

echo '<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
                                  http://www.sitemaps.org/schemas/sitemap/0.9/siteindex.xsd">
';

include 'config.php';
		DEFINE('ITEMS_PER_PAGE', 1000);

$query="SELECT COUNT(*) FROM queries";
$res = mysql_query( $query );
$total = mysql_result( $res, 0, 0 );

$howmuch=ceil($total/ITEMS_PER_PAGE);
for($i=1; $i<=$howmuch; $i++)
{
echo '<sitemap><loc>http://mysomesite.ru/sitemap'.$i.'.xml</loc></sitemap>';
}
?>
</sitemapindex>

Обратите внимание: файл config.php содержит в себе подключение к базе данных, его примерное содержимое

 <?
$host 		= "localhost";
$dbuser 	= "user";
$dbpass 	= "pass";
$db 		= "db";
$link = mysql_connect($host, $dbuser, $dbpass) or die("cannot connect"); 
mysql_select_db($db, $link); 
?>

2. Далее файл sitemap2.php

<?
header("content-type: text/xml;");
include 'config.php';
	// let us generate sitemap!
$data_r.='<?xml version="1.0" encoding="UTF-8" ?> 
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
';
############1 data from pages table
		DEFINE('ITEMS_PER_PAGE', 1000);
$query="SELECT COUNT(*) FROM queries";
$res = mysql_query( $query );
$total = mysql_result( $res, 0, 0 );

if ( isset($_GET['page']) ) {
		  $page = (int)$_GET['page'];
		  if ( $page < 1 ) $page = 1;
		} else {
		  $page = 1;
		}
if ($page==1)
{

  $data_r.='<url><loc>http://mysomesite.ru</loc> 
  <changefreq>always</changefreq> 
  <priority>0.5</priority> 
</url>

';	
}
		// Сколько всего получится страниц
		$cnt_pages = ceil( $total / ITEMS_PER_PAGE );
		if ( $page > $cnt_pages ) $page = $cnt_pages;
		// Начальная позиция
		$start = ( $page - 1 ) * ITEMS_PER_PAGE;

$sm_data=mysql_query("SELECT * FROM  
queries LIMIT ".$start.", ".ITEMS_PER_PAGE);

 while($sm_row=mysql_fetch_array($sm_data))
 {
 $sm_row['query2']=str_replace(" ","+", $sm_row['query']);
	$data_r.= '
<url>
  <loc>http://mysomesite.ru/res.php?q='.$sm_row['query2'].'</loc> 
  <changefreq>never</changefreq> 
  <priority>0.1</priority> 
</url>
';
 }
$data_r.='</urlset>';
$content = $data_r;

echo $content;
?>

3. Если у вас нет файла .htaccess — создайте его, если есть — просто допишите следующее

RewriteEngine On
RewriteRule ^sitemap.xml$ sitemap.php [L]
RewriteRule ^sitemap([^/]*).xml$ sitemap2.php?page=$1 [L]

Если у вас уже есть этот файл, проверьте, была ли в нем строка RewriteEngine On. Если была — не добавляйте ее повторно.

Теперь можно перейти по адресу http://ваш_сайт.ru/sitemap.xml — если все верно сделали, увидите список ссылок на другие файлы сайтмэпа, потипу http://ваш_сайт.ru/sitemap1.xml при переходе на которые и будет выводиться список страниц.