How to generate an XML sitemap in Laravel?

Member

by arlo , in category: SEO , 5 days ago

How to generate an XML sitemap in Laravel?

Facebook Twitter LinkedIn Telegram Whatsapp Pocket

1 answer

Member

by delpha , 5 days ago

@arlo 

Generating an XML sitemap in Laravel is a straightforward process. You can either manually create one, or you can use a package to simplify the process. Here’s how you can do both:

Using a Package

One popular package for generating sitemaps in Laravel is spatie/laravel-sitemap. To use this package, follow these steps:

  1. Install the Package


First, you need to require the package via Composer:

1
composer require spatie/laravel-sitemap


  1. Create a Sitemap


You can create a sitemap by calling the appropriate methods as specified in the package documentation. Typically, you would do this in a Laravel console command or controller action.


Here’s an example of how to generate a sitemap within a controller:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
use SpatieSitemapSitemap;
use SpatieSitemapTagsUrl;

Route::get('/generate-sitemap', function () {
    Sitemap::create()
        ->add(Url::create('/home'))
        ->add(Url::create('/about'))
        ->add(Url::create('/contact'))
        // Add other URLs as needed
        ->writeToFile(public_path('sitemap.xml'));

    return 'Sitemap generated!';
});


  1. Automate Sitemap Generation (Optional)


You might want to automate the sitemap generation, perhaps using a scheduled task. You can do this using Laravel’s scheduler. First, create a command:

1
php artisan make:command GenerateSitemap


Then, update the handle method in the newly created command:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace AppConsoleCommands;

use IlluminateConsoleCommand;
use SpatieSitemapSitemap;
use SpatieSitemapTagsUrl;

class GenerateSitemap extends Command
{
    protected $signature = 'sitemap:generate';
    protected $description = 'Generate the website sitemap.';

    public function handle()
    {
        Sitemap::create()
            ->add(Url::create('/home'))
            ->add(Url::create('/about'))
            ->add(Url::create('/contact'))
            // Add other URLs as needed
            ->writeToFile(public_path('sitemap.xml'));

        $this->info('Sitemap generated successfully.');
    }
}


Finally, add this command to the scheduler in AppConsoleKernel.php, perhaps to run daily:

1
2
3
4
protected function schedule(Schedule $schedule)
{
    $schedule->command('sitemap:generate')->daily();
}


Manually Creating a Sitemap

If you prefer not to use a package, you can manually create an XML sitemap. Here's a simple way to do it:

  1. Create a Route and Controller


Create a route and a controller method that returns XML content.

  1. Return XML Content


In your controller, return an XML structure:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
Route::get('/sitemap.xml', function() {
    $urls = [
        '/' => '2023-10-01',
        '/about' => '2023-10-02',
        '/contact' => '2023-10-03',
    ]; 

    $xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" ?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"></urlset>');

    foreach ($urls as $url => $lastmod) {
        $urlElement = $xml->addChild('url');
        $urlElement->addChild('loc', url($url));
        $urlElement->addChild('lastmod', $lastmod);
    }

    return response($xml->asXML(), 200)
              ->header('Content-Type', 'application/xml');
});


This will generate an XML sitemap when you visit /sitemap.xml, though it won't provide the conveniences and additional features a dedicated sitemap package does.


By either using a package or manually generating a sitemap, you can ensure search engines have a map of your website's structure for better indexing.