サポート » 使い方全般 » 現在のタームのカスタムフィールド値を取得したい

  • 解決済 mae-tel

    (@mae-tel)


    お世話になっております。
    Advanced Custom Fieldsプラグインを使用しています。

    現在表示中の記事のタームを取得し、同じタームを持つ別のカスタム投稿タイプの記事のカスタムフィールド値を取得し、シャッフルしてランダムにひとつだけ表示したいです。

    ややこしくてどうしていいかわからずにいます・・・汗

    ①現在表示中の記事のステータス
    └タクソノミー [動物の種類]
    └ターム    [子犬]
    └カスタム投稿タイプ [生き物]

    ②値を取得したい記事群のステータス
    └タクソノミー [上記同じ]
    └ターム    [上記同じ]
    └カスタム投稿タイプ [ペット]
    └カスタムフィールド値(画像) [子犬の写真]

    現在のターム(子犬)は、取得して変数($dog)に入れています。
    ①の記事を表示しているときに、②の子犬の写真を取得し、シャッフルしてランダムにひとつだけ表示したいです。

    よろしければ、ご教授お願いいたします。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • こんにちわ、mae-telさん

    簡単に書いてみました。説明はコードの所にコメントで記載しています。
    正直、関数化かクラス化とかした方が扱いやすくなると思いますので、ご自由にカスタマイズしてください。

    // ポストタイプを指定
    $posttype  = 'post';
    // タームをごにょごにょ
    $taxonomy  = 'category';
    $types     = get_the_terms( $post->ID, $taxonomy );
    $typenames = array();
    foreach( $types as $type ){
        array_push( $typenames, $type->slug );
    }
    
    // 記事の取得条件を設定
    $args = array(
            'showposts' => '1',
            'orderby'   => 'rand',
            'post_type' => $posttype,
            'tax_query' => array(
                                array(
                                        'taxonomy' => $taxonomy,
                                        'terms'    => $typenames,
                                        'field'    => 'slug',
                                        'operator' => 'IN'
                                    ),
                                'relation' => 'AND'
                            ),
        );
    // 変数を破棄
    unset( $posttype );
    unset( $taxonomy );
    unset( $types );
    unset( $typenames );
    unset( $type );
    
    // 記事を表示する為のサブループ
    query_posts($args);
    if ( have_posts() ) : while ( have_posts() ) : the_post();
    // 好きにコーディングしてください
    the_title();
    endwhile; else:
    // 記事がない場合
    // 好きにコーディングしてください
    endif;
    // クエリーをリセット
    wp_reset_query();
    
    // 変数を破棄
    unset( $args );

    自分でコード書いといてあれですけど、query_posts 使わないで get_posts を使って foreach でループさせればいいかもです。query_posts の方がメインループの書き方と同じで分かり易いので好きなんですけどね。

    トピック投稿者 mae-tel

    (@mae-tel)

    KUCKLU様、ご回答ありがとうございます!

    ご教授いただいたコードを、参考に(そのまま)させていただきました。

    取得したタームに属する記事のカスタムフィールドに、画像は入っているのですが、
    入っていない場合の
    <li></li>
    が表示されてしまいます。
    カスタムフィールドの取得の仕方が問題なのでしょうか?

    <?php
    $posttype  = 'ポストタイプ名';
    $taxonomy  = 'タクソノミー名';
    $types     = get_the_terms( $post->ID, $taxonomy );
    $typenames = array();
    foreach( $types as $type ){
        array_push( $typenames, $type->slug );
    }
    ?>
    <?php
    $args = array(
            'showposts' => '1',
            'orderby'   => 'rand',
            'post_type' => $posttype,
            'tax_query' => array(
                                array(
                                        'taxonomy' => $taxonomy,
                                        'terms'    => $typenames,
                                        'field'    => 'slug',
                                        'operator' => 'IN'
                                    ),
                                'relation' => 'AND'
                            ),
        );
    // 変数を破棄
    unset( $posttype );
    unset( $taxonomy );
    unset( $types );
    unset( $typenames );
    unset( $type );
    ?>
    <?php
    // 記事を表示する為のサブループ
    query_posts($args);
    if ( have_posts() ) : while ( have_posts() ) : the_post();?>
    <img src="<?php the_field('取得したいカスタムフィールドキー・返り値はURL)'); ?>" alt="" />
    <?php endwhile; else: ?>
    // 記事がない場合
    // 好きにコーディングしてください
    <li></li>
    <?php endif; ?>
    <?php
    // クエリーをリセット
    wp_reset_query();
    
    // 変数を破棄
    unset( $args );
    ?>

    <li></li>が表示されるということは記事が取得できていないです。
    なので、カスタムフィールは関係がありません。

    query_posts($args); の前で var_dump($args);としてみて、中身が正しく入っているか確認してみてください。

    トピック投稿者 mae-tel

    (@mae-tel)

    KUCKLU様

    すみません…。
    完全に見間違いをしてしまっていて、
    <li></li>
    の出力はされていませんでした。
    結果的に、何も出力されていない状態でした。申し訳ありません。。

    var_dump($args);を入れてみた結果、以下が表示されました。
    array(4) { ["showposts"]=> string(1) "1" ["orderby"]=> string(4) "rand" ["post_type"]=> string(16) "カスタムポスト名" ["tax_query"]=> array(2) { [0]=> array(4) { ["taxonomy"]=> string(20) "タクソノミ―名" ["terms"]=> array(1) { [0]=> string(11) "タームのスラッグ" } ["field"]=> string(4) "slug" ["operator"]=> string(2) "IN" } ["relation"]=> string(3) "AND" } }

    タームやカスタム投稿タイプやタクソノミはちゃんと取得できているよう(?)ですが・・・

    <li></li>
    の出力はされていませんでした。
    結果的に、何も出力されていない状態でした。申し訳ありません。

    そうなると記事は取得できていると思います。
    試しに the_title() などでちゃんと取得できているか確認してみるといいかもしれません。

    トピック投稿者 mae-tel

    (@mae-tel)

    KUCKLU様、度々のご教授ありがとうございます。

    the_title();で出力してみたところ、タームに属する記事はちゃんと取得できているようです。
    ブラウザを更新するたびに違うタイトルがひとつずつランダムで表示されています。

    となるとやはりカスタムフィールドの出力でしょうか…?汗
    画像のカスタムフィールドは他の出力方法があるのでしょうか?
    何度もすみません…><

    ACF での the_field 関数の使い方が間違っていたりしませんでしょうか。
    以下のコードで試してみていただけますでしょうか?
    ※hogehoge の部分はご自身で設定した値に変更してください。

    <img src="<?php the_field( 'hogehoge', $post->ID ); ?>" alt="" />

    公式ドキュメント
    ACF { the_field()

    トピック投稿者 mae-tel

    (@mae-tel)

    KUCKLU様、

    $post->IDを追加しなければいけなかったのですね・・・!
    無事、表示することができました。

    KUCKLU様、大変お世話になりました!
    解決に導いていただき、ありがとうございました。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「現在のタームのカスタムフィールド値を取得したい」には新たに返信することはできません。