Компонент SitemapXML: карта сайта

Компонент: SitemapXML: Карта сайта

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')
...
;

Метки: seo, sitemap
29.04.2015
Все статьи