wp_list_pages利用時にカスタム分類での絞り込みを実現してみる

フォーラムのタクソノミーのターム別記事一覧表示にて回答した内容です。
ごく稀なケースで、あまり汎用的なものではないと思いますが、なんかの参考になれば幸いです。

質問の概要はというと、「階層構造を表現しつつ、カスタム分類での絞り込みを行った一覧表示を実現したい」というもの。

階層構造の表現しつつ一覧表示するには、wp_list_pages を利用するのが最も簡単で、私自身もサイトマップのプラグイン(横着者)やサブナビのウィジェット(横着者)で大変お世話になっています。

ただ、wp_list_pagesにどのようにパラメータを指定しても、そのままでは絞り込みはできません。

では、どうにも出来ないのかというと、そうではなく、wp_list_pages 内部で記事の取得を行っている get_pages にフックし、分類でのフィルタリングを行うことで、パラメータ指定での絞り込みが実現できるようになるのです。

下記のCODE 1を、テーマのfunctions.phpなどに追記してもらえれば、分類での絞り込みが可能になります。
指定方法は、taxonomyterm の指定が必要で、termは分類のスラッグで指定します。
また、親記事が分類に属していない場合、 hide_children を true または 1 と指定すると、子記事が分類に属していた場合でも表示されなくなるようにしています。

CODE 1

function tax_option_get_pages( $pages, $r ) {
	if ( isset( $r['taxonomy'] ) && isset( $r['term'] ) && in_array( $r['taxonomy'], get_object_taxonomies( $r['post_type'] ) ) && get_term_by( 'slug', $r['term'], $r['taxonomy'] ) ) {
		$excludes = array();
		foreach ( $pages as $key => $page ) {
			if ( ! is_object_in_term( $page->ID, $r['taxonomy'], $r['term'] ) ) {
				unset( $pages[$key] );
				if ( is_post_type_hierarchical( $r['post_type'] ) && isset( $r['hide_children'] ) && $r['hide_children'] ) {
					$children = get_page_children( $page->ID, $pages );
					foreach ( $children as $child ) {
						$excludes[] = $child->ID;
					}
				}
			}
		}
		foreach ( $pages as $key => $page ) {
			if ( in_array( $page->ID, $excludes ) ) {
				unset( $pages[$key] );
			}
		}
	}
	return $pages;
}
add_filter( 'get_pages', 'tax_option_get_pages', 10, 2 );

wp_list_pagesの指定例

CODE 2(文字列型での指定)

wp_list_pages( 'post_type=seminar&title_li=&taxonomy=area&term=tokyo&hide_children=true' );

CODE 3(配列型での指定)

wp_list_pages(
	array(
		'post_type'		=> 'seminar',
		'title_li'		=> '',
		'taxonomy'		=> 'area',
		'term'			=> 'tokyo',
		'hide_children'	=> true
	)
);

おまけ

wp_list_pagesは、WordPress3.1からpost_typeのパラメータを持てるようになり、階層構造を持つ投稿タイプであれば、パラメータを指定するだけで、リストの表示ができるようになっています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です