登録済みカスタム投稿タイプを自動で取得してリスト表示|WordPress

今回は投稿タイプスラッグを指定せずとも、定義済みのカスタム投稿タイプを自動的に取得してリストとして出力したいと思います。
お急ぎの方はまとめまでスクロールでどうぞ!

登録済みのカスタム投稿タイプ名(スラッグ)のみ抽出

<?php
$args = array(
  'public'   => true, // 公開されているもの.
  '_builtin' => false, // カスタム投稿タイプ.
);
$cp_types = get_post_types( $args, 'names', 'and' ); // 投稿タイプ名の配列.
?>

6行目のget_post_types()で投稿タイプの情報を取得するのですが、3, 4行目の条件を配列として第1引数に指定することで公開済みのカスタム投稿タイプのみ抽出することができます。
第2引数にobjectsを指定すると投稿タイプの様々な情報が取得できますが、今回はnamesを指定して投稿タイプ名(スラッグ)のみ取得します。
これでカスタム投稿タイプ名(スラッグ)の配列$cp_typesが用意できました。

参考リンク

WordPress Codex
get_post_types()

アーカイブページへのリンクをリスト化

<?php
if ( ! empty( $cp_types ) ) { // カスタム投稿の有無.
  echo "<ul class=\"sm-list\">\n";
  foreach ( $cp_types as $cp_name ) {
    $cp_data = get_post_type_object( $cp_name );
    if ( $cp_data->has_archive == 1 ) { // アーカイブ設定判定.
      $cp_url = get_post_type_archive_link( $cp_name ); // URL.
      echo "  <li class=\"sm-list__item\">\n";
      echo '    <a href="' . esc_url( $cp_url ) . '">' . esc_html( $cp_data->label ) . "</a>\n";
      echo "  </li>\n";
    }
  }
  echo "</ul>\n";
}
?>

2行目:カスタム投稿タイプ名の配列、$cp_typesが空でなければリスト化の処理を実行します。
4行目:$cp_typesに格納されているカスタム投稿タイプの数ほどループ処理します。
5行目:get_post_type_object()でカスタム投稿タイプのデータを取得します。
6行目:5行目のデータを参照してアーカイブが有効か確認します。無効の場合は何もしません。
7行目:get_post_type_archive_link()でアーカイブページのURLを取得します。
9行目:7行目のURLを出力、5行目のデータからラベル(表示名)を出力します。

参考リンク

WordPress Codex
get_post_type_object() / get_post_type_archive_link()

まとめ:カスタム投稿タイプのリスト

カスタム投稿タイプのリスト化をまとめました。コピペで使える状態になっています。

<?php
$args = array(
	'public'   => true,
	'_builtin' => false,
);
$cp_types = get_post_types( $args, 'names', 'and' );

if ( ! empty( $cp_types ) ) {
	echo "<ul class=\"sm-list\">\n";
	foreach ( $cp_types as $cp_name ) {
		$cp_data = get_post_type_object( $cp_name );
		if ( $cp_data->has_archive == 1 ) {
			$cp_url = get_post_type_archive_link( $cp_name );
			echo "  <li class=\"sm-list__item\">\n";
			echo '    <a href="' . esc_url( $cp_url ) . '">' . esc_html( $cp_data->label ) . "</a>\n";
			echo "  </li>\n";
		}
	}
	echo "</ul>\n";
}
?>

投稿タイプの抽出や投稿タイプの情報の取得は色々な場面で応用できるかと思います。
今後も応用できそうなものを分かりやすく記事にしたいと思います。

タイトルとURLをコピーしました