• 解決済 amaguri

    (@amaguri)


    はじめて投稿致します。
    不慣れですがご教授お願いいたします。

    Advanced Custom Fieldsを使用しているのですが、フィールドタイプ【チェックボックス】を設置し、そこから特定の選択肢をチェックされている記事のみ抽出したいのですが、なかなかうまくいかなくて悩んでいます。

    目的はある投稿タイプの特定の選択肢にチェックが入っている記事のみをループで抽出させたいのです。

    ■Advanced Custom Fieldsでの設定

    投稿タイプ(post_type):main
    フィールドタイプ:チェックボックス
    フィールド名:複数あります(A,B,C,D)それぞれに選択肢を設けています。

    フィールド名A
    -選択肢A
    -選択肢B
    -選択肢C

    フィールド名B
    -選択肢D
    -選択肢E
    -選択肢F

    記事一覧ページには以下のようにしています。

    <?php
    if (have_posts()): {
    query_posts( “post_type=投稿タイプ名&posts_per_page=100&order=ASC&paged=”.$paged);
    }
    ?>
    <?php
    while (have_posts()) : the_post();
    ?>

    <li><?php the_title(); ?></li>

    <?php endwhile; ?>
    <?php endif; ?>
    <?php wp_reset_query();?>

    上記では指定した投稿タイプの記事が一覧で表示されますが、さらにそこから特定の選択肢にチェックが入った記事だけを表示させたいです。
    「選択肢A」に入っている記事だけを表示させる…など。

    分かりづらい文章かもしれませんが、どうかご教授お願いします。

    ※追記致します。
    選択肢の値とラベルは現状ともに日本語で登録しています。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • モデレーター Takuro Hishikawa

    (@hissy)

    カスタムフィールドでの絞り込みの方法はCodexを参照されたし → Class_Reference/WP_Query#Custom_Field_Parameters

    但し、注意。ACFは検索に向いていない → Advanced Custom Fieldsプラグインを使う際の注意点など

    可能であればカスタムタクソノミーを使うことを勧める。

    Advanced Custom Fields でチェックボックスの有無を判別する場合

    <?php if (get_field('選択肢A',$post->ID)==true) : ?>

    のような条件分岐を私は使っています。

    トピック投稿者 amaguri

    (@amaguri)

    Takuro Hishikawa様

    ご回答ありがとうございます。
    ACFは検索に向いていないのですね。
    今後はタクソノミーで活用できるように設計していきたいと思います。

    トピック投稿者 amaguri

    (@amaguri)

    taku-k様

    ご回答ありがとうございます。

    なにやら求めている結果が生まれるような感じですが、
    私が未熟であと一歩のところで詰まってしまいます。

    <?php
    if (have_posts()): {
    query_posts( "post_type=main&posts_per_page=100&order=ASC&paged=".$paged);
    }
    ?>
    <?php	while (have_posts()) : the_post(); ?>
    <?php if(get_post_meta( $post->ID, 'フィールド名A', true )): ?>
    <tr>
    <td><?php the_title(); ?></td>
    </tr>
    <?php endif; endwhile; ?>
    <?php endif; ?>
    

    だと、フィールド名Aのチェックされている記事だけ絞り込めました。

    そこから、さらに絞り込むため

    <?php if (get_field('選択肢A',$post->ID)==true) : ?>
    

    をどこかしらいれようにも、うまく表示されません。(消えてしまいます)

    なにか良い改善方法はありますでしょうか?

    質問内容を少し勘違いしてました。ごめんなさい。

    検証してみたところ
    たとえば

    フィールド名を color
    選択肢を
    red:あか
    blue:あお
    yellow:きいろ

    フィールド名を katachi
    選択肢を
    shikaku : しかく
    sankaku : さんかく
    maru :まる

    にした場合

    <?php $field_color = get_field_object('color'); ?>
    
    <?php if ($field_color[value][0]==red) : ?>
    あか
    <?php endif ?>
    
    <?php if ($field_color[value][0]==blue) : ?>
    あお
    <?php endif ?>
    
    <?php if ($field_color[value][0]==yellow) : ?>
    きいろ
    <?php endif ?>
    
    <?php $field_katachi = get_field_object('katachi'); ?>
    
    <?php if ($field_katachi[value][0]==shikaku) : ?>
    しかく
    <?php endif ?>
    
    <?php if ($field_color[value][0]==sankaku) : ?>
    さんかく
    <?php endif ?>
    
    <?php if ($field_color[value][0]==maru) : ?>
    まる
    <?php endif ?>

    みたいな感じで条件分岐できました。

    モデレーター Takuro Hishikawa

    (@hissy)

    taku-kさんの方法は、投稿のデータを取得してから、該当の投稿のカスタムフィールドの値を取得し、その値によって条件分岐する方法です。amaguriさんの質問はそうではなく、あらかじめカスタムフィールドで絞り込んだ条件によって投稿のデータを取得することだと解釈しましたが、間違っていますか?後者の場合は、WP_Queryを使って絞り込む必要があるでしょう。

    一覧を取得してから該当の投稿のカスタムフィールドの値を取得してから条件分岐を行なう方法だと、例えば10件取得してから選択肢Bに含まれない記事を除外した場合、最悪の場合ページに1件も表示されないと言うことが起こりえます。

    あ! 本当ですね。 Takuroさんのおっしゃる通りです。

    またまた混乱させてしまい本当に失礼しました。
    反省。

    トピック投稿者 amaguri

    (@amaguri)

    taku-k様

    検証していただきありがとうございます。
    そして、こちらの情報不足で混乱させてしまい大変申し訳ありません。

    WP_Queryを使って絞り込む方法で検討し直してみたいと思います。

    検証いただいた例は別のシチュエーションで参考にさせていただきたいと思います。

    ご助力いただき誠にありがとうございます。

    トピック投稿者 amaguri

    (@amaguri)

    Takuro Hishikawa様

    おっしゃる通り、あらかじめ絞り込んだ上で取得できるのがシンプルかなと思っていました。
    が、うまくいかなくて悩んでいた次第です。

    WP_Queryを使って記述しなおすと、正常に取得することができました。

    <?php
    
    $args = array(
      'post_type' => '投稿タイプ名',
    	'meta_query' => array(
    		array(
    		'key'=>'フィールド名',
    		'value'=>'値',
    		'compare' => 'LIKE'
    		)
    	),
    
      'posts_per_page' => 100,
      'order' => 'ASC'
    );
    
    $the_query = new WP_Query( $args );
    if ( $the_query->have_posts() ) :
    while ( $the_query->have_posts() ) : $the_query->the_post();
    
    ?>
    <tr>
    <td><?php the_title(); ?></td>
    </tr>
    
    <?php endwhile; endif; ?>
    <?php wp_reset_postdata();?>
    

    なんとか、思い描いていた動作をすることができました。
    今後はWP_Queryで絞り込みをしたほうがいいかもしれないですね。

    また、今後はACFでの絞り込みでなくタクソノミーで考えて行こうと思います。

    ご助力いただき誠にありがとうございます。

    トピック投稿者 amaguri

    (@amaguri)

    無事問題が解決いたしましたので、トピックを解決済にさせていただきます。

    Takuro Hishikawa様、taku-k様
    この度はご助力頂き誠にありがとうございました。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • トピック「Advanced Custom Fieldsで作成したチェックボックス」には新たに返信することはできません。