プラグイン無しでサイトマップページを作るメモ

ワードプレスのメモ

人間が見る方のサイトマップを作る場合、「PS Auto Sitemap」などのプラグインを使えば簡単ですが、過去に自力で作ったのでメモ。

設置場所

固定ページにすることが多いと思います。

IDで指定しちゃうと、サイトごとにいちいち変える必要が出てくるのでスラッグで指定。

「sitemap」だと「「sitemap.xml」とぶつかっちゃうので避けた方が良いですね

<?php if(is_page('sitemap-page')): ?>
<?php get_template_part( 'assets/content' , 'sitemap' ); ?>
<?php endif; ?>

page.phpに書くには長すぎる、functions.phpに書くとメンテが面倒、なのでパートファイルにしてpage.phpから呼び出してます。

置き場所、ファイル名はなんでもOK。

この例では、テーマフォルダの「assets」フォルダ内の「content-sitemap.php」にしています。

このファイルに、以下の呼び出しブロック「固定ページ、投稿、カスタム投稿タイプ」を書いていきます。

固定ページ

<h3>ページ</h3>
<?php 
	$pageID = get_page_by_path('sitemap-page')->ID;
$args = array(
	'show_home'   => 'トップページ',
	'menu_class'  => 'sitemap-tree-pages',
	'container' => '',
	'sort_column' => 'menu_order',
	'exclude'            => $pageID,
);
wp_page_menu( $args ); ?>
  • 「サイトマップページ」をサイトマップ中に表示したくないので「sitemap-page」のIDを取得して「exclude」で除外
    cssで「current_page_item」を隠せば簡単ですが、応用が利かないので却下。
  • 「トップページ」を先頭にしたいので「show_home」で指定
  • 並べ替え系のプラグインを入れてあればその通りに並ぶ
  • そのほか、「ブログトップ」など表示したくないページがあれば適宜除外

投稿

<h3>ブログ</h3>
<ul>
<?php $args = array(
	'title_li' => __(''),
	'show_count'         => 1,
	'hide_empty'         => 1,
	'use_desc_for_title' => 0,
	'hierarchical'       => 1,
	'current_category'   => 0,
	'pad_counts'         => 0,
	'walker'             => null
); wp_list_categories( $args ); ?>
</ul>

ここは説明の必要ないですね。

カスタム投稿タイプ

<?php $args = array(
	'title_li' => __(''),
	'show_count'			=>	1,
	'hide_empty'			=>	1,
	'use_desc_for_title'	=>	0,
	'hierarchical'			=>	1,
	'current_category'		=>	0,
	'pad_counts'			=>	0,
	'post_type'				=>	'news',
	'taxonomy'				=>	'news_tax',
	'walker'				=>	null
); ?>
<?php $query = new WP_Query( $args ); ?>
<?php if( $query->have_posts() ) : ?>
<h3>ニュース</h3>
<ul>
<?php wp_list_categories( $args ); ?>
</ul>
<?php endif; ?>
<?php wp_reset_postdata(); ?>

これはカスタム投稿名が「news」、表示するタクソノミーが「news_tax」の場合。

表示したい投稿タイプが複数あるなら、このブロックを複数書いて「投稿タイプ」「タクソノミー」を変えるだけ。

タクソノミーの命名ルールが決まっていれば「投稿名+ルール」でタクソノミーも代入できますね。

見出しには、ラベル名あたりをを代入しても良いかも。

プラグインにできて、このテンプレートで出来ないこと

以上で必要なものは表示できるはずですが、

「登録してあるカスタム投稿タイプを全部拾って表示する」ことは出来ません。

これを実装する場合は、下記のような記事を参考にすれば出来るような気がします。

 

ただし、表示したい投稿タイプと表示したくない投稿タイプがある場合、結局いちいち除外指定をしなくちゃならないので、あまり省力化ははかれません。

これはプラグインを使っても同じこと。チェックボックスをクリックするだけですが。

 

というわけで、一応これで完成形。

自分で書いたコードなのでレイアウトや装飾も気が楽です。