How to generate an XML sitemap in Laravel?

Member

by arlo , in category: SEO , 3 months ago

How to generate an XML sitemap in Laravel?

Facebook Twitter LinkedIn Telegram Whatsapp Pocket

1 answer

Member

by delpha , 3 months 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.

Related Threads:

How to generate a sitemap in Laravel Framework?
How to generate an XML sitemap in TYPO3?
How to generate an XML sitemap in ExpressionEngine?
How to generate an XML sitemap in Grav?
How to generate an XML sitemap in Webflow?
How to generate an XML sitemap in WordPress?