【WordPress】PHPで自動更新されるサイトマップの作り方(カテゴリー別も可)

サルワカはWordPressで運営されています。そして、GoogleのSearch Consoleに登録するXMLサイトマップの作成には基本的に「XML-Sitemap」というプラグインを使っています。先日、サイトを英語対応するにあたって特定のカテゴリーだけ別のサイトマップに分けて登録する必要が出てきました。しかし、XML-Sitemapには一部のカテゴリーのサイトマップだけを分けて出力する機能はありません。

一部のカテゴリーのサイトマップだけ別に自動作成するには…

GoogleのSearch Consoleに登録するサイトマップの拡張子は必ずしも「.xml形式」である必要はありません。「.php」というファイルでも中身がXML言語で書かれていれば良いのです(参考 ※英語です)。

プラグインなしで対応

そこでプラグインを使わず、PHPでサイトマップを作ることにしました。WordPressなら関数を使ってラクラクにカテゴリー別、日付別、タグ別などなどで分けたサイトマップを作ることができます(プラグイン「XML-Sitemap」では、そのカテゴリーのサイトマップだけは出力しないような設定をしました)。

作成方法

手順1:新規ファイルを作る

作成先は、外からアクセスできる場所であればどこでも良いでしょう。/wp-content/ディレクトリの中などですね。名前は分かりやすくsitemap.phpなんかにすれば良いかと思います。

手順2:サイトマップ出力用のコードを書く

作成したファイルに以下を参考にコードを書きましょう。

sitemap.php
<?php
echo '<?xml version="1.0" encoding="utf-8" ?>'."\n";//…①
require_once ('../wp-load.php'); //…②
?>

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><!--③-->
<?php query_posts("cat=カテゴリー番号&showposts=表示数"); //…④?>
	<?php
	if ( have_posts() ) :
	while ( have_posts() ) : the_post();
	?>
	<url>
		<loc><?php the_permalink(); //…⑤ ?></loc>
		<lastmod><?php the_modified_date('Y-m-d'); //…⑥ ?></lastmod>
	</url>

<?php
  endwhile;
  endif;
?>
</urlset>

順番に解説していきます。

①:XML宣言です。直接書くとPHPのエラーとなってしまうのでechoで出力しています。

②:記事のURLや最終更新日を取得するにあたって、WordPressの関数を使います。Wordpress関数を外から使うためには、パブリックディレクトリの直下にあるwp-load.phpを読み込みます。詳しくは「WordPress関数を外から使うには」が参考になりそうです。

③:それぞれの記事URLは<url>~</url>で囲みますが、それら全体は<urlset~>~</urlset>で囲います。このあたりの書式はsitemaps.orgで確認するのが良いでしょう。

④:特定のカテゴリーのサイトマップとする場合には、サイトマップに出力したいカテゴリー番号(ID)と表示件数を数字で入力します。例えばquery_posts("cat=10&showposts=100");といった具合ですね。カテゴリー番号の確認方法は「カテゴリーIDとスラッグの調べ方」で解説しています。ちなみに全カテゴリーの記事を100件まで表示させたい場合にはquery_posts("showposts=100");とすればOKです。

⑤:各記事へのパーマリンクを出力します(必須です)。

⑥:更新日(なければ公開日)を出力します(オプションです。不要であればlastmodごと消しましょう)。

これだけ書いておけば、サイトマップとして十分機能します。

一部のページを手動で追加することも

なお、手動でページを追加することもできます。例えば、以下のように書きます。

sitemap.php
~略~

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
	<url>
   	  <loc>https://saruwakakun.com</loc>
	</url>
<?php query_posts("cat=10&showposts=100"); ?>
	<?php
	if ( have_posts() ) :
	while ( have_posts() ) : the_post();
	?>
	<url>
		<loc><?php the_permalink(); ?></loc>
		<lastmod><?php the_modified_date('Y-m-d'); ?></lastmod>
	</url>

<?php
  endwhile;
  endif;
?>
</urlset>

上のように書けば、自動出力されるURL以外にもサイトマップに含めることができます。

ちゃんと作られているかチェック

ここまで出来たら一度表示して問題がないかチェックしておきましょう。ブラウザで~.com/~/sitemap.phpというURLを打ち込めばOKですね。

HTML
<?xml version="1.0" encoding="utf-8" ?>

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
	<url>
    	<loc>https://saruwakakun.com/en</loc>
	</url>
			<url>
    	<loc>https://saruwakakun.com/en/web-safe-fonts</loc>
    	<lastmod>2017-04-20</lastmod>
	</url>

	<url>
    	<loc>https://saruwakakun.com/en/color-ideas</loc>
    	<lastmod>2017-04-20</lastmod>
	</url>

	<url>
    	<loc>https://saruwakakun.com/en/material-color</loc>
    	<lastmod>2017-04-20</lastmod>
	</url>

	<url>
    	<loc>https://saruwakakun.com/en/css3-buttons</loc>
    	<lastmod>2017-04-22</lastmod>
	</url>

</urlset>

ソースを表示するときちんと作成できていることが分かります。

3. Search Consoleに登録する

ここまで出来たらGoogle Search Consoleに登録しましょう。

サイトマップの追加

[サイトマップ][サイトマップの追加/テスト]をクリックします。

URLの入力ボックスが開くのでサイトマップのURLを入力します。あとは一度[テスト]したうえで、[送信]をクリックすればOKです。

送信済みであることが分かる

しばらくするとこのようにサイトマップの送信数が棒グラフで表示されます。

あとはインデックス登録されるまでしばらく待ちます(1週間くらいかかることもあります)。

インデックスに登録済み

インデックスが完了するとこのような表示になります。このようにPHPでXMLサイトマップを作ることもできるのですね。

サルワカ