Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
vp-webdev
7 лет назад

Создание карты сайта на фреймвоке 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.

38
161.353 GOLOS
На Golos с August 2017
Комментарии (1)
Сортировать по:
Сначала старые