Skip to content

Instantly share code, notes, and snippets.

@alfinauzikri
Created July 1, 2023 08:13
Show Gist options
  • Save alfinauzikri/8c1b17fcf14fb084de9dc635cdde648c to your computer and use it in GitHub Desktop.
Save alfinauzikri/8c1b17fcf14fb084de9dc635cdde648c to your computer and use it in GitHub Desktop.
Create and generate sitemap.xml for Laravel with ease.

Example (sitemap.xml) :

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>https://example.com</loc>
        <lastmod>2023-07-01</lastmod>
        <priority>0.8</priority>
        <changefreq>monthly</changefreq>
    </url>
    <url>
        <loc>https://example.com/page</loc>
        <lastmod>2023-07-01</lastmod>
        <priority>0.8</priority>
        <changefreq>monthly</changefreq>
    </url>
    ...
</urlset>

Controller (SitemapController.php) :

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Route;

class SitemapController extends Controller
{
    public function generator()
    {
        // Get all routes
        $routeCollection = Route::getRoutes();

        // only get with GET method
        $urls = $routeCollection->getRoutesByMethod()['GET'];

        // only get with web middleware
        $urls = array_filter($urls, function ($url) {
            return in_array('web', $url->action['middleware']);
        });

        // except api routes
        $urls = array_filter($urls, function ($url) {
            return !preg_match('/api/', $url->uri);
        });

        // except auth middleware
        $urls = array_filter($urls, function ($url) {
            return !in_array('auth', $url->action['middleware']);
        });

        // except parameterized routes
        $urls = array_filter($urls, function ($url) {
            return !preg_match('/{.*}/', $url->uri);
        });

        // except routes with query parameters
        $urls = array_filter($urls, function ($url) {
            return !preg_match('/\?/', $url->uri);
        });

        // except sitemap routes
        $urls = array_filter($urls, function ($url) {
            return !preg_match('/sitemap/', $url->uri);
        });

        // except sanctum routes
        $urls = array_filter($urls, function ($url) {
            return !preg_match('/sanctum/', $url->uri);
        });

        // Make sitemap array
        $sitemap = [];

        foreach ($urls as $url) {
            $sitemap[] = [
                'loc' => url($url->uri),
                'lastmod' => now()->format('Y-m-d'),
                'priority' => '0.8',
                'changefreq' => 'monthly',
            ];
        }

        return response()->view('sitemap', [
            'sitemap' => $sitemap,
        ])->header('Content-Type', 'text/xml');
    }
}

View (sitemap.blade.php) :

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    @foreach ($sitemap as $url)
        <url>
            <loc>{{ $url['loc'] }}</loc>
            <lastmod>{{ $url['lastmod'] }}</lastmod>
            <changefreq>{{ $url['changefreq'] }}</changefreq>
            <priority>{{ $url['priority'] }}</priority>
        </url>
    @endforeach
</urlset>

Route (web.php) :

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\SitemapController;

Route::get('sitemap.xml', [SitemapController::class, 'generator'])->name('sitemap.xml');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment