Sitemap - это специальный файл сайта, содержащий в себе информацию о новых страницах сайта (или вообще всех). Нужен для того, чтобы сообщить поисковым системам какие страницы нужно индексировать. Какие чаще, а какие реже. Sitemap обычно генерируют скриптами или создают сами, после чего добавляют в панели вебмастера поисковых систем о ее наличии.

Sitemap создают в формате XML, подробнее о протоколе sitemap можно почитать на сайте sitemaps.org.

Если у Вас сайт работает на какой-либо популярной CMS, то плагин для генерации sitemap можно найти в сети. Мы же рассмотрим вариант создания своего генератора sitemap на обычном самописном сайте.

И так, раз это формат XML то сразу предлагаю использовать DomDocument, который был введен в PHP начиная с версии 4.30. Почему? Потому что использовать его проще простого, логичнее и в будущем можно избавиться от кучи проблем.

Также сразу скажу, что карту мы будем генерировать в файл, а не отдавать скриптом. Т.к. если мы будем карту отдавать скриптом, то скрипт будет каждый раз обращаться к базе что повлияет на нагрузку сервера. Если ее запросят один раз - ничего страшного, а если будут запрашивать постоянно то вероятнее всего повесят сервер - такая вероятность велика когда генерируется мегабольшой файл sitemap.xml. Если у вас получается очень большая карта сайта, то лучше сделать постраничный вывод.

Также предположим, что мы генерируем список последних постов вашего блога. Нам нужно кроме того, что составить правильный xml файл еще и отдать параметры постов, такие как время/дату создания, URL, приоритет, частоту обновления.

Ну и собственно сам код.

<?php
// Подключаемся к базе данных
global $db;
$db=new db();
$db->MySqlConnect($host, $user, $password, $base);
//Нужно для даты
define('DATE_FORMAT_RFC822','r');
// Создаем документ
$xml = new DomDocument('1.0','utf-8');

//Заголовки
$urlset = $xml->appendChild($xml->createElement('urlset'));
$urlset->setAttribute('xmlns:xsi','http://www.w3.org/2001/XMLSchema-instance');
$urlset->setAttribute('xsi:schemaLocation','http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd');
$urlset->setAttribute('xmlns','http://www.sitemaps.org/schemas/sitemap/0.9');
$db->result=$db->QueryDB("SELECT id,user_login, time FROM blog ORDER BY `id` DESC");
if (mysql_num_rows($db->result)>=1) {//2
while($row=mysql_fetch_array($db->result)) {

// Вы можете сконвертировать свою дату в нужный формат DATE_FORMAT_RFC822
$lastmod_value = date(DATE_FORMAT_RFC822, $data['time']);;

$url = $urlset->appendChild($xml->createElement('url'));
$loc = $url->appendChild($xml->createElement('loc'));
$lastmod = $url->appendChild($xml->createElement('lastmod'));
$changefreq = $url->appendChild($xml->createElement('changefreq'));
$priority = $url->appendChild($xml->createElement('priority'));
$loc->appendChild($xml->createTextNode('http://ваш_урл.ру/post/'.$row['user_login'].'/'.$row['id'].'/'));
$lastmod->appendChild($xml->createTextNode($lastmod_value));
$changefreq->appendChild($xml->createTextNode('monthly'));
//Укажем средний приоритет
$priority->appendChild($xml->createTextNode('0.5'));
}

}

$xml->formatOutput = true;
//Записываем файл
$xml->save('sitemap.xml');
?>

На выходе получим вот что:

<?xml version="1.0" encoding="utf-8"?>
<urlset 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/sitemap.xsd">
  <url>
    <loc>http://ваш_урл.ру/post/ваш_логин/2308/</loc>
    <lastmod>Wed, 04 Aug 2010 00:00:06 +0400</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
  </url>

  <url>
    <loc>http://ваш_урл.ру/post/ваш_логин/2307/</loc>
    <lastmod>Wed, 04 Aug 2010 00:00:06 +0400</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
  </url>
  <url>

  <loc>http://ваш_урл.ру/post/ваш_логин/2306/</loc>
    <lastmod>Wed, 04 Aug 2010 00:00:06 +0400</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
  </url>
...
</urlset>
(Visited 1 086 times, 1 visits today)