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 = [
    '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', [])); ?></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 // 子投稿のクエリ設定
  $child_args = [
    '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', [])); ?></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でした。

コメントを残す

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

keyboard_control_keyTOP