laravel5

[laravel]サイトマップ(sitemap.xml)の作成方法

業務でサイトマップを生成したので忘れない内に投稿しておきます。

サイトマップとは?

サイトマップには二通りあります。
一つはサイトを訪れたユーザーの為にどこに何があるのか記載しているwebページ。
もう一つは検索エンジンがサイト内のURLを集めるための手がかりとなるsitemap.xml。

今回はsitemap.xmlの生成方法を投稿します。
ちなみにlaravelのバージョンは5.4です。

Let's 生成!

https://github.com/Laravelium/laravel-sitemap
↑こちらを参考にしながら生成していきます。

composer.json
    "require": {
        "php": ">=5.6.4",
        "laravel/framework": "5.4.*",
        "laravel/tinker": "~1.0",
        "monolog/monolog": ">=1.0.0",
        "roumen/sitemap": "2.6.*"
         // 新しく"roumen/sitemap": "2.6.*"を追加
    },

app.php
'providers' => [
  Roumen\Sitemap\SitemapServiceProvider::class
  //新しくRoumen\Sitemap\SitemapServiceProvider::classを追加
]

以上のコードを書いたら一旦コマンドを打ちましょう。

php artisan vendor:publish --provider="Roumen\Sitemap\SitemapServiceProvider"
  • 私の場合はコマンドを打った際にエラーが出てしまいました。そういった場合は焦らずcomposer updateを打ちましょう。

artisanコマンドを打つと以下のファイルパスがコピーされたと思います。

Copied File [/vendor/roumen/sitemap/src/config/config.php] To [/config/sitemap.php]
Copied Directory [/vendor/roumen/sitemap/src/views] To [/resources/views/vendor/sitemap]
Copied Directory [/vendor/roumen/sitemap/src/public] To [/public/vendor/sitemap]

以上の処理が終了したらcomposer updateを打ちましょう

composer update

それではルーティングに移りましょう。

ルーティング

https://github.com/Laravelium/laravel-sitemap
のExamplesにある"How to generate sitemap to a file"にサイトマップの生成方法が記載されていました。

Route::get('mysitemap', function(){

    // create new sitemap object
    $sitemap = App::make("sitemap");

    // add items to the sitemap (url, date, priority, freq)
    $sitemap->add(URL::to(), '2012-08-25T20:10:00+02:00', '1.0', 'daily');
    $sitemap->add(URL::to('page'), '2012-08-26T12:30:00+02:00', '0.9', 'monthly');

    // get all posts from db
    $posts = DB::table('posts')->orderBy('created_at', 'desc')->get();

    // add every post to the sitemap
    foreach ($posts as $post)
    {
        $sitemap->add($post->slug, $post->modified, $post->priority, $post->freq);
    }

    // generate your sitemap (format, filename)
    $sitemap->store('xml', 'mysitemap');
    // this will generate file mysitemap.xml to your public folder

});

自分のサービスに合わせてweb.phpにこのまま記載すればおそらく動くと思います(自分は動きました)
ですが、web.phpにルーティング処理以外のことを書くのも何か違和感があるので処理をコントローラーに分けます。

コントローラー + ルーティング

コントローラー
SiteMapController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Roumen\Sitemap\SitemapServiceProvider;
use Carbon\Carbon;


class siteMapController extends Controller
{

  public function sitemap(){
    // create new sitemap object
    $sitemap = \App::make("sitemap");
    $now = Carbon::now();
    // add items to the sitemap (url, date, priority, freq)
    $sitemap->add(\URL::to('/home'), $now, '1.0', 'daily');
    // \URL::to('/home')はweb.phpでトップページに指定したURL + α をaddメソッドで指定している。
        // \URL::to('/')ならトップページに移動。
    $sitemap->add(URL::to('/home/event'), $now, '0.9', 'weekly');

    // generate your sitemap (format, filename)
    $sitemap->store('xml', 'sitemap');
    // this will generate file mysitemap.xml to your public folder
    // return $sitemap->render('xml');ならばhttps://トップページ/sitemapにアクセスすれば
    // サイトマップページに飛ぶことが出来る。
  }
}


AppとURLの後ろにバックスラッシュをつけることを忘れないようにしましょう。エラーが出ます。

ルーティング
web.php
Route::get('sitemap', 'SiteMapController@sitemap');

以上のコードを記載したら"https://トップページ/sitemap"にアクセスしてみましょう。
するとsitemap.xmlが出来上がっているはずです。