【WordPress】サイトマップ生成をプラグインなしで自動生成
ふと,サイトマップのファイルを見てみたら,制御文字(タブとか)が XML の中に紛れ込んでいることに気が付いた.
WordPress のプラグインで,最近 Google XML Sitemaps の更新があったな,と設定画面を確認してみると,
Add Google Analytics TID:
と Google アナリティクスのトラッキングIDを入力する欄が増えている.
しかも,無視して設定を更新しようとしたら必須入力だという.
なぜサイトマップを作るのにアナリティクスの ID がいるのか?
これはもうこのプラグイン(XML Sitemaps)を使用する必要性を全く感じないので急遽自作で対応することにした.
生成するツールだと更新する度に実行してサイトマップを生成することになるので面倒くさい.
よって動的にサイトマップを生成することにした.

よくみると,名前も Google XML Sitemaps から,XML Sitemaps に変わっている.
Google をとったのになぜアナリティクスの ID をいれさせる?
プラグイン無しでのサイトマップの作り方
WordPress の場合,また「別のプラグイン探せばいいや」となりがちだが,また同じ問題が起こる可能性がある.
よって,いつもの如く,functions.php に追加する方法で作ってみる.
シンプルイズベストで最小限のものを作ったので,カスタマイズしたい人はここから自由にどうぞ.
functions.php
functions.php でまず,sitemap.xml を横取りするスクリプトを追加する.
/* rewite_rules_array
* リライトルールの書き替え
*/
function my_rewrite_rules_array($rules) {
// sitemap.xml へのアクセス時にURLをリライト
$new_rules["^sitemap\.xml$"] = "index.php?feed=sitemap";
return $new_rules + $rules;
}
add_action('rewrite_rules_array', 'my_rewrite_rules_array', 10, 1);
/* do_feed_sitemap
* サイトマップ用のfeedテンプレートのロード
*/
function my_do_feed_sitemap() {
load_template(get_template_directory() . '/make-sitemap.php');
}
add_action('do_feed_sitemap', 'my_do_feed_sitemap');
サイトマップのテンプレートファイル
サイトマップの元になるテンプレートファイルを作る.
ここでは make-sitemap.php という名前で作った.これを functions.php と同じテーマの中に入れる.
<?php
header('Content-Type: text/xml; charset=' . get_option('blog_charset'), true );
echo '<?xml version="1.0" encoding="' . get_option('blog_charset') . '"?>' . "\n";
$args = array(
'posts_per_page' => -1,
'orderby' => 'modified',
'post_type' => array('post', 'page'),
'order' => 'DESC'
);
$the_query = new WP_Query($args);
?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc><?php echo home_url(); ?></loc>
<lastmod><?php echo date('Y-m-d', strtotime(get_lastpostdate('blog'))); ?></lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
<?php
while ($the_query->have_posts()) {
$the_query->the_post();
?>
<url>
<loc><?php echo get_the_permalink(); ?></loc>
<lastmod><?php echo get_the_modified_date('Y-m-d'); ?></lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<?php }; ?>
</urlset>
カスタム投稿タイプを作っている時は post_type に追加する.
パーマリンク設定を更新
リライトルールに追加しているので,「設定」→「パーマリンク」で最後にある「変更を保存」ボタンでリライトルールの更新を忘れないこと.
注意点
このサイトマップは一つのファイルで済ませているので,あまりにサイトが巨大な場合は対応できない.
ページ数5万を超えるか,サイトマップのサイズが 50MB を超えると Google は受け付けてくれないようなので気をつけましょう.
なお,サイトマップは /sitemap.xml という名前で出来るので,サーチコンソールなどに登録する際は https://www.xxxxxx.co.jp/sitemap.xml などという URL で登録することになる.