Полное описание протокола – http://www.sitemaps.org/ru/protocol.html
Требования к файлу
- Файл может содержать до 50 000 URL.
- Размер не более 10 Мб.
- Кодировка файла должна быть в UTF-8.
- Кириллические домены записываются в виде
http://xn--80aswg.xn--p1ai/
- Символы в URL (
&
'
"
<
>
) должны быть заменены на мнемоники (&
'
"
>
<
).
Предполагается что в таблице стаей есть даты публикации и последнего изменения
(`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();
Вариант на 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();
Результат:
<?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>
Например данный скрипт лежит в корне сайта с именем sitemap.php, вы хотите чтобы он открывался по адресу https://example.com/sitemap.xml
. В файле .htaccess нужно добавить запись:
Если скрипт сделан модулем CMS:
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/sitemap.xml
RewriteRule (.*) /index.php?module=sitemap [L,QSA]
Чтобы поисковые системы знали где расположен файл карты сайта нужно добавить директиву Sitemap
в robots.txt:
Что бы разбить на два файла sitemap.xml