Генерация sitemap на PHP

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>
Понравился пост? Подпишитесь на RSS ленту или Twitter.
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (13 votes, average: 4,31 из 5)
Loading ... Loading ...
Теги: , ,

Похожие записи

13 Комментариев на «Генерация sitemap на PHP»

  • 20 Август, 2010, 17:28

    А как сделать чтобы мой скрипт заходил на мой же сайт и строил карту. Вот мой сайт http://remont-pr0.ru писан на CodeIgniter

    Thumb up 0 Thumb down 1

    Ответить

  • makecode
    20 Август, 2010, 17:49

    Для CodeIgniter существует плагин.

    Thumb up 0 Thumb down 0

    Ответить

  • владимир
    10 Апрель, 2011, 16:52

    не фига не работает пишит:Fatal error: Class ‘primer’ not found in Z:\home\localhost\www\primer.ru\sitemap.php on line 4
    я новичок в этом деле но очень надо сделать!!!!

    Thumb up 0 Thumb down 2

    Ответить

  • makecode
    10 Апрель, 2011, 19:46

    Компилятор не может найти класс primer в файле sitemap.php, смотрите 4 строчку.

    Thumb up 0 Thumb down 0

    Ответить

  • 11 Апрель, 2011, 13:19

    извени!!!написано супер!неподскажеш как сделать скрытую переадресацию с sitemap.xml на sitemap.php

    Thumb up 0 Thumb down 2

    Ответить

    makecode Ответил:

    В .htaccess

    RewriteRule ^sitemap.xml $ /sitemap.php

    Thumb up 0 Thumb down 0

    Ответить

    владимир Ответил:

    спасибо

    Thumb up 0 Thumb down 2

    Ответить

    makecode Ответил:

    Только после xml пробела не должно быть, т.е. вот так

    RewriteRule ^sitemap.xml$ /sitemap.php

    Thumb up 1 Thumb down 1

    Ответить

    владимир Ответил:

    извени!!!класс db он тоже не может найти???что исправить то надо???

    Thumb up 0 Thumb down 1

    Ответить

    владимир Ответил:

    всё я исправил!извени за беспокойство!
    не знаеш как сделать что бы sitemap.xml не было на сервере???

    Thumb up 0 Thumb down 2

    Ответить

    makecode Ответил:

    Почитайте документацию и примеры по PHP DOMDocument, вопросы сразу отпадут.

    echo $xml->saveXML():

    Thumb up 2 Thumb down 1

    Ответить

  • 12 Апрель, 2011, 13:31

    Hidden due to low comment rating. Click here to see.

    Poorly-rated. Like or Dislike: Thumb up 0 Thumb down 4

    Ответить

    саша Ответил:

    echo $xml->saveXML():

    Thumb up 1 Thumb down 0

    Ответить

Оставить комментарий