• Reading time ~ 3 min
  • 19.10.2023

According to Google, most sites would benefit from a sitemap, which helps bots know what pages should be crawled.

A sitemap is a file where you provide information about the pages, videos, and other files on your site, and the relationships between them. Search engines like Google read this file to crawl your site more efficiently. A sitemap tells Google which pages and files you think are important in your site, and also provides valuable information about these files. For example, when the page was last updated and any alternate language versions of the page.

It's possible to create these manually, and we have a tutorial on how to create a sitemap manually here, but a package named "laravel-sitemap" from Spatie makes creating a sitemap easier than ever.

One of the benefits of the package is it supplies two methods of creating a sitemap. The first is it can automatically crawl your site and build it based on internal links, or you can have full control and build it manually.

Laravel Sitemap Auto Crawling

All you need to do for auto crawling is install the packakge and then tell it the URL to start crawling.

use Spatie\Sitemap\SitemapGenerator;

$path = public_path('sitemap.xml');
SitemapGenerator::create('https://example.com')->writeToFile($path);

The generator can execute JavaScript on each page, so links injected into the dom by JavaScript will also be crawled.

Laravel Sitemap Manual Set up

I'm using this here on Laravel News because we have thousands of pages that need to be added to the index. To set this up, first apply the code to your models:

use Spatie\Sitemap\Contracts\Sitemapable;
use Spatie\Sitemap\Tags\Url;

class Article extends Model implements Sitemapable
{
    public function toSitemapTag(): Url | string | array
    {
        return Url::create(route('article.details', $this))
            ->setLastModificationDate(Carbon::create($this->updated_at))
            ->setChangeFrequency(Url::CHANGE_FREQUENCY_YEARLY)
            ->setPriority(0.1);
    }
}

Then, you can generate your sitemap like this:

use Spatie\Sitemap\Sitemap;

Sitemap::create()
  ->add(Post::all()
    ->writeToFile(public_path('sitemap.xml'));

How we use Laravel Sitemap

As mentioned, we are using the manual setup and here is the full code to generate our sitemap:

Sitemap::create()
    ->add($this->build_index(Article::active()->get(), 'sitemap_articles.xml'))
    ->add($this->build_index(Partner::active()->get(), 'sitemap_partners.xml'))
    ->add($this->build_index(Category::all(), 'sitemap_categories.xml'))
    ->add($this->build_index(Package::all(), 'sitemap_packages.xml'))
    ->add(Url::create('/')->setPriority(1)->setChangeFrequency(Url::CHANGE_FREQUENCY_ALWAYS))
    ->add(Url::create('/newsletter')->setPriority(0.5)->setChangeFrequency(Url::CHANGE_FREQUENCY_MONTHLY))
    ->add(Url::create('/popular-laravel-packages')->setPriority(0.5)->setChangeFrequency(Url::CHANGE_FREQUENCY_MONTHLY))
    ->add(Url::create('/links')->setPriority(0.5)->setChangeFrequency(Url::CHANGE_FREQUENCY_ALWAYS))
    ->add(Url::create('/links/new')->setPriority(0.5)->setChangeFrequency(Url::CHANGE_FREQUENCY_ALWAYS))
    ->add(Url::create('/partners')->setPriority(0.5)->setChangeFrequency(Url::CHANGE_FREQUENCY_ALWAYS))
    ->add(Url::create('/partners/agencies')->setPriority(0.5)->setChangeFrequency(Url::CHANGE_FREQUENCY_ALWAYS))
    ->add(Url::create('/partners/tools')->setPriority(0.5)->setChangeFrequency(Url::CHANGE_FREQUENCY_ALWAYS))
    ->add(Url::create('/partners/education')->setPriority(0.5)->setChangeFrequency(Url::CHANGE_FREQUENCY_ALWAYS))
    ->writeToFile(public_path('sitemap.xml'));

The first part builds out the indexes with lots of results, then we manually add pages that are from the main navigation. The included video has complete details.

More info

See the officia package for complete details on set up, configuration, and usage for your application.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

ABOUT

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

About author CrazyBoy49z
WORK EXPERIENCE
Contact
Ukraine, Lutsk
+380979856297