サポート » 使い方全般 » 配列のカスタムフィールドから、値を完全一致で条件指定したい

  • 解決済 matsumochi

    (@matsumochi)


    はじめまして、お世話になります。松本と申します。

    配列を格納したカスタムフィールドから、ある値が含まれているかを条件にget_postsを実行したいのですが、条件が部分一致で判定されて困っております。
    私の知識の浅いところもあり、稚拙なご質問かもしれませんが、皆様のお知恵をお借りできましたらと思い、ご質問させていただきます。

    ++++++++++++++++++++++++++++++++++++

    ●ご質問
    get_posts にて、配列が格納されたカスタムフィールドに、指定の値が完全一致で含まれるか、検索条件に指定するにはどうすればよいでしょうか?

    ●前提
    とあるカスタム投稿において、Advanced custom fieldsを使用してカスタムフィールドを追加。
    custom_fields_array というカスタムフィールドには、配列が数字で格納されいる。
    例:{ 51,7,10,25 }

    ●問題のコード(サンプルなので細かいところは省略しています)

    $posts = get_posts(
    array(
    ‘post_type’ => ‘xxx’ ,
    ‘meta_query’ => array(
    ‘key’ => ‘custom_fields_array’ ,
    ‘value’ => ‘5’ ,
    ‘compare’ => ‘LIKE’
    )
    )
    );

    ●不具合概要
    配列に『5』が含まれる事を条件にしたいが、『51』が条件にヒットしてしまう。

    ●困った点
    『配列に対して、値の検索』を行う場合、compareがLIKEでないといけない?
    LIKEだと値の完全一致がおこわなれない?

    ●あまりやりたくないこと
    全件取得したのち、カスタムフィールドの値を in_arrayでチェックすること。(一発でget_postsで絞り込みたい)

    ++++++++++++++++++++++++++++++++++++

    配列が数字であるのは、格納しているものが記事IDだからです。
    (記事IDに文字列を追加できる方法があれば、xx5xx などと接頭語、接尾語をつけてユニークに指定できそうですが、そちらは情報が全然探せておりません。)

    LIKEの使い方がよくないのか、それとも別の方法が必要なのか、調べてみましたが私の知識では見つけることができませんでした。

    お恥ずかしい内容かもしれませんが、ご存知の方がいらっしゃいましたら、ご助力いただけますと幸いです。
    何卒宜しくお願い致します。

    松本

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • LIKEは「含む」という条件ですので、ダメでしょうね。
    http://elearn.jp/wpman/column/c20110915_01.html
    などをみると、

    ‘compare’ => ‘=’

    になるのではと思います。

    トピック投稿者 matsumochi

    (@matsumochi)

    kimipooh 様

    早速のご意見、誠にありがとうございます。

    お教えいただいたページも拝見し、compareを’=’にもしてみたのですが、今度はヒットなしとなりました。
    配列に対して値チェックする場合は『’=’ではなく’LIKE’を使う』という情報もあるので、前提がLIKEになるのかと思った次第です。

    参考にしたサイト様
    http://yahss.net/wordpress/1226-array_in_custom_fields/

    せっかくご意見頂きましたが、解決せず申し訳ありませんでした。
    アドバイス、ありがとうございました。

    松本

    トピック投稿者 matsumochi

    (@matsumochi)

    解決いたしました。

    フォーラムに投稿させていただいてから何分と経っていないので誠に申し訳御座いませんが、ちょっと試したところ成功してしまいました。
    お騒がせして誠に申し訳御座いませんでした。

    以下、対応をご報告させていただきます。

    ++++++++++++++++++++++++++

    ●カスタムフィールドに格納されている配列
    { 51,7,10,25 }

    ●修正のコード(サンプルなので細かいところは省略しています)

    $posts = get_posts(
    array(
     ‘post_type’ => ‘xxx’ ,
     ‘meta_query’ => array(
       ‘key’ => ‘custom_fields_array’ ,
       ‘value’ => ‘”5″’ ,
       ‘compare’ => ‘LIKE’
      )
     )
    );

    ++++++++++++++++++++++++++

    ‘value’ => ‘”5″’ ,
    のように、値をダブルクウォートでくくったところ、完全一致でヒット。

    大変お恥ずかしい内容で申し訳御座いませんでしたが、こちらに投稿させていただくことと、kimipooh様のアドバイスのおかげで解決することができました。

    お邪魔してしまいましたが、ありがとうございました。

    松本

    advanced custom fieldsを使っている以上現状ではおそらく無理です。
    シリアライズ化された値はデータベースは文字の塊としてしか理解しておりませんので
    LIKE検索でその値が含まれるかどうかで検索するしかないかと思います。

    ・wpdbクラスに合わせて正規表現でもしかしたら可能かも
    ・カスタムフィールドの値の方を a5a,a10a,a11aの用に前後に文字を入れる等工夫する

    書いている間に解決したようで…w

    • この返信は7年、 7ヶ月前にjdbbが編集しました。
    トピック投稿者 matsumochi

    (@matsumochi)

    jdbb 様

    この度はアドバイス、誠にありがとうございます。
    結果的には単純なことで解決してしまいました…お騒がせいたしましたm_ _m
    (追記として、typeをCHARに指定が必要そうでした)

    お話いただいた通り、ACFを使う以上、出てくる制約というのがありそうで、今回はたまたま解決しましたが制約がある可能性については今後気をつけたいと思います。

    正規表現、値の前後に文字列を追加する方法も、今回の問題の回避策に有用そうな情報で、今後の参考にさせていただきます!
    特に文字列で挟む方法については今後調べていきたいと思います(記事IDに接頭語、接尾語を追加)

    貴重なご意見、ありがとうございました。

    松本

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「配列のカスタムフィールドから、値を完全一致で条件指定したい」には新たに返信することはできません。