人間が見る方のサイトマップを作る場合、「PS Auto Sitemap」などのプラグインを使えば簡単ですが、過去に自力で作ったのでメモ。
設置場所
固定ページにすることがほとんどと思います。
IDで指定しちゃうと、サイトごとにいちいち変える必要が出てくるのでスラッグで指定。
「sitemap」だと「「sitemap.xml」とぶつかっちゃうので避けた方が良いですね。
<?php
if( is_page( 'sitemap-page' ) ){
get_template_part( 'assets/content', 'sitemap' );
}
?>
page.phpに書くには長すぎる、functions.phpに書くとメンテが面倒、なのでパートファイルにしてpage.phpから呼び出してます。
置き場所、ファイル名はなんでもOK。
この例では、テーマフォルダの「assets」フォルダ内の「content-sitemap.php」にしています。
このファイルに、以下の呼び出しブロック「固定ページ、投稿、カスタム投稿タイプ」を書いていきます。
固定ページ
<?php
$ex_pages = [
'post_type' => 'page',
'orderby' => 'menu_order',
'order' => 'ASC',
'posts_per_page' => '-1'
];
$query = new WP_Query( $ex_pages );
$ex_id = '';
if( $query->have_posts() ){
while( $query->have_posts() ){
$query->the_post();
$title = get_post()->post_name;
if( strstr( $title, 'blog' ) || strstr( $title, 'result' ) || strstr( $title, 'results' ) || strstr( $title, 'confirm' ) || strstr( $title, 'error' ) || strstr( $title, 'arg' ) || strstr( $title, 'sitemap' ) ){
$ex_id .= get_post()->ID . ',';
}
}
$args = [
'show_home' => 'トップページ',
'menu_class' => 'sitemap-tree-pages',
'container' => '',
'sort_column' => 'menu_order',
'exclude' => $ex_id,
];
echo '<div class="sitemap-tree page-sitemap-tree">';
echo '<h3>ページ</h3>';
wp_page_menu( $args );
echo '</div>';
}
wp_reset_postdata();
?>
「wp_page_menu()」だと、除外したいページをIDで指定するしかないみたいですが、大変面倒くさい。
ので、あらかじめループを回しておいて、スラッグに特定の文字列を含むページをリストアップして「exclude」に適用。
例ではblog、result、results、confirm、error、arg、sitemap
固定ページのブログトップ、フォームの確認/エラー/完了ページ、URL引数を取るフォームページ、サイトマップページなどのスラッグを上記ルールで設定すればOK。
投稿
<?php
$args = array(
'post_type' => array( 'post' ),
);
$query = new WP_Query( $args );
if( $query->have_posts() ){ ?>
<div class="sitemap-tree">
<h3><a href="<?php echo get_post_type_archive_link( 'post' ); ?>"><?php echo get_post_type_object( 'post' )->labels->name; ?></a></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,
'show_option_none' => ''
);
wp_list_categories( $args ); ?>
</ul>
</div>
<?php
}
wp_reset_postdata();
?>
カスタム投稿タイプ
<?php
$args = array(
'public' => true,/* 公開された(publicな)投稿タイプのみ */
'_builtin' => false,/* デフォルトの投稿タイプを除外 */
);
$output = 'names';
$operator = 'and';/* 'and' or 'or' */
$post_types = get_post_types( $args, $output, $operator );
foreach( $post_types as $post_type ){
$taxonomies = get_taxonomies( array( 'object_type' => array( $post_type ) ) );
foreach( $taxonomies as $tax ){
$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' => $post_type,
'taxonomy' => $tax,
'walker' => null,
'show_option_none' => ''
);
$query = new WP_Query( $args );
if( $query->have_posts() ){ ?>
<div class="sitemap-tree">
<h3><a href="<?php echo get_post_type_archive_link( $post_type ); ?>"><?php $label = get_post_type_object( $post_type ); echo $label->label; ?></a></h3>
<ul>
<?php
wp_list_categories( $args );
?>
</ul>
</div>
<?php
}
wp_reset_postdata();
break;
}
}
?>
タクソノミーは、最初に登録されたものに決め打ちです。