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

ワードプレス

人間が見る方のサイトマップを作る場合、「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;
	}
}
?>

タクソノミーは、最初に登録されたものに決め打ちです。