Cara Membuat Sitemap Dinamis pada Laravel

Sitemap merupakan komponen penting dalam pengelolaan blog. Fungsinya adalah untuk memudahkan search engine terkait konten blog kita yang boleh di-crawl dan diindeks. Hal ini tentu saja akan berdampak pada munculnya konten atau artikel kita di hasil pencarian search engine. Tapi bukan bearti situs tanpa sitemap tidak akan diindeks oleh search engine. Logikanya tidak begitu.

Persiapan Pembuatan Sitemap

Unsur penting yang paling tidak harus ada dalam sebuah sitemap adalah url (loc), tanggal terakhir diubah (lastmod), seberapa sering diubah (changefreq), dan prioritas (priority). Dari keempat unsur itu, yang paling sering dibuat dinamis adalah url dan tanggal terakhir diubah. Pada artikel ini, kedua unsur itulah yang akan dibuat dinamis sedangkan kedua unsur lainnya dibuat statis.

Sebagai contoh, pada pembahasan ini akan dibuatkan Model Eloquent Post yang berisi post_title, post_content, slug, created_at, dan updated_at. Dari model tersebut, field yang akan digunakan pada sitemap hanya slug dan updated_at saja. Contoh file migration yang dibuat kurang lebih seperti di bawah ini.

Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->text('post_title');
    $table->longText('post_content');
    $table->string('slug', 200)->unique()->index();
    $table->timestamps();
});

Tambah konfigurasi storage yang berada di dalam file config/filesystems.php pada bagian links:

public_path('sitemap') => storage_path('app/sitemap'),

Membuat Command Sitemap Generator

Sitemap yang dibuat pada tutorial ini dibuat dalam bentuk file xml yang akan diperbarui setiap pukul 12 malam. Alasan dibuat dalam bentuk file agar ketika sitemap tersebut dicrawl oleh beberapa bot search engine dalam satu waktu tidak membebani server karena tidak melakukan query secara langsung ke database.

Pembuatan command di dalam laravel bisa menggunakan command berikut ini:

php artisan make:command SitemapGenerator

Buka file Sitemapgenerator.php yang terletak di dalam app/Console/Commands. Ubah bagian-bagian berikut:

protected $signature = 'sitemap:generate';

Kode di atas berfungsi untuk membuat command yang bisa dijalankan melalui CMD yaitu: php artisan sitemap:generate

protected $description = 'Command untuk membuat sitemap';
public function handle()
{
    $posts = Post::latest()->limit(5000)->get();
    Storage::put('sitemap/post-sitemap.xml', View::make('sitemap.single-sitemap', ['data' => $posts]));
}

Membuat Template untuk Sitemap

Buat sebuah folder bernama sitemap di dalam resources/view. Di dalam folder tersebut tambahkan sebuah file single-sitemap.blade.php

Tambahkan kode berikut pada template sitemap tersebut:

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd"
        xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    @foreach ($data as $item)
        <url>
            <loc>{{url('/')}}/{{ $item->slug }}</loc>
            <lastmod>{{ $item->updated_at->toAtomString() }}</lastmod>
            <changefreq>weekly</changefreq>
            <priority>0.6</priority>
        </url>
    @endforeach
</urlset>

Membuat Sitemap Menggunakan Command

Setelah semua langkah-langkah di atas selesai dilakukan maka selanjutnya adalah mencoba membuat sitemap menggunakan command yang dibuat pada langkah kedua. Jalankan command berikut di cmd pada root project Laravel.

php artisan sitemap:generate

Kode di atas jika berhasil dijalankan dan tidak ada notifikasi error maka akan membuat sebuah file bernama post-sitemap.xml di dalam folder storage/app/sitemap.

Selanjutnya kita perlu membuat symlink untuk sitemap tersebut agar bisa diakses menggunakan URL. Caranya cukup dengan menjalankan command di bawah ini:

php artisan storage:link

Setelah symlink berhasil dibuat maka selanjutnya coba akses sitemap tersebut melalui browser dengan alamat: domain.com/sitemap/post-sitemap.xml.

Membuat Sitemap Secara Otomatis

Selanjutnya adalah membuat sitemap secara otomatis. Caranya adalah dengan mendaftarkan command php artisan sitemap:generate ke dalam cronjob agar dijalankan secara periodik sesuai keinginan kita. Cara nya adalah sebagai berikut:

Pertama akses SSH kemudian jalankan command di bawah ini:

crontab -e

Tambahkan baris kode berikut pada edotor cronjob yang telah terbuka

0 0 * * * /usr/local/bin/php /path_laravel/artisan sitemap:generate >> /dev/null 2>&1

Perhatikan kode di atas ada bagian path_laravel yang harus diganti sesuai path project laravel. Kode cronjob di atas berfungsi untuk menjalankan Sitemap Generator setiap pukul 12 malam setiap hari. Sehingga file sitemap kita akan selalu diperbarui setiap hari.

Langkah terakhir adalah mengirimkan url sitemap ke webmaster agar konten blog kita segera diindex.