【Laravel備忘録】「laravelium/sitemap」でサイトマップインデックスがフルパスにならない問題

★環境
 PHPフレームワーク:Laravel 8.x
 ライブラリー: laravelium/sitemap
 サイトマップ保存先: /public/storage/sitemap/

Laravelで「laravelium/sitemap」を追加して、XMLサイトマップを作成しました。

作成方法は「$sitemap->store」メソッドを使った静的ファイルの生成です。

その際に、ページ数が多いため、サイトマップインデックスを作成した所、「Google Search Console」に登録したらエラーになりました。

原因は、サイトマップインデックスの子サイトマップ「<loc>タグ」がフルパスでなく、相対パスだったからです。

「Google Search Console」ではフルパスにする必要があります。

結果として修正するため 「laravelium/sitemap」 本体に手を入れました。
 ※私は見つけられませんでしたが、もしかしたら、修正しなくても解決できる方法があるかもしれません

追記:パス用の変数とセットメソッドを用意

private $xml_save_path = null;

public function setXml_save_path($xml_save_path){
	$this->xml_save_path = $xml_save_path;
}

修正1:storeメソッドの修正

// 追記1
    public function store($format = 'xml', $filename = 'sitemap', $path = null, $style = null)
    {
        // turn off caching for this method
        $this->model->setUseCache(false);

        // use correct file extension
        (in_array($format, ['txt', 'html'], true)) ? $fe = $format : $fe = 'xml';

        if (true == $this->model->getUseGzip()) {
            $fe = $fe.".gz";
        }

        // use custom size limit for sitemaps
        if ($this->model->getMaxSize() > 0 && count($this->model->getItems()) > $this->model->getMaxSize()) {
            if ($this->model->getUseLimitSize()) {
                // limit size
                $this->model->limitSize($this->model->getMaxSize());
                $data = $this->generate($format, $style);
            } else {
                // use sitemapindex and generate partial sitemaps
                foreach (array_chunk($this->model->getItems(), $this->model->getMaxSize()) as $key => $item) {
                    // reset current items
                    $this->model->resetItems($item);

                    // generate new partial sitemap
                    $this->store($format, $filename.'-'.$key, $path, $style);

                    // add sitemap to sitemapindex
                    if ($path != null) {
                        // if using custom path generate relative urls for sitemaps in the sitemapindex
                        //$this->addSitemap($filename.'-'.$key.'.'.$fe);
                        $this->addSitemap(url($this->xml_save_path.$filename.'-'.$key.'.'.$fe));
                    } else {
/vendor/laravelium/sitemap/src/Laravelium/Sitemap/Sitemap.php

コントローラー

$sitemap = App::make('sitemap');
$sitemap->model->setMaxSize(1000); // 1xmlあたりのURL数
		
foreach($this->sitemap_url as $val){
  $sitemap->add(URL::to($val), null, '1.0', 'daily');
}

// サイトマップXMLの保存先pathを指定
$xml_save_path = '/storage/sitemap/';
$sitemap->setXml_save_path($xml_save_path);

// サイトマップXML生成
$sitemap->store('xml', 'sitemap', public_path().$xml_save_path);
よかったらシェアしてね!
目次
閉じる