Wordpress自定义搜索

时间:2012-09-07 00:28:04

标签: mysql wordpress woocommerce

这令人抓狂。我似乎无法弄清楚什么似乎是一件容易的事情。我正在为销售二手房车的Wordpress网站构建自定义搜索功能。我正在使用Woocommerce对产品进行编目(可能并不重要,因为它只是创建了一个post_type = product而不是post_type = post的产品)。

我使用自定义字段来定义选项,例如车辆的'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)(例如site.com/search/?a2=1&a4=1如果选择'A类'和'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运算符。对我来说似乎是对的,但它不起作用。但奇怪的是,如果我将AND更改为OR在行5它可以工作,但不会返回我想要的结果,因为它扩展了搜索而不是缩小它。

非常感谢任何帮助。我也愿意尝试其他方法,如果有人知道如何解决这个问题,因为我可能会发生这种错误。我是一名最近刚成为程序员的设计师,我的专业水平最好是中级,所以请善待。

1 个答案:

答案 0 :(得分: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查询。