Sitemap представляет собой xml-файл, содержащий информацию о страницах веб-сайта, которые подлежат индексации в поисковых системах.
Наличие такого файла на сайте помогает поисковикам индексировать сайт, определять местонахождение страниц сайта, время их последнего обновления, частоту обновления и важность относительно других страниц.
Сканеры обычно находят страницы по ссылкам, указанным на сканируемом сайте и на других сайтах. Эта информация, дополненная данными из файлов Sitemap, позволяет сканерам, поддерживающим протокол Sitemap, найти все URL в файле Sitemap и собрать информацию об этих URL с помощью связанных метаданных.
Если Нодус установлен
В Нодусе реализован набор методов для автоматической сборки адресов и формирования xml-файла. Т.е. достаточно установить и подключить компонент SitemapXML. После этого в материалах появится чекбокс «Включать в sitemap.xml: » (по умолчанию будет установлен) на вкладке « Доп. параметры», а в админке появится пункт меню SitemapXML, который позволяет сгенерировать или пересобрать файл sitemap.xml.
Если у сайта несколько языковых версий, то для каждой версии будет формироваться свой файл. Например для русской версии xml-файл будет доступен по адресу: http://host.ru/sitemap_ru.xml.
Если Нодус не установлен
Для формирования карты сайта компонент SitemapXML собирает адреса всех отмеченных страниц. Каждый компонент должен предоставить информацию о своих страницах, доступных для сканирования. Для этого необходимо для компонента описать метод, который будет возвращать массив всех страниц.
Например, для компонента Component_Pages в одноименный класс добавим метод add_urls(), котрый будет возвращать адреса всех страниц.
// app/components/Pages.php public static function add_urls() { $urls = array(); foreach (DB_SQL::db()->pages->select->columns('id')->where('isactive=1')->run() as $page) { $page = Component_Pages_Entity::load($page->id); $urls[] = array( 'loc' => $page->full_url(), 'priority' => $page->parms['priority'], 'changefreq' => $page->parms['changefreq'], 'lastmod' => $page->parms['lastmod'], ); } return $urls; }
В методе создается массив, элементами которого являются узлы (url) в терминах протокола Sitemap. Узел представлен в виде массива формата «атрибут => значение атрибута».
Необходимо обязательно указывать атрибут loc (URL-адрес страницы), и если кроме него нет других атрибутов, можно использовать короткую запись:
$urls[] = $page->full_url();
Атрибут lastmod можно передавать в формате W3C Datetime или в unix timestamp.
Если какой-то из переданных параметров указан некорректно, то он будет проигнорирован.
Далее необходимо зарегистрировать компонент в методе initialize().
// app/components/Pages.php public static function initialize($config=array()) { //... CMS::add_command('sitemap', 'add_urls', array('Component_Pages', 'add_urls'), 'pages'); //... }
где:
- sitemap, add_urls - первые 2 параметра неизменны.
- array('Component_Pages', 'add_urls') - callback функция,
- pages - уникальный для каждого компонента идентификатор, используемый для обновления информации по данному компоненту.
- site - необязательный параметр сайт.
Последним шагом необходимо обновить данные при изменении страниц, переопределив метод on_after_change админского контроллера:
// app/components/Pages/AdminController.php protected function on_after_change() { CMS::objects()->sitemap->update('pages'); parent::on_after_change(); }
Методу update() передается идентификатор компонента, указанный при инициализации в методе add_command().
Если сайтов несколько
В этом случае при регистрации компонента передается еще один параметр, являющийся кодом сайта:
// app/components/Pages.php public static function initialize($config=array()) { //... CMS::add_command('sitemap', 'add_urls', array('Component_Pages', 'add_urls'), 'pages', 'site_1'); CMS::add_command('sitemap', 'add_urls', array('Component_Pages', 'add_urls'), 'pages', 'site_2'); //... CMS::add_command('sitemap', 'add_urls', array('Component_Pages', 'add_urls'), 'pages', 'site_n'); //... }
Каждый метод опредеяет callback-функцию, возвращающую список адресов для конкретного сайта.
Соответственно метод add_urls($site) потребует некоторой доработки с учетом сайта.
// app/components/Pages.php public static function add_urls($site) { $urls = array(); foreach (DB_SQL::db()->pages->select->columns('id')->where('isactive=1', 'site=:site')->run($site) as $page) { $urls[] = Component_Pages_Entity::load($page->id)->full_url(); } return $urls; }
Сборка sitemap из командной строки. Периодическое обновление
Запустить сборку sitemap.xml можно из командной строки спомощью команды build_sitemap:
/usr/bin/php index.php build_sitemap
Для периодического обновления sitemap.xml нужно добавить в cron выполнение команды build_sitemap. Пример для обновления каждый день в час ночи:
0 1 * * * cd /путь/www/; /usr/bin/php index.php build_sitemap
Обратите внимание, что для правильной сборки sitemap.xml из командной строки нужно указать хост сайта (без протокола) в настройках /config/site.php:
$this ... ->host('www.example.com') ... ;