Подключение Sitemap.xml

Для формирования sitemap.xml на сайте рекомендованно использовать расширение: “himiklab/yii2-sitemap-module“: версии ~1.2.0.

Для настройки следует выполнить следующие шаги:

  1. Подключить модуль в конфигурационном файле приложения frontend/config/main.php.
    1. 'modules' => [
    2. 'sitemap' => [
    3. 'class' => 'himiklab\sitemap\Sitemap',
    4. 'cacheExpire' => 1,
    5. ],
    6. ]
    А также настроить роутинг добавив пункт в секцию urlManager.rules.
    1. ['pattern' => 'sitemap', 'route' => 'sitemap/default/index', 'suffix' => '.xml'],
  2. Далее необходимо в каждом модуле, вывод данных которого необходимо настроить в sitemap.xml, добавить в конфигурацию подключение AR моделей.
    1. 'modules' => [
    2. 'sitemap' => [
    3. 'models' => [
    4. 'common\modules\content\models\Post',
    5. ],
    6. ],
    7. ]
    На примере модуля “Контент”.
  3. Помимо этого в подключенные модели из предыдущего шага необходимо добавить поведение.

    1. 'sitemap' => [
    2. 'class' => SitemapBehavior::class,
    3. 'scope' => function ($model) {
    4. /** @var PostQuery $model */
    5. $model->select(['url', 'type_id', 'updated_at']);
    6. $model->isPublished()->isActive();
    7. },
    8. 'dataClosure' => function ($model) {
    9. /** @var self $model */
    10. return [
    11. 'loc' => $model->getFullUrl(),
    12. 'lastmod' => $model->updated_at,
    13. 'changefreq' => SitemapBehavior::CHANGEFREQ_DAILY,
    14. 'priority' => $model->sitemap ?: self::DEFAULT_SITEMAP
    15. ];
    16. }
    17. ],

    Не стоит забывать о том, что поле priority стоит хранить в базе данных, если необходима ручная настройка для каждой отдельно записи.

    1. Пример миграции добавления поля для хранения priority:

      1. /**
      2. * {@inheritdoc}
      3. */
      4. public function safeUp()
      5. {
      6. $this->addColumn('{{%content_post}}', 'sitemap', $this->decimal(2, 1)->notNull()->defaultValue(0.8)->after('active')->comment('Приоритет Sitemap'));
      7. }
      8. /**
      9. * {@inheritdoc}
      10. */
      11. public function safeDown()
      12. {
      13. $this->dropColumn('{{%content_post}}', 'sitemap');
      14. }
    2. Также необходимо добавить поле для редактирования этого значения в форме редактирования модели: <?= $form->field($model, 'priority')->textInput(); ?>.
  4. Кроме данных моделей в sitemap.xml также можно добавлять ссылки на статические страницы (например, страница “Контакты”, “О компании”), что достаточно подробно описано в документации самого расширения https://github.com/himiklab/yii2-sitemap-module
    См. ключ конфигурации modules.sitemap.urls.
    1. 'urls'=> [
    2. // your additional urls
    3. [
    4. 'loc' => '/news/index',
    5. 'changefreq' => \himiklab\sitemap\behaviors\SitemapBehavior::CHANGEFREQ_DAILY,
    6. 'priority' => 0.8,
    7. 'news' => [
    8. 'publication' => [
    9. 'name' => 'Example Blog',
    10. 'language' => 'en',
    11. ],
    12. 'access' => 'Subscription',
    13. 'genres' => 'Blog, UserGenerated',
    14. 'publication_date' => 'YYYY-MM-DDThh:mm:ssTZD',
    15. 'title' => 'Example Title',
    16. 'keywords' => 'example, keywords, comma-separated',
    17. 'stock_tickers' => 'NASDAQ:A, NASDAQ:B',
    18. ],
    19. 'images' => [
    20. [
    21. 'loc' => 'http://example.com/image.jpg',
    22. 'caption' => 'This is an example of a caption of an image',
    23. 'geo_location' => 'City, State',
    24. 'title' => 'Example image',
    25. 'license' => 'http://example.com/license',
    26. ],
    27. ],
    28. ],
    29. ],
    Статичные ссылки можно добавлять как через конфигурацию приложения, если они глобальные и относятся к приложению, либо через конфигурацию отдельно взятого модуля, если ссылки локальны внутри модуля, но должны быть доступны в sitemap.xml.