Laravel

Laravelでサイトマップを作る方法【SEO対策】

いつもご利用ありがとうございます。このブログは、広告費によって運営されています。

オススメ本
Web技術を勉強するなら、かなりオススメの雑誌です。毎月新しい発見があります。ついに最終号・・・、みなさん買いましょう!!
読んで損することはない名著。命名で悩むことが多い人はこの本がオススメです。

⇨ Laravel 記事の目次はこちら

サイトマップは、グーグル検索に載るために重要でありますが、Laravel でサイトマップを作る方法について記事を書いていきます。

これからやる方法は、パッケージを使わずに、自力というか我流の方法となります。

なので、これよりもっと良い方法はあると思いますが、結果的にはサイトマップになるのでファイルの書き込み、SQL などのパフォーマンス的な課題くらいしか問題はないと思います。

多分ですが。

ご意見ご感想は Twitter に DM いただければ嬉しいです。

⇨Gatsby でサイトマップに lastmod を追加する方法

⇨ サイトマップに priority と changefreq は不要っぽい

なぜサイトマップを作るのか?

サイトマップは、Google の検索アルゴリズムに対して、「こんなサイトがありますよ」と伝える役割になります。

Google はサイトマップを送信することを推奨しており、確実にやった方が良いこととなります。

ブログなどでは確実にやっていると思います。

Laravel にはサイトマップを作るパッケージがあるのですが、今回はパッケージを使わずにやっていきます。

検証環境

Laravel 6

なぜパッケージを使わないのか

パッケージは融通を利かせようとすると逆に使いにくくて、ドキュメントを調べるのがめんどくさくなるからです。

サイトマップはその性質上、いかに正確なものを作成するか、head の canonical と整合性のあるものを作る必要があるため、たびたびパッケージの仕様と睨めっこする必要があります。

逆にこの方法であれば、最初のセッティングがめんどくさいものの(cron で定期実行して毎日更新させるなど)、一度セッティングすればコードで簡単に追加・削除・編集が可能です。

大きなサイトでも小さなサイトでも結局手で作る方が早いんじゃないかな?って思います。

サイトマップの作成方法

流れは下記のように進めていきます。

①sitemap.xml を生成するコマンドを作る。

② そのファイルをレスポンスとして返す。

流れとなります。

早速行ってみましょう!!!!

コマンドを作成する

コマンドファイルの作成

ターミナルでコマンドを打ってください。

php artisan make:command SitemapCommand

App/Console/Command/SitemapCommand.php が作成されました。

コマンドのコードを編集する。

protected $signature = 'batch:sitemap';

protected $description = 'サイトマップの定期作成';

public function __construct()
{
    parent::__construct();
}

public function handle()
{
        //保存先
        $file = resource_path('views/sitemap.xml');
        //初期化
        $start_content = '<?xml version="1.0" encoding="UTF-8"?>'
        .'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
        \File::put($file,$start_content);

        $content = "<url>
            <loc>".route('home')."</loc>
            <lastmod>2021-06-02</lastmod>
            </url>";
        \File::append($file,$content);

        //最後閉じタグが必要
        $end_content = '</urlset>';
        \File::append($file,$end_content);

        //本番環境のときは、Googleにピンを送る
        if(config('app.env') == 'production'){
            'https://www.google.com/ping?sitemap=https://xxxxxxxxxxx.jp/sitemap.xml';
        }
}

これでコマンドを打つと、こういう中身のファイルが生成されます。

resouces/views/sitemap.xml

<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><url>
            <loc>http://localhost/home</loc>
            <lastmod>2021-06-02</lastmod>
            </url></urlset>

タグの意味はここでは解説しません。

今回は、home の1ページ分だけ作成しています。

複数ページのときは、コードを追加していくだけなんですが、後ほどやります。

レスポンスを作成する

web.php

Route::get('/sitemap.xml','SitemapController@index');

コマンドでコントローラーの作成

php artisan make:controller SitemapController

App/Http/Controllers/SitemapController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SitemapController extends Controller
{
    public function index()
    {
        return response(file_get_contents(resource_path('views/sitemap.xml')),200,['Content-Type'=>'application/xml']);
    }
}

以上で OK です。

早速、ローカルサーバーの

http://127.0.0.1:8000/sitemap.xml

にアクセスしてみます。

サイトマップの画像

こんな感じで表示されたら OK です。

上に何やら注意が書かれていますが、これでサーチコンソールで送信しても問題ありません。

複数の URL を書く方法

append を使って、追記すれば良いだけです。

特に難しいことはなく。

SitemapCommand.php

$content = "<url>
    <loc>".route('home')."</loc>
    <lastmod>2021-06-02</lastmod>
    </url>";
\File::append($file,$content)
$content = "<url>
    <loc>".route('post')."</loc>
    <lastmod>2021-06-02</lastmod>
    </url>";
\File::append($file,$content);

こんな感じで OK です。

まとめ

いかがだったでしょうか?

Laravel でゴリ押しでサイトマップを作る方法についてやっていきました。

ぶっちゃけパッケージを理解するより簡単な気がしますが、いかがでしょうか・・・?

これくらいシンプルな URL だけしかないのであればパッケージを使った方が早いかもしれないです。

ただ、サービスを運営するとなると、パッケージより融通が効くので作りやすいと僕は思います。

具体的な例は、ここではやめておきます。

それでは、何か変なところあれば Twitter の DM お待ちしています。

人気記事

PHP7.4 + Laravel6 のプロジェクトを AWS EC2 にデプロイする