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に詳しい説明があります。
はじめまして。よろしくお願いします。
こちらの記事のソースをそのまま使っていますが、Googleコンソールで「送信された URL に noindex タグが追加されています」というエラー回避のため、「お問い合わせページ」や「404ページ」など該当するコンテンツからnoindexを外すのではなく、特定の固定ページや投稿を指定してXMLサイトマップから除外するには、どうしたら良いのでしょうか?
別途追加するソースが必要ならご教授していただければと思います。
刈谷様、はじめまして。
XMLサイトマップ作成時に特定のページを外すには、配列の$args にexcludeを追加すれば良いです。
例えば以下のようになります。
‘exclude’ => ‘10,12’
この場合は、ID10と12がget_postsで呼び出されません。
試してみてください。