Создание карты сайта на фреймвоке Yii2
SiteMap — это карта Вашего сайта для поисковых систем (Яндекс, Гугл) в формате XML. Формат sitemap.xml указан тут. Сегодня разберём как реализовать его на php-фреймворке Yii2.
Долго думая как реализовать данную задачу, бывали моменты когда думал о написание универсального парсера на Python. Но это долго и нет в этом острой необходимости.
В начале создал метод в классе SiteController (вы можете выбрать свой) и назвал его actionSitemap. Почему было выбрано такое имя метода вы можете почитать тут.
В нём обратился к базе данных и выбрал все товарные позиции, в моём проекте достаточно и этого. Далее прошёлся циклом и с помощью docDocument создал Xml-файл.
Отрисовывать карту сайта будем следующим кодом:
// инициализируем новый dom объект
$xml = new domDocument();
//создаём тег urlset
$urlset = $xml->createElement('urlset');
//добавляем атрибут xmlns, как указан на яндексе
//и указываем его значение
$xmlns = $xml->createAttribute('xmlns');
$xmlns->value = "http://www.sitemaps.org/schemas/sitemap/0.9";
//добавляем атрибут в тег urlset
$urlset->appendChild($xmlns);
//цикл, в котором обходим, полученный массив с продуктами
foreach ($products as $product)
//внутри urlset создаём теги url для каждого товара
$url = $urlset->appendChild($xml->createElement('url'));
//тег loc внутри url, тут будет URL товара
$loc = $url->appendChild($xml->createElement('loc'));
//с помощью класса Url и метода to получаем url товара
//и добавляем внутри тега loc
$loc->appendChild($xml->createTextNode(Url::to(['product/index', 'category' => $product->parent->url,
'url' => $product->url], true)));
//тег даты последнего изменения товара и сама дата
$lastmod = $url->appendChild($xml->createElement('lastmod'));
$lastmod->appendChild($xml->createTextNode($product->date));
//добавляем тег приоритета для поисковиков
$priority = $url->appendChild($xml->createElement('priority'));
//указываем для каждого товара приоритет — 1
$priority->appendChild($xml->createTextNode('1'));
}
//После цикла мы в общий объект «кладём» urlset.
$xml->appendChild($urlset);
//и записываем в переменную это всё
$sm = $xml->saveXML();
//передача в шаблон
return $this->renderPartial('sitemap', ['sm' => $sm]);
Теперь в шаблоне views/site/sitemap.php выводим отрисованную карту сайта:
echo $sm;
Исходник контроллера https://pastebin.com/CNyHPyEn
Заглавное фото с сайта seotoolnetwork.com
Данный пост о разработке на Yii2 подготовлен автором @zheev.