iku8log

Webエンジニア、SEO、Web解析等々しております。タダのメモ。

Laravel5.5で自動でサイトマップを作成する方法

Laravelでとあるサイトを作っているのですが、ページ数が増えすぎて、自分でわっせわっせとサイトマップを作るのが面倒になってので、

「毎日自動でサイトマップを作る」

という仕様にしてみました。

自分のサイトのドメインを設定することで、サイト内をクロール?して自動的にサイトマップを作ってくれます。

※コードはしっかり読んでないので詳しくありません。

流れと環境

最初にざっくりと、「環境」と、「サイトマップを自動で作成するまでの流れ」を書いときます。

環境

  • OS: CentOS7
  • PHP: 7.0.23
  • Laravel: 5.5.12

流れ

  1. プロジェクトを用意する(自分がLaravelで作ったサイト)
  2. spatie/laravel-sitemapをインストール
  3. Laravelのコマンドに登録する
  4. Laravelのスケジュールにコマンドを登録する
  5. cronでスケジュールを設定

spatie/laravel-sitemapをインストール

このパッケージは「Laravelium/laravel-sitemap」の派生版?みたいな感じでした。

Automatically generate a sitemap in Laravel - murze.be

↑によると、「Laravelium/laravel-sitemap」は手動でしかサイトマップを登録出来ないけど、「spatie/laravel-sitemap」では自動で出来るよ!

みたいな感じのことを書いていました。

とりあえず、GitHubのreadme通りに作ってみました。 https://github.com/spatie/laravel-sitemap#generating-the-sitemap-frequently

まず以下を実行↓

$composer require spatie/laravel-sitemap

composer.jsonが書き換わるので、アップデートします↓

$composer update

終わると、vendor以下に必要なファイルが作られているはずです。

Laravelのコマンドに登録する

続いてサイトマップ作成を実行させるためのコマンド作りです。

app/Console/Commands/GenerateSitemap.phpというファイルを作成します。Commandsというディレクトリは無いので作ってください。

<?php
namespace App\Console\Commands;

use Illuminate\Console\Command;
use Spatie\Sitemap\SitemapGenerator;

class GenerateSitemap extends Command
{
    // コマンド名を設定
    protected $signature = 'create_sitemap';

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

    // コマンド実行時に呼び出される
    public function handle()
    {
        // プロジェクトのURL以下を解析し、sitemap.xmlという名前でサイトマップを作成する
        SitemapGenerator::create('http://iku8.hatenablog.com/preview:title')
            ->writeToFile(public_path('sitemap.xml'));
    }
}

これでコマンドの登録はできました。

今回個のブログのURLを設定していますが、config(‘app.url’)をcreateの引数にすることで、そのプロジェクトのサイトマップを作ってくれます。 試しに、実行してファイルが作られるか見てみましょう。

$php artisan create_sitemap

publicディレクトリ配下にsitemap.xmlが作成されているはずです。

sitemap.xmlの内容は以下です↓

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
    <url>
        <loc>http://iku8.hatenablog.com/</loc>


        <lastmod>2017-09-24T12:18:21+00:00</lastmod>

        <changefreq>daily</changefreq>

        <priority>0.8</priority>
    </url>
    <url>
        <loc>http://iku8.hatenablog.com/?page=1488002585</loc>


        <lastmod>2017-09-24T12:18:21+00:00</lastmod>

        <changefreq>daily</changefreq>

        <priority>0.8</priority>
    </url>
    <url>
        <loc>http://iku8.hatenablog.com/?page=1497193113</loc>


        <lastmod>2017-09-24T12:18:21+00:00</lastmod>

        <changefreq>daily</changefreq>

        <priority>0.8</priority>
    </url>
 ・
 ・
 ・

ちゃんとサイトマップになっていますね!

Laravelのスケジュールにコマンドを登録する

コマンドで実行することは出来ましたが、毎回実行するのは面倒なので、この実行もLaravelに自動でしてもらいましょう。

一日おきにサイトを解析し、サイトマップを作成してもらいます。

app/Console/Kernel.phpを以下のように編集します。

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        //
    ];

    // スケジュール登録
    protected function schedule(Schedule $schedule)
    {
        // 一日おきにcreate_sitemapコマンドを実行する
        $schedule->command('create_sitemap')->daily(); // ←編集はここだけ
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

動きだけ確認したい場合は、dairy()じゃなくてeveryMinute()を使ってみてください。1分ごとにサイトマップ作ってくれますよ。

cronでスケジュールを設定する

スケジュールを登録しただけでは、まだ実行されないので、cronで発火させます。

cronファイルを編集

$crontab -e

上記のコマンドでファイル編集画面になるので、以下を追記します。

* * * * * php /home/vagrant/sitemap/artisan schedule:run >> /dev/null 2>&1

これでLaravelのスケジュールが読まれるようになりました。

これで設定は以上です! あとは1日おきにサイトマップが作成されるのでほっておきましょう!

もちろんサイトマップは上書きです。

ブラウザでサイトマップが見えるか確認した場合は、自分のURL/sitemap.xmlを見ましょう。

頭がいい人はいろんな便利なものを作ってくれるので、助かります…。 設定も簡単で助かりました。 やはり日本語の情報は少ないですが。

何かミスってったら指摘おねがいしやす。

今回作成したコードをGitHubにアップしておきました。

github.com