====== Создание Sitemap.xml ====== Для того чтобы помочь поисковому роботу найти все страницы, создают так называемые [[http://www.sitemaps.org/|sitemaps]]. Файл Sitemap представляет собой XML-файл, в котором перечислены URL-адреса веб-сайта в сочетании с метаданными, связанными с каждым URL-адресом (дата его последнего изменения; частота изменений; его приоритетность на уровне сайта), чтобы поисковые системы могли более грамотно сканировать этот сайт. Для создания sitemap.xml нам понадобятся три файла * {{:eaze:samples:sitemapurl.phps|SitemapUrl.php}} - описание URL-адреса * {{:eaze:samples:sitemaputility.phps|SitemapUtility.php}} - работа с URL-адресами из pages.xml * {{:eaze:samples:sitemapwriter.phps|SitemapWriter.php}} - рендеринг xml Данные классы лучше сохранить в ''web/lib/.Site/Sitemap/''. Они описывают [[http://www.sitemaps.org/protocol.html|спецификацию sitemap.xml]] в базовом виде, без поддержки [[http://www.sitemaps.org/protocol.html#index|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 ==== В pages.xml нам нужен только url и action без шаблона. Panda.Site.GetXmlSitemap Бывают такие страницы, на которых нет ссылок в базе данных, например главная страница списка новостей ''/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"''. Пример с со списком новостей Panda.Site.GetNewsList ==== Panda.Site.xml ==== Т.к. GetXmlSitemap.php лежит сразу в папке actions, то можно использовать сокращенную запись ==== GetXmlSitemap.php ==== 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(); } } ?> * В данном примере выбираются сразу все объекты, но только с необходимыми полями (в текущем варианте - шаблон на PostgreSQL) * ''SitemapUtility::GetUrlsFromPagesXml()'' адреса из pages.xml в виде массива объектов SitemapUrl, где ключ массива - url. После этих действий по адресу http://panda/sitemap.xml отобразится sitemap. ==== robots.txt ==== Не забудьте после публикации сайта рассказать роботам о том, что у вас есть sitemap.xml. Один из вариантов - добавить соответствующую запись в [[http://help.yandex.ru/webmaster/?id=996567|robots.txt]]. Пример файла: User-Agent: * Allow: / Sitemap: http://panda.ru/sitemap.xml Host: panda.ru * Директива Host служит для того, чтобы указать основной домен (актуально для www или без него www). Подробнее на сайте [[http://help.yandex.ru/webmaster/?id=996567#996574|Яндекс.Вебмастер]].