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 をコンマで区切ったリストで定義