人間が見る方のサイトマップを作る場合、「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」の場合。
表示したい投稿タイプが複数あるなら、このブロックを複数書いて「投稿タイプ」「タクソノミー」を変えるだけ。
タクソノミーの命名ルールが決まっていれば「投稿名+ルール」でタクソノミーも代入できますね。
見出しには、ラベル名あたりをを代入しても良いかも。
プラグインにできて、このテンプレートで出来ないこと
以上で必要なものは表示できるはずですが、
「登録してあるカスタム投稿タイプを全部拾って表示する」ことは出来ません。
これを実装する場合は、下記のような記事を参考にすれば出来るような気がします。
ただし、表示したい投稿タイプと表示したくない投稿タイプがある場合、結局いちいち除外指定をしなくちゃならないので、あまり省力化ははかれません。
これはプラグインを使っても同じこと。チェックボックスをクリックするだけですが。
というわけで、一応これで完成形。
自分で書いたコードなのでレイアウトや装飾も気が楽です。