0

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

我正在使用自定义字段来定义选项,例如车辆的“Class”(例如“Class A”、“Class B”、“Class C”等)和“Fuel Type”(例如“Gasoline”、“Diesel”、 '可牵引')。因此,每个产品对于同一个 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'))
            ");

如果选择了一个框,则会为所选选项的 url 中的选项传递一个 true 参数 (1)(例如 site.com/search/?a2=1&a4=1 if 'Class 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 运算符一起工作。这对我来说似乎是正确的,但它不起作用。奇怪的是,如果我在第 5 行将 AND 更改为 OR,它会起作用,但不会返回我想要的结果,因为它会扩展搜索而不是缩小搜索范围。

任何帮助是极大的赞赏。如果有人知道如何解决这个问题,我也愿意尝试其他方法,因为我可能做错了。我是一名设计师,最近刚转为程序员,我的专业水平充其量只是中等水平,所以请善待。

4

1 回答 1

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 查询。

于 2012-09-07T23:23:39.660 回答