[CakePHP4]プラグイン無しサイトマップXMLを作成する方法

[CakePHP4]プラグイン無しサイトマップXMLを作成する方法
2021年05月02日2023年10月10日

CakePHP4でSearch Consoleに登録するサイトマップXML(sitemap.xml)を作成する方法を紹介します。

composerでインストールできるパッケージもあったりしますが、CakePHP4に対応してなかったりそもそも動かなかったりするため、自力で作る方法になります。

作成方法はとても単純で、CakePHPで画面を作るように

  • routes.phpのルーティングを追加
  • サイトマップ用のコントローラーを作成
  • サイトマップ用のViewを作成

といった感じになります。ではさっそく実装してみます。

開発環境

CakePHP4.x
PHP7.4
Apache2.4
Mysql8.0

実装方法

ルーティングの追加

まず最初に、ルーティングの追加になります。

Search Consoleに登録するサイトマップのURLはなんでも指定できますが、よくあるパターンとして「/sitemap.xml」でアクセスしたときに表示できるようにしたいと思います。

config/routes.php
// サイトマップ
$builder->connect('/sitemap.xml', ['controller' => 'Sitemap','action'=>'index']);

「 https://example.com/sitemap.xml」でアクセスした際にサイトマップが表示されるように追加しています。

コントローラーの追加

コントローラー新規で作成します。中身はこんな感じです。

src/Controller/SitemapController.php 
<?php
namespace App\Controller;

use App\Consts\ArticleConst;
use Cake\ORM\TableRegistry;

class SitemapController extends AppController
{

    public function initialize(): void
    {
        parent::initialize();

        $this->Articles = TableRegistry::getTableLocator()->get('Articles');
    }

    public function index()
    {
        // layoutを使用しない
        $this->viewBuilder()->disableAutoLayout();
        // レスポンスヘッダをXMLにする
        $this->RequestHandler->respondAs('xml');

        $articles = $this->Articles->find()
            ->where([
            'status' => ArticleConst::STATUS_PUBLIC
        ])
            ->orderDesc('publiced')
            ->limit(20)
            ->toArray();

        $this->set(compact('articles'));
    }
}

今回はSearch Console用のためレイアウトを作成する必要が無いためレイアウトはdisableにしています。

また記事に関しては、公開日(publiced)を公開日順でソートして20件取得するようにしています。

Viewの追加

次にviewを新規追加します。中身はこんな感じです。

/templates/Sitemap/index.php
<?php
/**
 *
 * @var \App\View\AppView $this
 */
?>
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
    <loc><?= $this->Url->build('/',['fullBase'=>true]); ?></loc>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
</url>
<url>
    <loc><?= $this->Url->build('/tags',['fullBase'=>true]); ?></loc>
    <priority>0.5</priority>
</url>
<url>
    <loc><?= $this->Url->build('/categories',['fullBase'=>true]); ?></loc>
    <priority>0.5</priority>
</url>
<?php foreach($articles as $article): ?>
<url>
    <loc><?= $this->Url->build(['controller'=>'Articles','action'=>'view','id_str'=>$article->id_str],['fullBase'=>true]); ?></loc>
    <lastmod><?=$article->modified->format('Y-m-d') ?></lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
</url>
<?php endforeach; ?>
</urlset>

個別ページはDBでデータを管理していないため直接記述しています。

sitemapの項目仕様は下記を参考にすると良いです。

サイトマップの XML 形式

動作確認

完成したsitemapの動作確認は、URLに直接アクセスして確認してください。

当サイトでもこのやり方で開発しています。

https://codesapuri.com/sitemap.xml

Search Consoleに登録できるか確認

問題なければSearch Consoleに登録します。sitemapのURLを登録して「成功しました」とステータスが表示されていれば完了です。

2348623423

まとめ

今回はSearch Consoleに登録するsitemap.xmlの作成方法を紹介しました。

本記事に書いている手順で実装すれば問題なくできるはずなので、ご自身で開発する場合はぜひ参考にしてみてください。

コメント

コメントを残す

お名前(任意)
コメント:新規