Инструменты пользователя

Инструменты сайта


eaze:samples:создание_sitemap_xml

Это старая версия документа.


Создание Sitemap.xml

Для того чтобы помочь поисковому роботу найти все страницы, создают так называемые 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

В pages.xml нам нужен только url и action без шаблона.

<page uri="/sitemap.xml">
    <actions>Panda.Site.GetXmlSitemap</actions>
</page>

Бывают такие страницы, на которых нет ссылок в базе данных, например главная страница списка новостей /news/, или просто главная страница /. Модуль умеет обрабатывать такие ситуации. В pages.xml есть для этого три атрибута для page и pageGroup:

АтрибутЗначенияПо умолчаниюОписание
sitemap-usetrue,falsefalseВключает или исключает обработку url в группе или странице
sitemap-priorityот 0.1 до 1 Приоритет
sitemap-changefreqalways,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>10K.Site.GetNewsList</actions>
    <template>tmpl://fe/news/index.tmpl.php</template>
</page>

Panda.Site.xml

Т.к. GetXmlSitemap.php лежит сразу в папке actions, то можно использовать сокращенную запись

<action name="GetXmlSitemap" />

GetXmlSitemap.php

<?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();
        }
    }
?>
  • В данном примере выбираются сразу все объекты, но только с необходимыми полями (в текущем варианте - шаблон на PostgreSQL)
  • SitemapUtility::GetUrlsFromPagesXml() адреса из pages.xml в виде массива объектов SitemapUrl, где ключ массива - url.

После этих действий по адресу http://panda/sitemap.xml отобразится sitemap.

robots.txt

Не забудьте после публикации сайта рассказать роботам о том, что у вас есть sitemap.xml. Один из вариантов - добавить соответствующую запись в robots.txt. Пример файла:

User-Agent: *
Allow: /
Sitemap: http://panda.ru/sitemap.xml
Host: panda.ru
  • Директива Host служит для того, чтобы указать основной домен (актуально для www или без него www). Подробнее на сайте Яндекс.Вебмастер.
eaze/samples/создание_sitemap_xml.1320914577.txt.gz · Последние изменения: 2011/11/10 12:42 — sergeyfast