Формирование файла sitemap.xml

Полное описание протокола – http://www.sitemaps.org/ru/protocol.html

Требования к файлу

  • Файл может содержать до 50 000 URL.
  • Размер не более 10 Мб.
  • Кодировка файла должна быть в UTF-8.
  • Кириллические домены записываются в виде http://xn--80aswg.xn--p1ai/
  • Символы в URL (& ' " < >) должны быть заменены на мнемоники (&amp; &apos; &quot; &gt; &lt;).
1

Предполагается что в таблице стаей есть даты публикации и последнего изменения
(`date_add` и `date_edit`).

// Подключение к БД.
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'ЛОГИН', 'ПАРОЛЬ');

$out = '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';

// Получение статей из БД.
$sth = $dbh->prepare("SELECT * FROM `articles`");
$sth->execute();
$articles = $sth->fetchAll(PDO::FETCH_ASSOC);

foreach ($articles as $row) {
	// Дата изменения статьи.
	$date = max(array($row['date_add'], $row['date_edit']));

	$out .= '
	<url>
		<loc>https://example.com/articles/' . $row['id'] . '.html</loc>
		<lastmod>' . date('Y-m-d', $date) . '</lastmod>
		<priority>' . ((($date + 604800) > time()) ? '1' : '0.5') . '</priority>
	</url>';
}

$out .= '</urlset>';
		
header('Content-Type: text/xml; charset=utf-8');
echo $out;
exit();
PHP

Вариант на DOMDocument

// Подключение к БД.
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');

$dom = new DOMDocument('1.0', 'utf-8');
$urlset = $dom->createElement('urlset');
$urlset->setAttribute('xmlns','http://www.sitemaps.org/schemas/sitemap/0.9');

// Получение статей из БД.
$sth = $dbh->prepare("SELECT * FROM `articles`");
$sth->execute();
$articles = $sth->fetchAll(PDO::FETCH_ASSOC);

foreach($articles as $row) {
	// Дата изменения статьи.
	$date = max(array($row['date_add'], $row['date_edit']));

	$url = $dom->createElement('url');

	// Элемент <loc> - URL статьи.
	$loc = $dom->createElement('loc');
	$text = $dom->createTextNode(
		htmlentities('https://example.com/articles/' . $row['id'] . '.html', ENT_QUOTES)
	);
	$loc->appendChild($text);
	$url->appendChild($loc);

	// Элемент <lastmod> - дата последнего изменения статьи.
	$lastmod = $dom->createElement('lastmod');
	$text = $dom->createTextNode(date('Y-m-d', $date));
	$lastmod->appendChild($text);
	$url->appendChild($lastmod);

	// Элемент <priority> - приоритетность (от 0 до 1.0, по умолчанию 0.5).
	// Если дата публикации/изменения статьи была меньше недели назад ставим приоритет 1.
	$priority = $dom->createElement('priority');
	$text = $dom->createTextNode((($date + 604800) > time()) ? '1' : '0.5');
	$priority->appendChild($text);
	$url->appendChild($priority);

	$urlset->appendChild($url);
}

$dom->appendChild($urlset);

// Сохранение в файл.
$dom->save(__DIR__ . '/sitemap.xml');

// Или отправка в браузер.
header('Content-Type: text/xml');
echo $dom->saveXML();
exit();
PHP

Результат:

<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
	<url>
		<loc>https://example.com/articles/16.html</loc>
		<lastmod>2016-11-19</lastmod>
		<priority>1</priority>
	</url>
	<url>
		<loc>https://example.com/articles/3.html</loc>
		<lastmod>2016-11-08</lastmod>
		<priority>0.5</priority>
	</url>
</urlset>
2

Например данный скрипт лежит в корне сайта с именем sitemap.php, вы хотите чтобы он открывался по адресу https://example.com/sitemap.xml. В файле .htaccess нужно добавить запись:

RewriteEngine On
RewriteRule ^sitemap.xml$ sitemap.php [L,QSA]
htaccess

Если скрипт сделан модулем CMS:

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/sitemap.xml
RewriteRule (.*) /index.php?module=sitemap [L,QSA]
htaccess
3

Чтобы поисковые системы знали где расположен файл карты сайта нужно добавить директиву Sitemap в robots.txt:

User-agent: *
Sitemap: https://example.com/sitemap.xml
TEXT
19.11.2016, обновлено 22.02.2022
25598
Следующая запись Сохранить файл в UTF-8 без BOM

Комментарии 2

Евгений Клименко Евгений Клименко
18 февраля 2022 в 14:04
Добрый день, подскажите как сделать если больше 50.000 ссылок?
Что бы разбить на два файла sitemap.xml
Алек Садлер Алек Садлер
22 февраля 2022 в 16:38
Ошибка в первом примере, перебираем не $data а $articles

, чтобы добавить комментарий.

Другие публикации

Рекомендации по SEO настройке сайта
Сборник рекомендаций по настройке сайта помогающий исключить проблемы при индексировании поисковыми системами.
9895
+4
Определение поисковых роботов
PHP функция определяет является посетитель ботом по User-Agent.
11006
+7
Чтение XML файла Яндекс Маркета в PHP
Если требуется сделать импорт или обновление товаров по XML файлу Яндекс Маркета, можно применить расширении PHP...
15180
+5
RSS-файл для Яндекс Турбо-страниц
Турбо-страницы позволяют пользователям посмотреть легкую версию сайта, которая загружается быстрее в десятки раз, а...
23938
+7
Генерация sitimap.xml c помощью Xenu's
Если требуется быстро сделать файл карты сайта, поможет программа «Xenu». Также она выявит битые ссылки и недоступные...
5146
0
RSS канал на PHP
Пример генерации фида RSS 2.0 на PHP, полную спецификацию можно посмотреть на https://validator.w3.org/feed/docs/rss2.html
7053
+2