Laravel11でサイトマップを作成してみましたので備忘録として残しておきたいと思います。
この記事はサイトマップ(sitemap.xml)を手軽にサクッと作成したい人向けに書きました。
またサーチコンソールでサイトマップを送信する方法も書いたので参考になれば幸いです。
Laravel11でサイトマップを作成する
サイトマップ作成用のパッケージをインストール
まず以下のコマンドでLaravelのサイトマップ生成パッケージをインストールします。
composer require spatie/laravel-sitemap
カスタムコマンドにサイトマップ生成コードを登録
「routes/console.php」にArtisan::commandを追加して以下のようにサイトマップ生成コードを記述します。
Laravel では、routes/console.php に記述した内容は Artisan コマンドとして動作します。
この仕組みにより、ターミナルから直接実行できるスクリプトやバッチ処理を簡単に作成できます。
以下は「routes/console.php」に追加したコードです。
//サイトマップクラスをインポート
use Spatie\Sitemap\Sitemap;
use Spatie\Sitemap\Tags\Url;
//モデルクラスをインポート
use App\Models\Content;
use App\Models\ContentTag;
//サイトマップ生成コマンド
Artisan::command('generate:sitemap', function () {
$sitemap = Sitemap::create();
//直近で追加されたレコードの日時を取得(トップページ)
$lastModified = \App\Models\Content::latest('updated_at')->value('updated_at');//最も更新日時の新しいupdated_atを取得
$sitemap->add(Url::create("/")
->setLastModificationDate($lastModified)
->setPriority(0.9)
->setChangeFrequency('weekly'));
//直近で追加されたタグの日時を取得(タグ検索)
$lastModified = \App\Models\ContentTag::latest('updated_at')->value('updated_at');//最も更新日時の新しいupdated_atを取得
$sitemap->add(Url::create('/tags')
->setLastModificationDate($lastModified)
->setPriority(1.0)
->setChangeFrequency('monthly'));
// サイトマップを保存
$sitemap->writeToFile(public_path('sitemap.xml'));
});
「$sitemap = Sitemap::create();」でサイトマップインスタンスを生成します。
コンテンツ、コンテンツのタグテーブルから最も新しいレコードを取得して「setLastModificationDate」最終更新日時をセット。
「setPriority()」でページの優先度を、「setChangeFrequency()」 で更新頻度を設定しています。
最後に「public_path()」でLaravelのドキュメントルートであるpublicフォルダを指定して、「$sitemap->writeToFile」でサイトマップを保存しています。
動的に生成された複数のページを追加する場合は、
$posts = \App\Models\Post::all();
foreach ($posts as $post) {
$sitemap->add(Url::create("/posts/{$post->slug}")
->setLastModificationDate($post->updated_at) //ページごとの更新日時を取得
->setPriority(0.9)
->setChangeFrequency('weekly'));
}
のように各ページの更新日時を取得して優先度、更新頻度を設定してサイトマップを作成します。
setLastModificationDate():最終更新日時を設定
setPriority():ページの優先度を指定(0.0~1.0の範囲)※数値が高いほど優先
setChangeFrequency():更新頻度を指定(例: daily、weekly、monthly)
コマンドを実行してサイトマップを生成
以下のコマンドを実行してサイトマップを生成します。
既にサイトマップが存在する場合は、最新ページの更新日時を反映させます。
php artisan generate:sitemap
publicフォルダに「sitemap.xml」が生成されているか確認します。
「https://ドメイン/sitemap.xml」のようにサブディレクトリにsitemap.xmlを付けてアクセスするとサイトマップの中身を確認できます。
URLと更新日時が記載されているか確認しておきます。
注意点としてサイトマップのXMLファイルには、1ファイルあたり最大50,000件のURLを登録することができます。
ファイルサイズも50MB (非圧縮時) までです。
また今回の方法だと大規模なサイトに向かないのと、ページ更新毎に手動でコマンドを実行する必要があるので、もし定期的に自動でサイトマップを更新させたい場合は追加でアプローチが必要になります。
サイトマップを送信する
サーチコンソールで所有権を確認する
以下では当方が使っているMixhostにて所有権を確認する方法を記載しています。
所有権の確認はレンタルサーバーごとに操作方法が違うのでご容赦ください。
サーチコンソールにアクセスして「プロパティを追加」をクリック。
「ドメイン」を選択して「laravel-site.com」のようにURLを入力して「続行」をクリックします。
所有権の確認のページに移行するので、画像の赤枠で囲ったTXTコードをコピーします。
レンタルサーバーのcPanelの「ゾーンエディタ」にアクセスして、対象となるドメインの「管理」ボタンをクリック。
「記録を追加」ボタンの横にある三角ボタンをクリックしてリストを表示して「TXT」記録を追加を選択。
この例ではゾーン名に「laravel-site.com.」と入力して、先ほどコピーしたコードを貼り付けて「記録を保存」をクリックします。
サーチコンソールの所有権の確認画面に戻りって「確認」ボタンをクリック。
画像のように「所有権を証明しました」を表示されたら成功です。
サーチコンソールにサイトマップを登録する
ツールから「インデックス作成」を選択して「サイトマップ」をクリック。
「https://laravel-site.com/sitemap.xml」のようにサイトマップのURLを入力して「送信」ボタンをクリック。
無事サイトマップが送信されるとステータスが「成功しました」に変化して完了です。
サイトマップ名と送信日時や最終読み込み日時が反映されているのがわかります。