Tạo sitemap trong laravel 9

Tạo sitemap trong laravel 9

Khi bạn seo 1 trang web thì việc gửi sitemap nhằm hỗ trợ các bot Google chạm đến đích của website chứa nội dung nhanh chóng hơn bao giờ hết .Vì vậy việc tạo sitemaps là 1 công việc cơ bản và cần thiết với 1 trang web .Hôm nay mình sẽ cùng các bạn tạo 1 sitemap với laravel 9

Bước 1 : Tạo 1 project mới

composer create-project laravel/laravel lasitemap

Bước 2 : Kết nối database

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=lasitemap
DB_USERNAME=root
DB_PASSWORD=

Bước 3 : Chỉnh sửa model

Để vào việc nhanh hơn mình sử dụng command :

php artisan make:model Post --all

Chỉnh model Post app/Models/Post.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;
    protected $fillable=['title','content'];
}

Bước 4 : Chỉnh sửa migration

Ở đây mình sử dụng 1 table post demo

Tiếp theo chúng ta sẽ tạo 2 collumn title và content trong mục

database/migrations/2022_07_01_035401_create_posts_table.php

Với nội dung như sau :

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->string('content');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
};

Bước 5: Tạo database giả lập

Ở bước này mình sử dụng factories để tạo dữ liệu cho nhanh: database/factories/PostFactory.php

<?php

namespace Database\Factories;

use App\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Post>
 */
class PostFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    protected $model=Post::class;
    public function definition()
    {
        return [
            'title' => fake()->text(),
            'content' => fake()->text(),
        ];
    }
}

File database/seeders/PostSeeder.php

<?php

namespace Database\Seeders;

use App\Models\Post;
use Database\Factories\PostFactory;
use Faker\Generator;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Str;

class PostSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $faker = new Generator();
        $post = Post::factory()->count(500)->create();
    }
}

Tiếp theo chúng ta chạy lệnh command như sau :

php artisan db:seed --class=PostSeeder

Bước 6: Router Mình tao router cho mỗi bài viết

Route::get('/p/{id}',[\App\Http\Controllers\PostController::class,'post'])->name('post_slug');
Route::get('sitemap_post.xml',[\App\Http\Controllers\SitemapController::class,'post'])->name('sitemap_post');

Trong mục Controller

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use App\Http\Requests\StorePostRequest;
use App\Http\Requests\UpdatePostRequest;

class PostController extends Controller
{

    public function post($id)
    {
        $data = Post::find($id);
        echo $data->title;
        echo '<br/>';
        echo $data->content;
    }
   
}

Do ở đây mình chỉ demo nên ko cần viết nhiều

Bước 7: Sitemaps cho ứng dụng

Tạo controller sitemap

php artisan make:controller SitemapController

Controller code như sau :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;

class SitemapController extends Controller
{
    public $array_return;
    public function post()
    {
        /* cache trong 1 ngày */
        $datas = Cache::remember('sitemap.post',86400,function(){
            DB::table('posts')->chunkById(500,function($posts){
                foreach($posts as $post)
                {
                    $this->array_return[] = $post;
                }
            });
            return $this->array_return;
        });

        return response()->view('sitemap.post',compact('datas'))->header('Content-Type','text/xml');;
    }
}

File resources/views/sitemap/post.blade.php

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    @foreach ($datas as $data)
        <url>
            <loc>{{route('post_slug',['id'=>$data->id])}}</loc>
            <lastmod>{{ \Illuminate\Support\Carbon::createFromTimeString($data->updated_at)->tz('UTC')->toAtomString() }}</lastmod>
            <changefreq>weekly</changefreq>
            <priority>0.9</priority>
        </url>
    @endforeach
</urlset>

Bước cuối cùng ta dùng lệnh

php artisan serve

Download project demo tại đây