登録済みのカスタム投稿タイプと、そのタクソノミーの一覧

ワードプレス

codexにすばり書いてある内容なのですが、検索ワードが悪かったのか、なかなかたどり着かなかったのでメモ。

「カスタム投稿タイプ 一覧」みたいなワードだと、「タクソノミーアーカイブページの作り方」みたいな記事が出ちゃいます。

「カスタム投稿タイプ 取得」で良かったのね。

カスタム投稿タイプの一覧

<?php
$args = array(
	'public'	=> true,// 公開された(publicな)投稿タイプのみ
	'_builtin'	=> false,// デフォルトの投稿タイプを除外
);
$output = 'names'; // names or objects, note names is the default
$operator = 'and'; // 'and' or 'or'
$post_types = get_post_types( $args, $output, $operator ); 
foreach( $post_types as $post_type ){
	echo '<p>' . $post_type . '</p>';
}
?>

これはcodexそのまんま。

※publicと_builtinを指定しないと、余計なものが出力されちゃいます。

post page attachment revision nav_menu_item custom_css customize_changeset oembed_cache user_request wp_block acf-field-group acf-field mw-wp-form

使ってるプラグインがバレバレです!

一覧に表示したくない投稿タイプ

単独で表示することのない投稿タイプの場合、投稿タイプの宣言に

  • ‘public’ => false,
  • ‘show_ui’ => true,

を加えておくと、この一覧には表示されません。

「特定のタームの記事に追加情報として表示する」という目的の投稿タイプがあり、一覧に出ると邪魔なので追記しています。

アーカイブもシングルも表示しない、というケースの場合に。

カスタム投稿タイプ毎のタクソノミー一覧

<dl>
<?php
$args = array(
	'public'	=> true,// 公開された(publicな)投稿タイプのみ
	'_builtin'	=> false,// デフォルトの投稿タイプを除外
);
$output = 'names'; // names or objects, note names is the default
$operator = 'and'; // 'and' or 'or'
$post_types = get_post_types( $args, $output, $operator ); 
foreach( $post_types as $post_type ){
	echo '<dt>' . $post_type . '</dt>';
	$taxonomies = get_taxonomies( array( 'object_type' => array( $post_type ) ) );
	foreach( $taxonomies as $tax ){
			echo '<dd>' . $tax . '</dd>';
	}
}
?>
</dl>

登録したカスタム投稿と、それに対応したタクソノミーが一覧出力されます。

foreachの中にforeachを入れるって不細工な気がしますが、なんか書き方があるんだろうか、、、

更にタームも出す

<dl>
<?php
$args = array(
	'public'	=> true,// 公開された(publicな)投稿タイプのみ
	'_builtin'	=> false,//WordPressのデフォルトの投稿タイプ
);
$output = 'names'; // names or objects, note names is the default
$operator = 'and'; // 'and' or 'or'
$post_types = get_post_types( $args, $output, $operator ); 
foreach( $post_types as $post_type ){
	echo '<dt>' . $post_type . '</dt>';// 投稿タイプ
	$taxonomies = get_taxonomies( array( 'object_type' => array( $post_type ) ) );
	foreach( $taxonomies as $tax ){
		echo '<dd>' . $tax . '</dd>';// タクソノミー
		$terms = get_terms( $tax );
		foreach ( $terms as $term ){
			echo esc_html( $term->slug );// タームスラッグ
		}
	}
}
?>
</dl>

foreachの中にforeachを入れてさらにforeach(以下略)

目的

  • シングルページの下に「関連記事」みたいなのを付けるとき、「ナニで絞り込むか」なんて場合にリストから選べたらいいかな~。
  • トップページに「○○の最新情報」を出すとき、リストから選べたらいいかな~。

要するにサブループの抽出条件をリストから選びたい、と思ったのでした。

シングルページのページャーにも応用出来るかな。

投稿に紐づいているモノの場合

投稿タイプが増えたり減ったりするたびにタグリストを書き換えるのがメンドクサイので、ちょっと応用してタグリストにしてみました。

<?php 
$taxonomies = get_the_taxonomies();
if( !empty( $taxonomies ) ){
	echo '<p class="taglist">';
	foreach ( $taxonomies as $tax => $value ){
	    echo '<span class="taglist-' . $tax . '">';
		$terms = wp_get_object_terms( $post->ID, $tax );
		foreach ( $terms as $term ){
			echo '<a href="' . get_term_link( $term ) . '">' . $term->name . '</a>';
		}
		echo '</span>';
	}
	echo '</p>';
}
?>

postでもカスタム投稿タイプでも上記でOK。class名がちょっと変わるだけです。

foreach ( $terms as $term ){
	echo '<a href="' . get_term_link( $term ) . '">' . $term->name . '</a>';
}

の部分は

echo get_the_term_list( $post->ID, $tax );

でもいいのですが、リンクを付けたり外したりなど応用しにくいのでバラバラと書いています。