Гость

Нажмите для авторизации/регистрации

  • Назад
  • Меню
  • Статьи
    • Все
    • Интернет и технологии
    • Laravel и WebDev
    • Linux, Windows, Docker, Etc
    • Новости
    • Прочее
    • Геймдев
    • Смотри как я умею
  • Информация
    • Оферта на дополнительные функции
    • Политика конфиденциальности
    • Тарифы
    • Пользовательское соглашение

Сайтмап для сайта на Laravel - sitemap.xml

  1. Главная
  2. Статьи
  3. Laravel и WebDev
  4. Сайтмап для сайта на Laravel - sitemap.xml
Сайтмап для сайта на Laravel - sitemap.xml
  • 25/11/2021
  • Chebukin Pavel
  • 1392 просмотров
  • 0 комментариев

Сайтмап для сайта на Laravel - sitemap.xml

Многие разработчики, не понимая простоту создания карты сайта, прибегают к установке дополнительных библиотек. Но, я приверженец минимума зависимостей от сторонних библиотек. Особенно если в этом нет нужды.

Горький опыт поддержания проектов с умершими зависимостями, при обновлениях сайта. Да, можно клонировать проект и развивать самому. Но в бизнес-задачах всегда вопрос цены стоит особняком. Если вас не парит что будет с проектом в дальнейшем, вы можете воспользоваться и таким вариантом. Но я люблю почти все свои проекты и хочу ими гордится, но при этом логика разума должна быть, строить гугл карты с нуля нет смысла.

Итак, что же такое этот сайтмап?

sitemap.xml - это карта сайта в формате XML, с перечнем параметров, такими как дата публикации и приоритет. Для ее формирования достаточно установленной библиотеки SimpleXML. Не вдаваясь в детали, могут быть два типа файлов: 

  1. Файл с ссылками - он сообщает поисковикам о том, какие страницы есть на сайте
  2. Индексный файл - сообщает о том, какие файлы с ссылками есть. Он нужен для преодоления лимита в 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.

Отзывы

Пока нет комментариев


Для того чтобы оставить комментарий, авторизуйтесь.
Понравился материал? Поделись!
Создадим Нотификацию В Laravel, Отправляющую Сообщение В Телеграмм
Дек11
Создадим Нотификацию В Laravel, Отправляющую Сообщение В Телеграмм

Это продолжение материала по созданию канала и бота в телеграмм, для нотификаций. В этом материале мы лишь создадим саму нотификацию Laravel и будем отправлять ее в очередь, при возникновении события. Создадим канал telegram, для нотификации через него php artisan make:channel telegram Это то, куда доставляется сообщение. Сам файл: app/Broadcasting/telegram.php. В нем...

  • Chebukin Pavel
  • 0
  • 11.12.2021 00:58
Laravel: Nova, Orchid или кастомная/собственная админ панель
Июл23
Laravel: Nova, Orchid или кастомная/собственная админ панель

Очень часто под очередной проект приходится делать админ панель. Чаще всего в MVP проектах никто не закладывает дизайн админ панели. Берется уже или полу готовая, или делается с нуля, чаще всего на купленной теме. Чтобы сделать свою панель, перекрывающую 80% типовых потребностей многих сайтов потребуется пару дней возни, а в...

  • Chebukin Pavel
  • 0
  • 23.07.2022 10:30
Проблема с просмотром больших XML/YML файлов?
Ноя28
Проблема с просмотром больших XML/YML файлов?

Вы, как и я, столкнулись со сложностью того, что сайт через API отдает большой XML файл? Хорошо когда есть документация, но часто ее нет, или она не полная, или вообще не актуальная. Нужно посмотреть что внутри файла. И вот тут сталкиваемся со сложностью, большая часть редакторов кода и текстовых редакторов...

  • Chebukin Pavel
  • 0
  • 28.11.2021 23:24
Laravel, подключаем комментарии Disqus на сайт
Дек11
Laravel, подключаем комментарии Disqus на сайт

Ранее я уже писал о том, как добавить комментарии Facebook на сайт. В этом материале мы добавим альтернативные комментарии, от сервиса Disqus.  Комментарии на сайт встроенные лучше, чем подключаемые. Но требуют разработки, внедрения, модерации и т.д. Все это время и ресурсы. Но такие комментарии будут работать быстрее даже. Не всем...

  • Chebukin Pavel
  • 0
  • 11.12.2021 18:29
Онлайн-песочницы для кода
Дек18
Онлайн-песочницы для кода

Когда возникает потребность проверить какой-то простенький алгоритм или набросать элемент, использовать для этого файлы рабочего проекта или создавать новый не лучшая идея. Именно по этой причине сейчас существуют всякого рода песочницы. Один позволяют скомпилировать код системных языков и вывести результат, другие набросать HTML+CSS+JS схемку и отладить ее. В любом случае,...

  • Chebukin Pavel
  • 0
  • 18.12.2021 21:33
Добавляем на сайт комментарии Facebook для Laravel и не только
Дек02
Добавляем на сайт комментарии Facebook для Laravel и не только

Добавить комментарии можно на любой сайт. Но так как многих сайтов это означает добавление кода, работу с базой данных, модерацию и т.п. В этом ключе выгодно отличается установка комментариев от соц. сети Facebook. Аналогичные можно установить от VK, Disqus и других платформ. В этот раз рассмотрим именно подключение фейсбука. В...

  • Chebukin Pavel
  • 0
  • 02.12.2021 21:12

Copyright 2023 © All rights reserved.

Мы в: