2012-09-07 227 views
0

這是令人生氣的。我似乎無法弄清楚這似乎是一件容易的事情。我正在建立一個銷售使用房車的Wordpress網站的自定義搜索功能。我正在使用Woocommerce對產品進行編目(可能不重要,因爲它只是使用post_type = product而不是post_type = post創建產品)。WordPress的自定義搜索

我正在使用自定義字段來定義諸如車輛'Class'(例如'A類','B類','C類'等)和「燃料類型」(例如'汽油' 'Diesel','Towable')。因此,每個產品對於相同的meta_key可能具有不同的meta_value,但可能只有每個meta_key僅定義一次,並且每個meta_key可能只有一個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')) 
      "); 

這樣做是什麼如果選擇框,通過真正的參數(1)對於所選擇的選項(S)在URL中的選項(例如:site.com/search/?a2=1 &如果選擇「A類」和「C類」,a4 = 1)。這似乎工作正常。

然而,當我試圖尋找另一個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,它可以工作,但不會返回我想要的結果,因爲它擴展了搜索,而不是縮小它。

任何幫助,非常感謝。我也願意嘗試其他方法,如果有人知道如何將其取消,因爲我c應該去做這一切都是錯誤的。我是最近成爲設計師的第一個變身程序員,我的專業水平在中等水平,所以請客氣。

回答

3

這是您編寫SQL查詢的錯誤。 wp_postmeta中的每條記錄只能有一個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查詢。

+0

賓果!這讓我朝着正確的方向前進。謝啦! – CChoma