Laravelでサイトマップを spatie/laravel-sitemap で作成

Laravelでサイトマップを作る時には今まで Laravelium/laravel-sitemap を使っていたのですが、リポジトリがパブリックアーカイブされており今後の更新がされないため他のライブラリに乗り換えました。

今回の記事は乗り換えた先の spatie/laravel-sitemap を使って設定した内容をメモしておきます。

設定する

まずはインストール

$ composer require spatie/laravel-sitemap
$ php artisan vendor:publish --provider="Spatie\Sitemap\SitemapServiceProvider" --tag=sitemap-config

sitemapを動的出力ではなく、ファイルとして出力するタイプになります。

公式としてはsitemapを手動で作らないで、SitemapGenerator クラスを使用したクローリングで見つかったリンクを記載するのを推奨しているようです。

ですが、自分としてはGoogle botが巡回されていない公開初期に作成する事が多いため、クローリングしてもらいたいURLのみ記載していくように設定しました。

その設定が以下のコマンドになります。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;
use Spatie\Sitemap\Sitemap;
use Spatie\Sitemap\Tags\Url;

class GenerateSitemap extends Command
{
    /**
     * The console command name.
     *
     * @var string
     */
    protected $signature = 'sitemap:generate';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Generate the sitemap.';

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $sitemap = Sitemap::create();
        $sitemap->add(route('top'));
        $sitemap->add(route('search.index'));

        $sitemap->add(route('hoge.index'));
        $hoges = DB::table('hoges')
            ->select(DB::raw('MAX(updated_at) as updated_at, hoge_name'))
            ->groupBy('hoge_name')
            ->get();

        foreach ($hoges as $hoge) {
            $url = Url::create(route('hoge.show', ['hoge_name' => $hoge->hoge_name]))
                ->setLastModificationDate(new Carbon($hoge->updated_at));
            $sitemap->add($url);
        }

        $sitemap->writeToFile(public_path('storage/sitemap.xml'));
    }
}

以下のコマンドで実行できます。

$ php artisan sitemap:generate
$ ls public/storage/sitemap.xml
public/storage/sitemap.xml

あとはこのコマンドを本番サーバーで実行するなり、cronに登録するなりして出力してサーチコンソールやrobots.txtに記載していきましょう。

投稿者


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA