xmlサイトマップを作成するのにプラグインを使用していましたが、いつの間にか古いサイトマップが消えてしまったので、原因を調べるのもなんだし、自作することにしました。

Search Consoleを見てサイトマップの項目に多くのエラーがあり、古いサイトマップが消えていることがわかりインデックスステータスのグラフも半分以下に落ちていたため「Google XML Sitemaps」プラグインの使用をやめました。

今回作成した関数

以下の2つの関数を「functions.php」に追加しました。

サイトマップ作成関数

ひとつのxmlファイルに全ての投稿と固定ページを更新・公開した順に作成して行きます。


function create_xml_sitemap() {

	$sitemap = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
			'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";

	$args = array(
		'posts_per_page' => -1,
		'orderby' => 'modified',
		'order' => 'DESC',
		'post_type' => array('post','page'),
		'post_status' => 'publish'
	);
	$posts_array = get_posts( $args );
	foreach( $posts_array as $post) {
		$post_modified = explode(' ', $post->post_modified);
		$sitemap .=
			"\t" . '<url>' . "\n" .
			"\t\t" . '<loc>' . get_permalink( $post->ID ) . '</loc>' . "\n" .
			"\t\t" . '<lastmod>' . $post_modified[0] . '</lastmod>' . "\n" .
			"\t\t" . '<changefreq>weekly</changefreq>' . "\n" .
			"\t\t" . '<priority>0.8</priority>' . "\n" .
			"\t" . '</url>' . "\n";
	}
	$sitemap .= '</urlset>' . "\n";

	$fh = fopen( ABSPATH. "sitemap.xml", 'w' );
	if ($fh) {
		fwrite($fh, $sitemap);
		fclose($fh);
		// グーグルに更新したことを通知
		ping_trans( 'http://google.com/ping?sitemap=' . esc_url( home_url('/') ) . 'sitemap.xml');
	}
}
// 投稿ステータスが公開または更新でサイトマップを作成するようにする
add_action( "publish_post", "create_xml_sitemap" );
add_action( "publish_page", "create_xml_sitemap" );

カスタム投稿タイプを使用しているならば、以下のように追加することで対応できます。 例としてカスタム投稿タイプ名が「test」の場合。


'post_type' => array('post','page', 'test'),

add_action( "publish_test", "create_xml_sitemap" );

サイトマップ更新を通知する関数

グーグルにサイトマップの更新を通知する関数します。送信結果を表示することができないので、サイトマップファイルと同じ場所にログファイルを作成して送信結果を記録するようにしました。


function ping_trans($url) {

	$ch = curl_init();
	if ($ch != false) {
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		$result= curl_exec($ch);
		curl_close($ch);

		// 送信結果をログファイルに保存
		if ($result == false) {
			$str = date_i18n("Y-m-d H:i:s") . ' send NG.' . "\n";
		} else {
			$str = date_i18n("Y-m-d H:i:s") . ' send OK.' . "\n";
		}
		$fh = fopen( ABSPATH. "sitemap.log", 'a+' );
		if ($fh) {
			fwrite($fh, $str);
			fclose($fh);
		}
	}
}

サイトマップの XML 形式は、sitemaps.orgに詳しい説明があります。