Mill's Note

【Wordpress Tips】XML Sitemapの作り方

/

XMLサイトマップはサイトを素早くクロールしてもらう必須アイテム。

XMLサイトマップの作り自体は投稿一覧を作るのとあまり変わりません。カスタムフィールドで作ったnoindexを除外にしたり、非公開を載せないなど、必要 (好み?) に応じてカスタマイズできます。

サイトマップは、プラグインでもWordpressの自動出力でも簡単に設置できますよね^^

プラグインは「優先度や更新頻度」などが設定できたり多機能を売りにしていますが、Google様も「優先度や更新頻度」は重視しないと言っているし、News用設定とか普通は不要。
これだけの為にプラグイン入れるのもなぁ。。

単純なサイトマップならWordpressの自動出力で十分 !
なのですが、noindex が反映されない、非公開も載ってしまう、投稿者リンクが作られる(投稿者ページいらないのに、、)、(以前ですが) 削除した投稿が残ったりした事も。。
と微妙な点も _ _;;

自作にすれば、掲載非掲載も何を載せるかも設定次第、ページ分割も好きに出来るし、メンテも楽です^^

ただ、2か所に分けて設置する必要があるので、いつも度忘れ_ _;;
なので、コードと併せて ( ..)φメモメモ

XMLサイトマップの使い方と設置方法

コードが多いので、先に説明^^

1. 出力用ファイルを作成 (xml)

シンプルに「目次、ページ用(投稿+固定ページ)、カテゴリ用」の3ファイルのみにしています。
タグ用を作りたいとか、投稿と固定ページを分けたい場合は、sitemap3, sitemap4 … と増やしてもOKです^^

  1. sitemap-index.xml (目次用), sitemap1.xml (ページ用), sitemap2.xml (カテゴリー用) 3つの xml ファイルを作成
    稼働すると自動で記載されますので、中には何も書かず空のままにしておきます。
  2. sitemap フォルダを作って出力用ファイルを格納
  3. sitemap フォルダを、 wpルート( config.php 等があるディレクトリ ) に設置
    (このままでは何もしないので先に設置してもOKです^^)

sitemap-index は、一度書き込みが行われると書き換えが行われない事があります。
URLの異なる環境で作動確認をした場合や、php側でURL等を修正した場合は一旦 xml 内にあるデータを全て削除し空の状態に戻してから、再度稼働させてください。

2. 設定用ファイルを作成 (php)

xml ファイルに対応させた、設定ファイルを作成します。(xmlを増やした場合は、設定用phpも同じだけ作成します。)

  1. 下に掲載したコードをコピペして、それぞれ sitemap-index.phpsitemap1.phpsitemap2.php として作成
  2. inc-sitemap フォルダを作って設定用ファイルを格納
  3. テーマルート (style.css とか functions.php 等のあるディレクトリ) に設置
    (このままでは何もしないので先に設置してもOKです^^)

3. functions.phpで呼び出し

以下のコードをfunctions.phpに記載して、サイトマップを稼働させます

※sitemap1.php、 sitemap2.php は、sitemap-index.phpで呼び出しますのでfunctionsには記載しません。

PHP
include_once get_template_directory() . '/inc-sitemap/sitemap-index.php';

4. 作動確認

投稿の更新、又は、新規投稿を行うと、自動的に xml に書き込まれ、作動開始。この後は投稿の追加・更新が行われると自動で書き換えられます。

設定直後に、一度適当な投稿を作成するか、更新してから、xmlを開いて確認を行ってください。

xnl検証用URLと出力結果
sitemap-index.xml URLhttps://ドメイン/wp設置ディレクトリ/sitemap/sitemap-index.xml
sitemap-index 出力結果/* このように出力されればOK */
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>https://〇〇/sitemap/sitemap1.xml</loc>
  </sitemap>
  <sitemap>
    <loc>https://〇〇/sitemap/sitemap2.xml</loc>
  </sitemap>
</sitemapindex>
itemap1.xml  URLhttps://ドメイン/wp設置ディレクトリ/sitemap/sitemap1.xml
itemap1 出力結果/* このように出力されればOK */
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://〇〇/</loc> /* トップページ */
    <lastmod>2024-08-18T16:01:49+09:00</lastmod>
  </url>
  <url>
    <loc>https://〇〇/カテゴリ/投稿/</loc> 
    <lastmod>2024-08-18T16:01:49+09:00</lastmod>
  </url>
  ~~~ /* 公開済 投稿・固定ページ全て */
</urlset>
sitemap2.xml  URLhttps://ドメイン/wp設置ディレクトリ/sitemap/sitemap2.xml
itemap2 出力結果/* このように出力されればOK */
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://〇〇/カテゴリ/</loc> 
    <lastmod>2024-08-18T16:01:49+09:00</lastmod>
  </url>
  ~~~ /* 公開済 カテゴリ全て */
</urlset>

5. サーチコンソールに登録

確認URLに想定通りに出力されていたら、サーチコンソールのサイトマップに sitemap-index.xml を登録します。

sitemap-index.xml が「成功しました」になっていたら、そこをクリック。itemap1.xmlitemap2.xml が紐づけられ、それぞれの登録件数が表示されていれば成功です^^

sitemap-index.xml が「成功しました」になっていても、itemap1.xml、itemap2.xml が失敗している事もあります。

多いのはリンク違い。
wp設置ディレクトリ の入れ忘れや、sitemap-index.xml を空にし忘れてリンク先がテストサイトになっているとか。
上手く登録されない時は、XLMファイルやサーチコンソールに書かれているURLの確認をお勧めしますm(__)m

