0

これは腹立たしいです。簡単にできることのように思えることを理解できないようです。中古の RV を販売している Wordpress サイトのカスタム検索機能を構築しています。Woocommerce を使用して製品をカタログ化しています (post_type=post の代わりに post_type=product を使用して製品を作成するだけなので、おそらく重要ではありません)。

カスタム フィールドを使用して、車両の「クラス」(「クラス A」、「クラス B」、「クラス C」など) や「燃料の種類」(「ガソリン」、「ディーゼル」など) などのオプションを定義しています。 「牽引可能」)。したがって、各製品は同じ meta_key に対して異なる meta_value を持つことができますが、各 meta_key は 1 回だけ定義され、meta_key ごとに 1 つの meta_value しか持たない場合があります。

検索フォームの一部はこんな感じ。(他にもありますが、現時点で心配する必要があるのはこれだけです)

<h4>Type / Class</h4>

<label><input type="checkbox" name="a1" value="0" />All Types</label>
<label><input type="checkbox" name="a2" value="Class A" />"Class A" RV's</label>
<label><input type="checkbox" name="a3" value="Class B" />"Class B" RV's</label>
<label><input type="checkbox" name="a4" value="Class C" />"Class C" RV's</label>
<label><input type="checkbox" name="a5" value="Fifth Wheel" />Fifth Wheel RV's</label>
<label><input type="checkbox" name="a6" value="Toy Hauler" />Toy Haulers</label>
<label><input type="checkbox" name="a7" value="Travel Trailer" />Travel Trailer RV's</label>
<label><input type="checkbox" name="a8" value="Camping Trailer" />Camping Trailers</label>

<h4>Engine Type</h4>

<label><input type="checkbox" name="c1" value="0" />All Engine Types</label>
<label><input type="checkbox" name="c2" value="Gasoline" />Gasoline</label>
<label><input type="checkbox" name="c3" value="Diesel" />Diesel</label>
<label><input type="checkbox" name="c4" value="Towable" />Towable</label>

次のクエリを実行して結果を返すために送信されます。

$result = mysql_query("
            SELECT * FROM wp_postmeta 
            WHERE 
            (meta_key= 'class' AND (meta_value = '$a2' OR meta_value = '$a3' OR meta_value = '$a4' OR meta_value = '$a5' OR meta_value = '$a6' OR meta_value = '$a7' OR meta_value = '$a8'))
            ");

これは、ボックスが選択されている場合に、選択されたオプションの URL にオプションの true パラメータ (1) を渡すことです (例:「クラス A」の場合、site.com/search/?a2=1&a4=1)。および「クラス C」が選択されます)。これはうまくいくようです。

ただし、この新しいクエリを使用して、別の meta_key とその値の組み合わせを検索しようとすると...

$result = mysql_query("
            SELECT * FROM wp_postmeta 
            WHERE 
            (meta_key= 'class' AND (meta_value = '$a2' OR meta_value = '$a3' OR meta_value = '$a4' OR meta_value = '$a5' OR meta_value = '$a6' OR meta_value = '$a7' OR meta_value = '$a8'))
            AND
            (meta_key= 'fuel' AND (meta_value = '$c2' OR meta_value = '$c3' OR meta_value = '$c4'))
            ");

... もう機能しません :( 各 meta_key ステートメントは独立して機能しますが、AND 演算子を使用して一緒に機能することはありません。私には正しいように思えますが、機能していません。奇妙なことに、5 行目で AND を OR に変更すると機能します、しかし、検索を絞り込むのではなく拡大するため、必要な結果が返されません。

どんな助けでも大歓迎です。私はこれをすべて間違っている可能性があるので、誰かがこれをやってのける方法を知っていれば、他の方法も試してみたい. 私はデザイナーで、最近になってプログラマーになりました。専門知識のレベルはせいぜい中級程度ですので、よろしくお願いします。

4

1 に答える 1

3

これは、SQL クエリの書き方に関するエラーです。wp_postmeta の各レコードは 1 つの meta_key 値しか持てませんが、複数の meta_key 値を照合しようとしています。これが、クエリに一致するレコードがないため、結果が返されない理由です。

探しているデータを返すには、ルックアップする一意の meta_key 条件ごとにテーブルを結合する必要があります。

このようなものがあなたが探しているものでなければなりません。

SELECT distinct(m1.post_id) as post_id FROM 
    wp_postmeta m1, 
    wp_postmeta m2
WHERE
    m1.post_id=m2.post_id AND
    (m1.meta_key='class' AND (m1.meta_value IN ('$a2','$a3','$a4','$a5','$a6','$a7','$a8'))) AND
    (m2.meta_key='fuel' AND (m2.meta_value IN ('$c2','$c3','$c4')))

設定されている検索オプションに基づいて、SQL クエリを構築する必要があります。

于 2012-09-07T23:23:39.660 に答える