Для того чтобы помочь поисковому роботу найти все страницы, создают так называемые sitemaps. Файл Sitemap представляет собой XML-файл, в котором перечислены URL-адреса веб-сайта в сочетании с метаданными, связанными с каждым URL-адресом (дата его последнего изменения; частота изменений; его приоритетность на уровне сайта), чтобы поисковые системы могли более грамотно сканировать этот сайт.
Для создания sitemap.xml нам понадобятся три файла
Данные классы лучше сохранить в web/lib/<Project>.Site/Sitemap/
. Они описывают спецификацию sitemap.xml в базовом виде, без поддержки sitemapindex и расширения url. Классы требуют доработки, но уже они покрывают 90% необходимой функциональности.
Задача: сделать http://panda/sitemap.xml в проекте Panda.Trunk.
Для начала скопируем полученные три файла в Panda.Site/Sitemap
. Далее, добавим запись о странице /sitemap.xml
, затем описание GetXmlSitemap в lib/Panda.Site/Panda.Site.xml
и сам action в lib/Panda.Site/actions/GetXmlSitemap.php
.
В pages.xml нам нужен только url и action без шаблона.
<page uri="/sitemap.xml"> <actions>Panda.Site.GetXmlSitemap</actions> </page>
Бывают такие страницы, на которых нет ссылок в базе данных, например главная страница списка новостей /news/
, или просто главная страница /
. Модуль умеет обрабатывать такие ситуации.
В pages.xml есть для этого три атрибута для page и pageGroup:
Атрибут | Значения | По умолчанию | Описание |
sitemap-use | true,false | false | Включает или исключает обработку url в группе или странице |
sitemap-priority | от 0.1 до 1 | Приоритет | |
sitemap-changefreq | always,hourly,daily,weekly,monthly,yearly,never | Частота изменения |
Тогда для того, чтобы все заработало правильно, укажите у группы fe sitemap-use=«true»
, у страниц в ней с regexp - sitemap-use=«false»
. Пример с со списком новостей
<page uri="/news/" sitemap-priority="0.8" sitemap-changefreq="weekly"> <actions>Panda.Site.GetNewsList</actions> <template>tmpl://fe/news/index.tmpl.php</template> </page>
Т.к. GetXmlSitemap.php лежит сразу в папке actions, то можно использовать сокращенную запись
<action name="GetXmlSitemap" />
<?php Package::Load( 'Panda.Site/Sitemap' ); /** * Get Xml Sitemap */ class GetXmlSitemap { /** @var SitemapUrl[] */ private $urls; /** @var StaticPage[] */ private $pages; /** @var News[] */ private $news; /** * Get Data */ private function getData() { $this->pages = StaticPageFactory::Get( array(), array( BaseFactory::WithoutPages => true , BaseFactory::WithColumns => ' "staticPageId", "url" ' ) ); $this->news = NewsFactory::Get( array( 'endDate' => DateTimeWrapper::Now() ), array( BaseFactory::WithoutPages => true , BaseFactory::WithColumns => ' "newsId", "publicationDate" ' ) ); } /** * Add Sitemap Urls from Data */ private function addUrls() { // Add new static pages foreach( $this->pages as $page ) { if ( empty( $this->urls[$page->url] ) ) { $su = new SitemapUrl( $page->url, 0.6 ); $this->urls[$su->Url] = $su; } } // Add news foreach( $this->news as $news ) { $su = new SitemapUrl( '/news/' . $news->newsId . '/', 0.6, $news->publicationDate ); $this->urls[$su->Url] = $su; } } /** * Flush Sitemap.xml */ private function flush() { $w = new SitemapWriter(); $w->SetUrls( $this->urls ); $w->Flush(); } /** * Execute GetSitemap */ public function Execute() { $this->urls = SitemapUtility::GetUrlsFromPagesXml(); $this->getData(); $this->addUrls(); $this->flush(); } } ?>
SitemapUtility::GetUrlsFromPagesXml()
адреса из pages.xml в виде массива объектов SitemapUrl, где ключ массива - url.После этих действий по адресу http://panda/sitemap.xml отобразится sitemap.
Не забудьте после публикации сайта рассказать роботам о том, что у вас есть sitemap.xml. Один из вариантов - добавить соответствующую запись в robots.txt. Пример файла:
User-Agent: * Allow: / Sitemap: http://panda.ru/sitemap.xml Host: panda.ru