設定用 phpコード

sitemap-index.php

目次を書き出すファイルです。sitemap-index.php で保存します。

PHP
<?php 
include_once get_template_directory() . '/inc-sitemap/sitemap1.php';
include_once get_template_directory() . '/inc-sitemap/sitemap2.php';
function sitemap_index_xml() {
  $sitemap = '';
  $sitemap .= '<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>' . esc_url( home_url('/wp設置ディレクトリ/sitemap/sitemap1.xml')) . '</loc>
  </sitemap>
  <sitemap>
    <loc>' . esc_url( home_url('/wp設置ディレクトリ/sitemap/sitemap2.xml')) . '</loc>
  </sitemap>
</sitemapindex>' . PHP_EOL;

  $fp = fopen( ABSPATH . "sitemap/sitemap-index.xml", 'w' );
  if ($fp) {
    fwrite($fp, $sitemap);
    fclose($fp);
  }
}
add_action( "publish_post", "sitemap_index_xml" );

ページを増やした場合は、以下のように、3のセット、4のセット… を作り、それぞれの位置に追加します

PHP
/* ▼ function の上に追加 */
include_once get_template_directory() . '/inc-sitemap/sitemap3.php';

/* ▼ </sitemapindex>の上に追加 */
  <sitemap>
    <loc>' . esc_url( home_url('/wp設置ディレクトリ/sitemap/sitemap3.xml')) . '</loc>
  </sitemap>

sitemap1.php

投稿と固定ページを書き出すファイルです。sitemap1.php で保存します。

PHP
<?php
function sitemap1_xml() {
  $sitemap1 = '';
  $sitemap1 .= '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>' . esc_url(home_url('/')) . '</loc>  /* サイト(トップページ)を先頭に */
    <lastmod>' . get_the_modified_date('c') . '</lastmod>
  </url>';
  $home = get_page_by_path('home', OBJECT, 'page'); $home_id = $home->ID;
  $args = array(
    'posts_per_page' => -1,
    'orderby' => 'modified',
    'order' => 'DESC',
    'post_type' => array('post','page'), /* 投稿(post), 固定ページ(page)を指定 */
    'post_status' => 'publish',          /* 公開ページのみ */
    'post__not_in' => array($home_id),   /* 日付の異なるトップurlを外す為、固定ページのトップページを除外 */
    'meta_query' => [
      'relation' => 'OR',
      [
        'key' => 'noindex_check',       /* noindex_checkページを外す */
        'value' => '0',
        'compare' => '='
      ],
      [
        'key' => 'noindex_check',
        'compare' => 'NOT EXISTS'
      ]
    ],
  );
  $the_query = new WP_Query( $args );
  while ( $the_query->have_posts() ) { 
    $the_query->the_post();
    $sitemap1 .= '
  <url>
    <loc>' . get_permalink() . '</loc>
    <lastmod>' . get_the_modified_date('c') . '</lastmod>
  </url>';
  } wp_reset_postdata();

  $sitemap1 .= '
</urlset>' . PHP_EOL;
	
  $fp = fopen( ABSPATH . "sitemap/sitemap1.xml", 'w' );
  if ($fp) {
    fwrite($fp, $sitemap1);
    fclose($fp);
  }
}
add_action( "publish_post", "sitemap1_xml" );
add_action( "publish_page", "sitemap1_xml" ); 

sitemap2.php

カテゴリーを書き出すファイルです。sitemap2.php で保存します。

<?php
function sitemap2_xml() {
  $sitemap2 = '';
  $sitemap2 .= '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';

  $cats = get_categories();
  foreach ( $cats as $cat ) {
    $sitemap2 .= '
  <url>
    <loc>' . esc_url(get_category_link($cat->term_id)) . '</loc>';
    /* ▼ <lastmod>を入れる為、紐づいた最新投稿の日付を取得 / 日付が不要なら投稿取得部分は削除OK */
    $args = array(
      'post_type' => array('post'), 
      'post_status' => 'publish',
      'cat' => $cat->term_id,
      'posts_per_page' => 1,
      'orderby' => 'modified',
      'order' => 'DESC'
    );
    $the_query = new WP_Query($args);
    if ($the_query->have_posts()) { while ($the_query->have_posts()) { 
      $the_query->the_post();
      $sitemap2 .= '
    <lastmod>' . get_the_modified_date('c') . '</lastmod>';
      } 
    } wp_reset_postdata();
    /* ▲ ここまで投稿取得 */
    $sitemap2 .= '
  </url>';
  }
  $sitemap2 .= '
</urlset>' . PHP_EOL;
	
  $fp = fopen( ABSPATH . "sitemap/sitemap2.xml", 'w' );
  if ($fp) {
    fwrite($fp, $sitemap2);
    fclose($fp);
  }
}
add_action( "publish_post", "sitemap2_xml" );

ページを増やしたい場合

個別ページの場合

  • 投稿と固定ページを分ける、カスタム投稿ページ用を作る等なら、sitemap1.php を複製して、sitemap1となっている部分を sitemap3とかsitemap4等、ファイル名と合わせて変更
  • 'post_type'=> を載せたい投稿タイプに変更
  • フックは add_action( "publish_post", "sitemap〇_xml" ); でOK (作成したxmlファイル名)

アーカイブページの場合

  • タグページ、カスタムタクソノミー用なら、sitemap2.php を複製して、sitemap2となっている部分を sitemap3とかsitemap4等、ファイル名と合わせて変更
  • それぞれに合わせた呼び出しコードを記載
  • フックは add_action( "publish_post", "sitemap〇_xml" ); でOK (作成したxmlファイル名)