Многие разработчики, не понимая простоту создания карты сайта, прибегают к установке дополнительных библиотек. Но, я приверженец минимума зависимостей от сторонних библиотек. Особенно если в этом нет нужды.
Горький опыт поддержания проектов с умершими зависимостями, при обновлениях сайта. Да, можно клонировать проект и развивать самому. Но в бизнес-задачах всегда вопрос цены стоит особняком. Если вас не парит что будет с проектом в дальнейшем, вы можете воспользоваться и таким вариантом. Но я люблю почти все свои проекты и хочу ими гордится, но при этом логика разума должна быть, строить гугл карты с нуля нет смысла.
Итак, что же такое этот сайтмап?
sitemap.xml - это карта сайта в формате XML, с перечнем параметров, такими как дата публикации и приоритет. Для ее формирования достаточно установленной библиотеки SimpleXML. Не вдаваясь в детали, могут быть два типа файлов:
- Файл с ссылками - он сообщает поисковикам о том, какие страницы есть на сайте
- Индексный файл - сообщает о том, какие файлы с ссылками есть. Он нужен для преодоления лимита в 50 тысяч ссылок на один файл с ссылками. Если у вас страниц меньше, его делать не стоит и можете обойтись только Файлом с ссылками.
В первом случае, сгенерированный файл и будет sitemap.xml, а в случае когда ссылок больше 50 тыс, хорошим правилом будет назвать индексный файл sitemap.xml, а в нем перечислить уже файлы с ссылками, с теми именами которые вам наиболее удобны. Так как для большинства сайтов 50 тыс страниц это огромное количество, чаще всего не достигаемое, то используем схему 1. По запросу в комментариях опишу схему 2, с индексным файлом.
Схема действий очень простая. В консоли вызываем команду генерации консольных команд(CLI) для сайта, находясь в корне сайта:
php artisan make:command generateSitemap
В результате, артисан создаст файл generateSitemap по пути app/Console/Commands/generateSitemap.php
Открыв файл, меняем значение переменной $signature на:
protected $signature = 'generate:sitemap';
Это будет уникальный идентификатор для команды artisan вызывать конкретно выполнение функции handle созданного нами файла.
Теперь перейдем к самой сути файла, его я прокомментирую строками в самом коде.
public function handle()
{
//дефолтная дата, к примеру создания сайта. Используется там,
//где нужно указать дату для страниц не сохраненных в базе данных
$defaultdate = new DateTime('2018-01-01 10:01:01');
//берем базовый урл сайта
$site_url = env('APP_URL');
//это шаблон файла XML для сайтмапа, здесь не нужно ничего менять
$base = '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
</urlset>';
//создаем корневой элемент, в который будут добавлены все остальные
$xmlbase = new \SimpleXMLElement($base);
//создаем первый элемент, с ссылкой на главную страницу
$row = $xmlbase->addChild("url");
$row->addChild("loc",$site_url);
//параметр lastmod - последнее обновление вашей страницы.
//дата последней модификации задана временем генерации файла
//учитывайте формат времени здесь должен быть конкретный Y-m-d\TH:i:sP , в противном случае
//получите ошибку валидности файла
$row->addChild("lastmod",date("c"));
//Так как она статична, задал ей частоту - раз в месяц
$row->addChild("changefreq","monthly");
//можете варьировать приоритетность страниц вашего сайта этим параметром
$row->addChild("priority","1");
//допустим у нас есть блог, берем с него только опубликованные посты
foreach (Blog::where("is_published",true)->get() as $item) {
$row = $xmlbase->addChild("url");
//здесь передаем ссылку на страницу записи блога, предполагается что
//ваш роутинг имеет именованное правило blog_show с параметром slug
$row->addChild("loc",route('blog_show',['slug'=>$item->slug]));
//здесь для простоты обновления взята дата создания - created_at, вы же можете
//использовать updated_at, но он меняется по каждому чиху,
//например при увеличении счетчика просмотра страницы
$date = new DateTime($item->created_at);
//передаем дату в правильном формате
$row->addChild("lastmod",$date->format("Y-m-d\TH:i:sP"));
//уже созданные страницы блога редко кто меняет часто,
//нет смысла задергивать поисковик и тратить ресурсы сайта/хостинга/сервера за зря
$row->addChild("changefreq","monthly");
$row->addChild("priority","1");
}
/* И как пример, добавим еще страницу О нас */
$row = $xmlbase->addChild("url");
$row->addChild("loc",route('page_about'));
//здесь и используем дефолтную дату из самого начала функции
$row->addChild("lastmod",$defaultdate->format("Y-m-d\TH:i:sP"));
$row->addChild("changefreq","monthly");
$row->addChild("priority","1");
//после того как создали карту сайта, ее нужно записать в файл
$xmlbase->saveXML(public_path()."/sitemap.xml");
}
Теперь при вызове команды генерации сайтмапа:
php artisan generate:sitemap
сайт сгенерирует файл sitemap,xml в папке public, которая является точкой входа на сайт с веб-сервера. То есть сам файл будет доступен по пути http://ваш_домен.сайта/sitemap.xml , что и есть нормальным для многих поисковых систем и разных ботов. Остается только скормить его самостоятельно или подождать пока на него зайдет бот. Но лучше сделать это вручную.
Автоперегенерация файла с картой сайта sitemap.xml
Все бы хорошо, но запускать каждый раз команду вручную занятие такое себе. Для этого пропишем вызов команды в файле app\Console\Kernel.php. для этого открываем этот файл и в массиве команд вписываем нашу:
protected $commands = [
//...
generateSitemap::class,
];
а в теле функции schedule указываем время выполнения нашей команды:
protected function schedule(Schedule $schedule)
{
//...
//->daily() отвечает за вызов команды раз в день
$schedule->command('generate:sitemap')->daily();
//...
}
Вот теперь, если вы при установке фреймворка прописали команду artisan на вызов по времени в файле крона, то он будет выполнятся раз в день и генерировать обновленную карту.
Это все, разжевал вроде детально как мог. В итоге никаких внешних зависимостей, меняете как вам нужно под ваш проект и дорабатываете так же. На всю эту реализацию уходит минут 15.
Отзывы
Пока нет комментариев
Для того чтобы оставить комментарий, авторизуйтесь.