Toolset Types : 親投稿に属する子投稿を関連のない固定ページやトップページに表示する

2018年から「Toolset Types」が有料プラグインに生まれ変わるというニュースで、世の中では「Toolset Types」離れが起きるかも知れませんが、私は仕事でどっぷり使っていますので、有料版を購入いたしました。

制作チームも有料版に変えることは大きな決断だったと思いますが、やはり開発には労力がかかります(たぶん…)。頑張ってもらいたい気持ちを込めて、有料版へ。

無料プラグインは、いつ開発が止まってしまうかわからないリスクもありますし、これだけ仕事で使わせて頂いている恩もありますので、そこは迷いませんでした。

…ただ、「まだベータ版なので、現在進行中のプロジェクトでは使用しないでね」とのアナウンスが出ていましたので、仕事ではいまだに100%無料版を使用しているという現実。。。
気長に待ちます。。。

さて、久しぶりの更新ですが、カスタム投稿に親子関係を作って、以前カスタムフィールドグループを繰り返し使えるようにする記事「Toolset Types:カスタムフィールドグループの繰り返し」を書きましたが、その続きみたいな記事です。

親投稿に属する子投稿を、別のページ(固定ページやトップページ)に表示する

親投稿に属する子投稿を関連のない全く別のページ、例えば固定ページやトップページなどに、表示する方法です。

以下の参考サイト様の記事を習って、二重ループを書くことで、これが実現できました。
二重ループ…! こんなことができるのですね。感動いたしました。

参考サイト

カスタムフィールドで複数のPDF表示とグループ機能(Toolset Types編)

親投稿タイプ「商品(item)」と、子投稿タイプ「お客様の声(voice)」を作成したと仮定して、話を進めます。

「ブーケ」という商品を作成して、そこに登録されたお客様の声(子投稿)を表示する場合、「single-item.php」に以下のように記述すれば、ブーケのページに表示できます。

前回の記事では「foreach」でループを書いていましたが、今回は参考サイト様に習って、「WP_Query」でループを書いてみました。
そうすると、"id"=> "$child_post->ID"は必要ありませんでした。

<?php 
  $child_args = array(
    'post_type' => 'voice',
    'meta_key' => '_wpcf_belongs_' . $post->post_type . '_id', // 親投稿のページID
    'meta_value' => $post->ID,
    'posts_per_page' => -1
  );
  $child_posts = new WP_Query($child_args); ?>

<ul class="voice-list">
  
<?php if ($child_posts->have_posts() ) : while ( $child_posts->have_posts() ) : $child_posts->the_post(); ?>

<!-- ▽ ループ開始 ▽ -->

  <li>
    <h3><?php echo(types_render_field("voice-title", array())); ?></h3>
    
    <?php the_title(); ?>様
    
    <?php the_content(); ?>
  </li>
  
  <?php endwhile; else: ?>

  <li>まだ「お客様の声」はありません。</li>

  <?php endif; ?>

  <?php wp_reset_postdata(); ?>

  <!-- △ ループ終了 △ -->

</ul><!-- .voice-list -->

関連のない固定ページやトップページなどに表示する方法

では、「ブーケ」という商品のお客様の声を、トップページや固定ページなど、全然関係のないページに表示したい場合、どう記述すれば表示できるか?

(1)親ループ:商品(親投稿)の「ブーケ」を指定
      ↓
(2)子ループ:「ブーケ」に登録されたお客様の声(子投稿)を指定

することで可能でした。以下のように記述します。

<?php // 親投稿のクエリ設定
  $args = array(
    'post_type' => 'item', // 親投稿タイプの指定
    'pagename' => 'bouquet', // アイテムの指定(スラッグ)
    'posts_per_page' => -1
  );
  $my_query = new WP_Query($args);
?>

<!-- ▽ 親ループ開始 ▽ -->

<?php if ($my_query->have_posts() ) : while ( $my_query->have_posts() ) : $my_query->the_post(); ?>

  <?php // 子投稿のクエリ設定
  $child_args = array(
    'post_type' => 'voice', // 子投稿タイプの指定
    'meta_key' => '_wpcf_belongs_' . $post->post_type . '_id', // 親投稿のページID
    'meta_value' => $post->ID,
    'posts_per_page' => -1
  );
  $child_posts = new WP_Query($child_args); ?>
  
  <ul class="voice-list">
  
  <!-- ▽ 子ループ開始 ▽ -->
    
  <?php if ($child_posts->have_posts() ) : while ( $child_posts->have_posts() ) : $child_posts->the_post(); ?>
  
    <li>
      <h3><?php echo(types_render_field("voice-title", array())); ?></h3>
      
      <?php the_title(); ?>様
      
      <?php the_content(); ?>
    </li>
    
  <?php endwhile; else: ?>
  
    <li>まだ「お客様の声」はありません。</li>
  
  <?php endif; ?>
   
  <?php wp_reset_postdata(); ?>

  <!-- △ 子ループ終了 △ -->
  
  </ul><!-- .voice-list -->


<?php endwhile; else: ?>

<?php endif; ?>

<?php wp_reset_postdata(); ?>

<!-- ▽ 親ループ終了 ▽ -->

注意事項

一点、注意事項があるのですが、親投稿のスラッグの指定箇所の 'pagename' => 'bouquet' は、Toolset Types のカスタム投稿を作成する際に「オプション」で「階層」にチェックを入れておくことが必須です。

これはカスタム投稿のページを「固定ページ(階層を持つ)」と見なすか、「投稿ページ(階層を持たない)」と見なすかの違いによるみたい。。。

テストしてみると、このチェックを外したときは、投稿ページのスラッグを指定する際に使用する 'name' => 'bouquet' でOKでした。

コメントを残す

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