サポート » プラグイン » Advanced Custom Fields の関連で取得した記事の出力

  • 解決済 tamakana

    (@tamakana)


    お世話になります。

    Advanced Custom Fields で、
    このフィールドに値が入っていれば表示、なければ非表示 といような条件分岐をしたいのですが、
    関連で取得した記事の出力の場合、どのようにやればいいのかわかりません。

    現状はこんなコードになっております。

    <?php $kanren = get_field('hoge'); ?>
    <?php foreach((array)$kanren as $value):?>
    		<?php if ( post_custom('field_aaa','true')) : ?>
    			<?php echo the_field("field_aaa", $value->ID); ?>
    		<?php endif;>
    <?php endforeach; ?><?php endif; ?>

    また、同様に、関連で取得した記事のカスタム投稿タイプの名前を表示したいのですが、

    <?php echo $cp_slug = get_query_var('post_type'); ?>

    だとうまくいかず、こちらもあわせてご教示いただけますと幸いです。

    かさねがさねですみませんが、何卒よろしくお願いいたします。

    • このトピックはtamakanaが1年前に変更しました。
    • このトピックはtamakanaが1年前に変更しました。
4件の返信を表示中 - 1 - 4件目 (全4件中)
  • Aki Hamano

    (@wildworks)

    @tamakana さん

    こんにちは。

    コードを確認しましたが、気になる点は以下です。

    • endifが一つ多いので、このコードはエラーで動かないはず
    • ACFを使うのであれば、プラグインが有効かどうか(get_field等が使えるかどうか)をチェックすべき
    • 一行一行を<?php ~ ?>で加工必要はない
    • 関数は、全てACFのものに統一すべき(post_customget_field
    • the_fieldechoしてくれるので、echo the_fieldechoは不要

      以上をもとにサンプルコードを記載しますが、事前に、追加したカスタムフィールドの「Return Format」が「Post Objects」になっている事を確認してください。
      「Post ID」になっていると、このコードでは動きません。
      ※コードは未検証です。

      <?php
      // ACFプラグインが入っているかどうか(ACF用の関数が使えるかどうか)
      if ( function_exists( 'get_field' ) ) {
        // 「hoge」という名前で作成した「関連」カスタムフィールドの値を取得する
        $related_posts = get_field( 'hoge' );
      
        // 関連記事がある場合
        if( $related_posts ) {
          // ループして一件一件取り出す
          foreach( $featured_posts as $post ) {
            // カスタム投稿タイプ(スラッグ)を取得
            $post_type = $post->post_type;
            // カスタム投稿タイプのスラッグからカスタム投稿タイプのオブジェクトを取得
            $post_type_object = get_post_type_object( $post_type );
            // カスタム投稿タイプのオブジェクトから、カスタム投稿タイプのラベルを取得
            $post_type_label  = $post_type_object->label;
            // カスタムフィールドを取得(第二引数に投稿IDを指定するのがポイント)
            $field_aaa = get_field( 'field_aaa', $post->ID );
      
            if ( $field_aaa ) {
              // HTMLエスケープして出力する
              echo esc_html( $field_aaa );
            }
          }
        }
      }
      ?>

      上手く動作しない場合は、ポイントポイントでvar_dumpなどを入れてみて、各変数にどんな値が格納されているかなどを確認してみて下さい。

    トピック投稿者 tamakana

    (@tamakana)

    @wildworks
    ご返信ありがとうございます。いろいろご指摘いただきありがとうございます。
    うまく動作しなかったのですが、すみません、わたしの言葉足らずで
    そもそもやりたかったことがうまく伝えられていなかったようです。

    ・関連フィールドhogeで記事があれば表示、なければ非表示
    ・記事があれば取得した記事に設定してあるフィールドfield_aaaを取得
    field_aaaがあれば<div class="box_A"></div>を表示、なければ<div class="box_B"></div>を表示

    ということがやりたいと思っております。かさねての質問で恐縮ですがどのようにしたらよいでしょうか。

    Aki Hamano

    (@wildworks)

    @tamakana さん

    こんにちは。
    コードを再添付します。

    <?php
    // ACFプラグインが入っているかどうか(ACF用の関数が使えるかどうか)
    if ( function_exists( 'get_field' ) ) {
      // 「hoge」という名前で作成した「関連」カスタムフィールドの値を取得する
      $related_posts = get_field( 'hoge' );
    
      // 関連記事がある場合
      if( $related_posts ) {
        // ループして一件一件取り出す
        foreach( $related_posts as $post ) {
          // 投稿が無ければスキップ
          if ( ! $post ) {
            continue;
          }
    
          // カスタムフィールドを取得(第二引数に投稿IDを指定するのがポイント)
          $field_aaa = get_field( 'field_aaa', $post->ID );
    
          // フィールドの有無によって出し分ける
          if ( $field_aaa ) {
            echo '<div class="box_A">XXXX</div>';
          } else {
            echo '<div class="box_B">XXXX</div>';
          }
        }
      }
    }
    ?>

    上手く動作しない場合は、

    • それぞれのコードがどのような意味を持っているか
    • どのようなエラーが・どこで発生しているか

    を、まずはきちんと確認してください。

    トピック投稿者 tamakana

    (@tamakana)

    @wildworks

    ご返信ありがとうございます。

    試行錯誤し、希望の表示ができるようになりました!
    今回いただいた内容で理解が以前より深まりました。
    ありがとうございました。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「Advanced Custom Fields の関連で取得した記事の出力」には新たに返信することはできません。