カスタム投稿タイプテンプレート

カスタム投稿タイプ用のカスタム テンプレート を作成できます。投稿とそのアーカイブが single.phparchive.php を使用して表示されるのと同様に、次のテンプレートを作成できます:

  • single-{post_type}.php – カスタム投稿タイプの単一投稿用
  • archive-{post_type}.php – アーカイブ用

ここで {post_type} は投稿タイプ識別子で、$post_type 引数として register_post_type() 関数で使用されます。

以前に学んだことを基に、単一製品投稿とアーカイブ用の single-wporg_product.phparchive-wporg_product.php テンプレートファイルを作成できます。

また、任意のテンプレートファイルで is_post_type_archive() 関数を使用して、クエリが特定の投稿タイプのアーカイブページを表示しているかどうかを確認し、post_type_archive_title() 関数を使用して投稿タイプのタイトルを表示できます。

投稿タイプによるクエリ

特定のタイプの投稿をクエリするには、post_type キーを WP_Query クラスコンストラクタの引数配列に渡します。

  1. <?php
  2. $args = array(
  3. 'post_type' => 'product',
  4. 'posts_per_page' => 10,
  5. );
  6. $loop = new WP_Query($args);
  7. while ( $loop->have_posts() ) {
  8. $loop->the_post();
  9. ?>
  10. <div class="entry-content">
  11. <?php the_title(); ?>
  12. <?php the_content(); ?>
  13. </div>
  14. <?php
  15. }

これにより、最新の10件の製品投稿をループし、それぞれのタイトルとコンテンツを1つずつ表示します。

メインクエリの変更

カスタム投稿タイプを登録することは、それがメインクエリに自動的に追加されることを意味しません。

カスタム投稿タイプの投稿を標準アーカイブに表示させたり、他の投稿タイプと混在してホームページに含めたりしたい場合は、pre_get_posts アクションフックを使用します。

次の例では、ホームページに postpagemovie 投稿タイプの投稿を表示します:

  1. function wporg_add_custom_post_types($query) {
  2. if ( is_home() && $query->is_main_query() ) {
  3. $query->set( 'post_type', array( 'post', 'page', 'movie' ) );
  4. }
  5. return $query;
  6. }
  7. add_action('pre_get_posts', 'wporg_add_custom_post_types');