veiliglanceren/laravel-seo-sitemap

Laravel Sitemap package to optimize your website in search engines

2.2.0 2025-07-19 01:01 UTC

README

Latest Version on Packagist Total Downloads Laravel Versions PHP Versions

Laravel SEO Sitemap

Want better Google rankings? Generating a clean and up-to-date sitemap is one of the easiest wins for your website’s SEO. With this package, your sitemap is always synced with your route and content structure, no manual edits needed. Search engines like Google and Bing use your sitemap to crawl your site smarter and faster, which means your new pages and updates show up in search results sooner. Whether you're running a blog, webshop, or custom platform, an automated sitemap gives you an edge in visibility and indexing accuracy.

Lightweight. Extensible. Template-driven.

πŸš€ Features of SEO Laravel Sitemap

  • πŸ” Automatic sitemap generation from named routes via ->sitemap()
  • 🧩 Advanced route templates via ->sitemapUsing(MyTemplate::class)
  • 🧠 Built-in Template abstract with helpers like urlsFromModel()
  • ✏️ Configure lastmod, priority, changefreq per URL
  • πŸ’Ύ Save or serve sitemaps via disk or route
  • πŸ§ͺ Fully tested with Pest and Laravel Testbench
  • πŸ“¦ Optional meta-tag injection in <head>
  • βœ… Laravel 10, 11, and 12 support

πŸ“¦ Installation of the Laravel sitemap package

This package is quick to set up and works out-of-the-box with Laravel 10, 11, and 12. After installing via Composer, you can instantly publish the sitemap route and configuration using a single command. The php artisan sitemap:install command automatically adds a new sitemap.php route file and wires it into your existing web.php, so your sitemap is live without extra setup. It’s the easiest way to boost your SEO visibility with structured sitemap data.

composer require veiliglanceren/laravel-seo-sitemap

Publish the route & config:

php artisan sitemap:install
php artisan vendor:publish --tag=sitemap-config

🧭 How to use the sitemap package

This package offers a clean and developer-friendly approach to sitemap generation in Laravel. Whether you're working with static pages or dynamic content from models, adding them to your sitemap is seamless. Use a single macro call for simple routes, or create powerful model-driven templates using the built-in abstract Template class to handle large, dynamic datasets. With just a few lines of code, your entire site structure becomes SEO-friendly and ready for search engine indexing.

βœ… Static routes implemented in sitemap by 1 line in the routes/web.php file

The Route is getting implemented by calling the ->sitemap() Macro.

use VeiligLanceren\LaravelSeoSitemap\Support\Enums\ChangeFrequency;

Route::get('/contact', ContactController::class)
    ->name('contact')
    ->sitemap()
    ->changefreq(ChangeFrequency::WEEKLY)
    ->priority('0.8');

Available Route Macros

The package includes expressive route macros that make it easy to configure sitemap settings directly in your routes/web.php file.

->sitemap()

Marks the route as sitemap-included.

Route::get('/about', AboutController::class)
    ->name('about')
    ->sitemap();
->changefreq(ChangeFrequency $frequency)

Defines how frequently the content at the URL is likely to change.

use VeiligLanceren\LaravelSeoSitemap\Support\Enums\ChangeFrequency;

Route::get('/blog', BlogController::class)
    ->name('blog.index')
    ->sitemap()
    ->changefreq(ChangeFrequency::WEEKLY);
->priority(string $priority)

Sets the priority of this URL relative to other URLs on your site.

Route::get('/contact', ContactController::class)
    ->name('contact')
    ->sitemap()
    ->priority('0.8');

πŸ’‘ These macros can be chained for fluent configuration and better readability.

🧩 Model-driven Template class for easy implementation in sitemap

Use a custom Template that extends the abstract Template class:

// routes/web.php
Route::get('/blog/{slug}', BlogController::class)
    ->name('blog.show')
    ->sitemapUsing(\App\Sitemap\Templates\PostTemplate::class);

Example custom Template for implementing dynamic routes in sitemap

Read more about all of the helper functions: template helper functions

namespace App\Sitemap\Templates;

use App\Models\Post;
use Illuminate\Routing\Route;
use VeiligLanceren\LaravelSeoSitemap\Sitemap\Item\Url;
use VeiligLanceren\LaravelSeoSitemap\Sitemap\Template;

class PostTemplate extends Template
{
    public function generate(Route $route): iterable
    {
        yield from $this->urlsFromModel(Post::class, $route, function (Post $post, Route $route) {
            return Url::make(route($route->getName(), ['slug' => $post->slug]))
                ->lastmod($post->updated_at)
                ->priority(0.6);
        });
    }
}

πŸ“‚ Make an index for multiple sitemaps

Generate an index that references multiple sitemap files (e.g. per section):

use VeiligLanceren\LaravelSeoSitemap\Sitemap\SitemapIndex;

$sitemapIndex = SitemapIndex::make([
    'https://example.com/sitemap-pages.xml',
    'https://example.com/sitemap-posts.xml',
]);

You can dynamically add entries and pretty-print XML:

$sitemapIndex->add('https://example.com/sitemap-products.xml');

Storage::disk('public')->put('sitemap.xml', $sitemapIndex->toXml());

πŸ“– Read more: docs/sitemapindex.md

πŸ§ͺ Generating sitemaps

use VeiligLanceren\LaravelSeoSitemap\Facades\Sitemap;

Sitemap::fromRoutes()
    ->getSitemap()
    ->save('sitemap.xml', 'public');

Or use the CLI:

php artisan sitemap:generate

πŸ–Ό Add images to the sitemap

use VeiligLanceren\LaravelSeoSitemap\Sitemap\Item\Url;
use VeiligLanceren\LaravelSeoSitemap\Sitemap\Item\Image;

$url = Url::make('https://example.com')
    ->addImage(Image::make('https://example.com/image1.jpg')->title('Hero 1'))
    ->addImage(Image::make('https://example.com/image2.jpg')->title('Hero 2'));

πŸ”— Meta tag helper

<head>
    {!! Sitemap::meta() !!}
</head>

Outputs:

<link rel="sitemap" type="application/xml" title="Sitemap" href="/sitemap.xml" />

πŸ§ͺ Testing

vendor/bin/pest

SQLite must be enabled for in-memory testing.

πŸ“„ License

MIT Β© VeiligLanceren.nl