meta_queryのcompareをLIKEにすれば表示されませんか?
みかん&りんご に対してみかんでLIKE検索、またはりんごでLIKE検索をすればHITすると思います。
ただし処理自体が重めなので複雑な検索をするなら時間がかかる可能性がでます。
gogowebさん、ありがとうございます。
valueに対して、みかん、りんごと個別に当てるということですか。
個別に当てるなら、おっしゃる通りLIKEでいいのですが、
その方法がわかりません。
なので、前回はデータを分けて処理しました。
ちなみに、「カスタムフィールドA」に入るのは、「対象になる値」&「対象になる値」&「対象になる値」&……
と、&でつなげたデータです。「対象になる値」が1つのものもあれば、それ以上のものもあります。
また、「対象になる値」はいろいろあり、それを&で区切っています。(個別のデータとして扱いやすいように)
引き続きよろしくお願いします。
カスタムフィールドは、同じキーで複数の値を保存することができます。
すなわち、「カスタムフィールドA:みかん」と「カスタムフィールドA:りんご」の両方を保存することができ、これを呼び出すときは以下のようになります。
// $post_id = get_the_ID();
$foods = get_post_meta($post_id, 'カスタムフィールドA');
// 以下と同じ
// $foods = array('みかん', 'りんご');
&で区切る必要はありません。
これで、 'relation' => 'OR'
なしで行けませんかね……?
-
この返信は7年、 8ヶ月前にLABEが編集しました。
LABEさん、ありがとうございます。
すいません。説明が足りませんでした。
前回、カスタムフィールドの値で関連記事を表示したい
で、LABEさんのおっしゃっている方法で一応の解決を見ました。
今回は、元々のデータを生かす方法はないかと模索しております。
explode()
を使用してうまくいかなかったというのは、カスタムフィールドに値がなかった場合でしょうか。
まず、 post_custom()
は文字列だけでなく配列や真偽値を返す可能性もあるので、エラーを防ぐために get_post_custom()
を使っておきます。
その上で、この投稿の方法でうまくいったということでしたら、こちらの方法ではどうでしょうか。
$post_custom = get_post_custom();
if ( isset($post_custom['カスタムフィールドA'][0])
&& $post_custom['カスタムフィールドA'][0] !== '' )
$foods = explode('&', $post_custom['カスタムフィールドA'][0]);
else
$foods = array();
======================================
'value' => $foods,
LABEさん、ありがとうございます。
<?php
$post_custom = get_post_custom();
if ( isset($post_custom['foods'][0])
&& $post_custom['foods'][0] !== '' )
$foods = explode('&', $post_custom['foods'][0]);
else
$foods = array();
$post_id = get_the_ID();
query_posts(
array(
'post_type' => 'food',
'posts_per_page' => 5,
'post__not_in' => array($post_id),
'orderby' => 'rand',
'order' => 'ASC',
'post_status' => 'publish',
'meta_query' => array(
array( 'key' => 'foods',
'value' => $foods,
'compare' => 'IN'
)
)
)
);
?>
以上でやってみました。
「みかん&りんご」「みかん」があった場合、
「みかん&りんご」に「みかん」は表示できますが、逆ができませんでした。
>explode()
を使用してうまくいかなかったというのは、
key
にも$foods
を当ててダメでした。
引き続きよろしくお願いします。
付け焼刃ですが、いっそのこと 'meta_query'
を foreach
で生成してやりましょうか。
※テストはしてません。
// $foods は上と同じ
$meta_query = array();
foreach ( $foods as $food ) {
$meta_query[] = array(
'key' => 'カスタムフィールドA',
'value' => $food,
'compare' => 'IN'
);
}
if ( count($meta_query) > 1 )
$meta_query['relation'] = 'OR';
また、サブループに query_posts()
をお使いのようですが、この関数はメインクエリに関与するもので、そもそも非推奨のようですし、サブループを作る用途ならばなお適切ではありません。
代わりに WP_Query をお勧めします。引数は同じです。
$my_query = new WP_Query(array(
'post_type' => 'food',
......
'meta_query' => $meta_query,
));
if ( $my_query->have_posts() ) {
while ( $my_query->have_posts() ) {
$my_query->the_post();
......
}
}
LABEさん、ありがとうございます。
残念ながら今度も同じです。
前回確認し忘れていたのですが、
「みかん&りんご」
に「みかん&りんご」
も表示できませんでした。
IDが同じものははじくようにしているのですが、違うIDで同じカスタムフィールドのものは表示されませんでした。
ただ、「みかん」
に「みかん」
は表示されます。
引き続きよろしくお願いします。
ごめんなさい、やっぱり付け焼刃の知識じゃだめでした。
IN
じゃなくて LIKE
でしたね。
上の投稿の前半のコードの4〜8行目を以下のように変えてみてください。
$meta_query[] = array(
'key' => 'カスタムフィールドA',
'value' => '%'.$food.'%',
'compare' => 'LIKE'
);
LABEさん、たびたびありがとうございます。
残念ながら今度は、「みかん」に「みかん」も表示されなくなりました。
引き続きよろしくお願いします。
失礼しました、 %
は自動的に付加されていましたね。
$meta_query[] = array(
'key' => 'カスタムフィールドA',
'value' => $food,
'compare' => 'LIKE'
);
LABEさん、ありがとうございます。
うまくいきました。
本当にありがとうございます。
ちなみに、'%'.$food.'%'
って、どういう意味なんでしょう。
よろしかったら、教えてください。
それはよかったです。
データベースを LIKE
で検索する場合、前方一致では 文字列%
、後方一致では %文字列
、部分一致では %文字列%
、というふうに文字列に %
を付けます。
ちなみに IN
はリスト内のいずれかとの完全一致です。
今回は対象のカスタムフィールド値が「&」区切りの文字列なので、 IN
は使えませんでした。
LABEさん、ありがとうございます。
なるほど、検索するときの決まり事?みたいなものなんですね。