WordPressサイトで自動更新されるHTMLサイトマップを、プラグインなしで作成するコードと解説。
コンテンツ
サイトマップを表示する固定ページを作成する
固定ページを新規作成し、ページタイトルをサイトマップとして保存する。
次に、作成した固定ページのIDを調べておく。
例:作成した固定ページのIDは、61だった。
サイトマップを表示させるテンプレートファイルを作成する
サイトマップを自動生成するためにはPHPを使いますが、固定ページではPHPが使えない。そこで、テンプレートファイルを作成し、ショートコードで固定ページに読み込ませる。
下記にあるサイトマップを自動生成するコードをエディターで作成し、ファイル名をsitemap.phpとして保存する。
<div id="sitemap">
  <h2>Webサイトについて</h2>
  <ul>
    <!-- 固定ページ -->
    <?php wp_list_pages('title_li=&exclude='); ?>
  </ul>
  <h2 class="satemap-cat">コンテンツリスト</h2>
  <ul>
    <!-- 投稿(カテゴリー単位 -->
    <?php
    $categories = get_categories('parent=0&exclude=');
    foreach ($categories as $category) :
    ?>
      <li><a href="<?php echo get_category_link($category->term_id); ?>"><?php echo $category->cat_name; ?>
          <span class="total-number">(<span class="total-number2"><?php echo $category->count; ?></span>)</span></a>
        <ul>
          <?php
          $categorylist = array(
            'cat' => $category->cat_ID,
            'posts_per_page' => 10,
            'post__not_in' => array(),
          );
          ?>
          <?php
          query_posts($categorylist);
          if (have_posts()) : while (have_posts()) : the_post();
          ?>
              <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
          <?php endwhile;
          endif;
          wp_reset_query(); ?>
        </ul>
      </li>
    <?php endforeach; ?>
  </ul>
</div>
固定ページのIDを記述する
sitemap.phpをエディターで編集し、固定ページのIDを記述する。これにより、サイトマップにサイトマップ自身へのリンクが表示されなくなる。
<!-- 固定ページ -->
wp_list_pages('title_li=&exclude='); //この行で除外する固定ページのIDを指定する
今回、固定ページのIDは61なので、下記のように記述する。
<!-- 固定ページ -->
wp_list_pages('title_li=&exclude=61'); //投稿ID 61を除外する場合
sitemap.phpをアップロードする
ファイルを保存したら、親テーマフォルダのstyle.cssと同じ階層にアップロードする。
サイトマップを表示させるショートコードを作成する
先ほどアップロードしたテンプレートファイルを、最初に作成した固定ページに読み込むためのショートコードを作成する。
functions.phpに以下のコードをコピペする。
function site_map() {
  ob_start();
  get_template_part('sitemap');
  return ob_get_clean();
}
add_shortcode('site-map', 'site_map');
これにより、ショートコード【site-map】が有効になる。ただし、実際に使用する時は、【】を[]に変更すること。
コードの解説
ob_start()で出力をバッファget_template_part('sitemap')でsitemap.phpを読み込むob_get_clean()でバッファ出力&バッファクリアreturnで返す
なぜバッファリングを用いるのか?
→ページの予期しない箇所に出力されてしまうから。
echoを普通に使ってしまっては、勝手に出力されてしまいます。そこで、returnを使用するようにすれば、勝手に出力されることはなくなります。ただ、echo文をreturn文に書き換えまくるのはちょっとしんどいことが多いと思います。そこで、もう一工夫します。
(もともとショートコードはreturnを使うことを想定した仕様となっているっぽいですが…)
PHP(4以上)には、標準で出力のバッファリングの機能がついています。これを使って、画面ではなくバッファの方へechoで出力しておいて、そのバッファをまるごとreturnする手法が使えます。
サイトマップページにショートコードを記述する
作成したショートコードを、サイトマップページのショートコードブロックに記述する。

サイトマップページ( https://sunakoto.com/sitemap/ )にアクセスして、表示を確認する。
以上でサイトマップは完成。
サイトマップの表示内容をカスタマイズする
投稿の表示件数を変更する
‘posts_per_page’ => 2の部分に、表示件数を指定する。
すべての投稿を表示させる場合は、‘posts_per_page’ => -1とする。
$categorylist = array(
   ‘cat’ => $category->cat_ID,
   ‘posts_per_page’ => 2, //この行の数値を変更する
   ‘post__not_in’ => array(),
);
特定の投稿をサイトマップから除外する
array( 投稿ID )の投稿IDの部分に、表示させたくない投稿の投稿IDを記述する。
例:array( 3 )
$categorylist = array(
   'cat' => $category->cat_ID,
   'posts_per_page' => 2,
   'post__not_in' => array(投稿ID), //この行で除外する投稿IDを指定する
);
除外したい投稿が複数ある場合
array( 投稿ID, 投稿ID )の部分に、表示させたくない投稿の投稿IDをカンマで区切って記述する。
例:array( 3, 6 )
$categorylist = array(
   'cat' => $category->cat_ID,
   'posts_per_page' => 2,
   'post__not_in' => array(投稿ID, 投稿ID), //この行で除外する投稿IDを複数指定する
);
特定のカテゴリーに属する全ての記事をサイトマップから除外する
除外したいカテゴリーが1つだけの場合
exclude=’の部分を、exclude=カテゴリーID’に書き換える。
   $categories = get_categories(‘parent=0&exclude=’); //この行で除外するカテゴリのIDを指定する
カテゴリIDが3の投稿を除外する場合。
   $categories = get_categories(‘parent=0&exclude=3’); //カテゴリID 3を除外する場合
除外したいカテゴリーが複数ある場合
exclude=カテゴリーID, カテゴリーID’の部分に、表示させたくないカテゴリーのIDをカンマで区切って記述する。
   $categories = get_categories(‘parent=0&exclude=カテゴリーID, カテゴリーID’); //この行で除外するカテゴリのIDを複数指定する
カテゴリIDが3と5のを除外する場合
   $categories = get_categories(‘parent=0&exclude=3, 5’); //カテゴリID 3と5を除外する場合
特定の固定ページをサイトマップから除外する
サイトマップページ自身を除外する方法と同じ。複数の固定ページを除外する時は、カンマで区切ればいくつでも投稿IDを除外できる。
関数カンファレンス
- wp_list_pages()
- 固定ページへのリンクのリストを表示
 - 引数:exclude
- リストから除外したいページの ID をコンマで区切ったリストで定義
 
 - 引数:title_li
- ページリストの見出しのテキストとスタイルを設定します。デフォルトは (‘Pages’) です。ブログ上では「ページ」と表示されます ((”) はローカライゼーションのためのものです)。空の値のとき (”) は見出しを表示しません。また、リストは<ul></ul>タグで包まれていません。
 
 
 - get_categories()
- 問い合わせパラメータにマッチするカテゴリーのオブジェクトを配列として返します。
 - 引数:parent=0
- カテゴリー ID で指定されたカテゴリーの直接の子カテゴリーのみを取得します。
 
 - 引数:exclude
- リストから除外したいページの ID をコンマで区切ったリストで定義
 
 
 
