【WordPress】プラグインなしでHTMLサイトマップを作成する

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】が有効になる。ただし、実際に使用する時は、【】を[]に変更すること。

コードの解説

  1. ob_start()で出力をバッファ
  2. get_template_part('sitemap')sitemap.phpを読み込む
  3. ob_get_clean()でバッファ出力&バッファクリア
  4. 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 をコンマで区切ったリストで定義