Рано и поздно публичный web сайт необходимо подстраивать для роботов поисковых систем для ускорения индексации поисковой выдачи в результате чего получать посетителей из поискового трафика. Фреймворк Yii2 из коробки не имеет встроенного готового расширения т.к. необходимо знать структуру предоставляемых разделов публичной части которые должны отображаться в файле sitemap.xml и остальные задачи исполняемого генератора.
В данном примере опишу самый простой пример генератора файла xml для статичной информационной части сайта и динамически изменяющихся страниц, состоящий из исполняемого контроллера и файла просмотра.
Controller
Поскольку пример показан в Фреймворк Yii2 Advanced необходимо учитывать пространства имен системы.
Создадим файл SitemapController.php в папке frontend\controllers
<?php
namespace frontend\controllers;
use Yii;
use yii\web\Controller;
use yii\web\Response;
use common\models\Blog; // модель хранящая динамический контент
class SitemapController extends Controller {
}
Расширим наш контроллер действием index:
public function actionIndex() {
$arr = array();
$posts = Blog::find()->where(['status_id' => 1])->all(); // Опрашиваем модель Blog все ее записи со статусом 1 (включено)
foreach ($posts as $post) {
$arr[] = array(
'loc' => '/' . $post->seo_url, // Ссылка
'lastmod' => date(DATE_W3C, $post->updated_at), // Дата
'priority' => '0.50', // Приоритет
);
}
// Отправляем данные на отображение без шаблона
$xml_array = $this->renderPartial('index', array(
'host' => Yii::$app->request->hostInfo, // Имя хоста
'urls' => $arr, // Полученный массив
));
Yii::$app->response->format = Response::FORMAT_RAW;
$headers = Yii::$app->response->headers;
$headers->add('Content-Type', 'text/xml'); // Устанавливаем заголовок страницы
return $xml_array;
}
Для небольшого Web сайта этой функциональности вполне достаточно но если на сайт будет часто добавляться новый контент необходимо снизить нагрузку по запросам в базу данных. Для этого нужно кешировать запросы.
View
Далее необходимо создать файл view.php в папке frontend\views\sitemap
<?php
echo '<?xml version="1.0" encoding="UTF-8"?>';
?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc><?= $host . '/'; ?></loc>
<lastmod><?= date(DATE_W3C); ?></lastmod>
<priority>1.00</priority>
</url>
<?php foreach ($urls as $url) { ?>
<url>
<loc><?= $host . $url['loc']; ?></loc>
<?php if (isset($url['lastmod'])) { ?>
<lastmod><?= $url['lastmod']; ?></lastmod>
<?php } ?>
<priority><?= $url['priority']; ?></priority>
</url>
<?php } ?>
</urlset>
После можно попробовать вывести ваш xml файл на экран сслыкой http://ваш-сайт/index.php?r=sitemap/index
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://ваш-сайт/</loc>
<lastmod>2020-09-29T16:40:57+03:00</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>http://ваш-сайт/post_1</loc>
<lastmod>2020-09-29T17:06:39+03:00</lastmod>
<priority>0.50</priority>
</url>
<url>
<loc>http://ваш-сайт/post_2</loc>
<lastmod>2020-09-29T22:23:15+03:00</lastmod>
<priority>0.50</priority>
</url>
</urlset>
Comments (0)