XMLサイトマップの作成をwordpressのテーマ内で完結させる
大きなサイトであればgoogleに確実にインデクスしてらうためにXMLサイトマップを設置する。逆に言えば、普通のサイトだとあまり必要性がない。とはいえいったん作ってしまうと、消してしまってもしSEO的にデメリットがあったら嫌だなーという消極的な理由で漫然と使い続けることに…。
さて、そんな悩ましいXMLサイトマップですが、wordpressではページ構成が流動的なので自動作成プラグインで対応、というのが普通です。私も基本的にはそうしています。でも、ページやカスタム投稿タイプによってドメインを切り分けるようなちょっと特殊なマルチサイトなんかになると、プラグインではカスタマイズが面倒くさい。で、自分で好きにカスタマイズできるようにと、しばらく前に海外のTIPSを参考に設置したものです。get_postsをポストタイプなどで分岐させれば、更新頻度やプライオリティなどの設定も自由にできます。投稿のたびにxmlを作成するので、何千ページという規模のサイトに向きませんが、プラグインを使わなければ更新の心配もないし、込み合った管理画面のメニューが一つ減るのも地味に嬉しい。
CODE : Generate Sitemap.xml
<?php
/////////////////////// sitemap.xmlの作成 ///////////////////////
add_action( "publish_post", "create_xml_sitemap" ); // カスタム投稿の場合publish_{$post_type}で指定
add_action( "publish_page", "create_xml_sitemap" );
// add_action( "save_post", "create_xml_sitemap" ); // 修正ごとに更新する場合の指定
function create_xml_sitemap() {
$args = array(
'numberposts' => -1,
'orderby' => 'modified',
'post_status' => 'publish',
'post_type' => array('post','page'), // カスタム投稿が必要なら追加で指定
'order' => 'DESC'
);
$sitemaps = '';
foreach( get_posts( $args ) as $post):
$post_modified = explode(" ", $post->post_modified);
$sitemaps .=
"t".'<url>'."n".
"tt".'<loc>'. get_permalink( $post->ID ) .'</loc>'."n".
"tt".'<lastmod>'. $post_modified[0] .'</lastmod>'."n".
"tt".'<changefreq>weekly</changefreq>'."n". // daily || weekly || monthly || yearly
"t".'</url>'."n";
endforeach;
$sitemap =
'<?xml version="1.0" encoding="UTF-8"?>'."n".
'<urlset xmlns="//www.sitemaps.org/schemas/sitemap/0.9">'."n".
$sitemaps.
'</urlset>'."n";
$fopen = fopen( ABSPATH. "sitemap.xml", 'w' ); // 最上位フォルダにサイトマップをオープン || 存在しない場合には作成
fwrite($fopen, $sitemap);
fclose($fopen);
}
?>