是否执行包含多个“and”元查询的大型WP_Query?

时间:2015-03-09 作者:poldixd

我有一个自定义的帖子类型product. 访问者可以搜索products 有许多过滤器。他们可以设置color, 这个size, 这个price, 等。产品的详细信息存储在高级自定义字段(ACF)中。

我的解决方案是WP_Query 具有meta_queries. 全部的WP_Meta_Queries 都在AND-关系

我的问题是:如果访问者为产品创建更多的过滤器,那么查询总是会变慢。我认为INNER JOINs开启wp_postmeta 都是问题所在。我有六个INNER JOIN在这张桌子上。

这个问题有解决办法吗?

2 个回复
SO网友:LeMike

此处可能需要180°的解决方案;)再次思考该问题并尝试以下方法:

作为访客,我可以根据颜色和大小进行过滤。

因此,您的解决方案可能是:

...
JOIN ... (A)
... (B)
... (C)
WHERE (A.meta_key = \'color\' AND A.meta_value = \'red\')
OR (B.meta_key = \'color\' AND B.meta_value = \'blue\')
...
AND (C.meta_key = \'size\' AND C.meta_value = 1)
...
但实际上,您可以使用IN:

JOIN ... (A)
... (B)
WHERE (A.meta_key = \'color\' AND A.meta_value IN (\'red\', \'yellow\'))
AND (B.meta_key = \'size\' AND B.meta_value IN (1, 2, 3))
因此,开始使用“IN”来比较值like in the manual:

$args = array(
    \'post_type\'  => \'my_custom_post_type\',
    \'meta_key\'   => \'age\',
    \'orderby\'    => \'meta_value_num\',
    \'order\'      => \'ASC\',
    \'meta_query\' => array(
        array(
            \'key\'     => \'age\',
            \'value\'   => array( 3, 4 ),
            \'compare\' => \'IN\',
        ),
    ),
);
$query = new WP_Query( $args );
您甚至可以开始猜测,并且只使用一个连接或根本不使用连接:

WHERE meta_key IN (\'color\', \'size\')
  AND meta_value IN (\'red\', \'blue\', 123, 45)
这会很快,但可能会导致大量误报。

SO网友:Hari Om Gupta

如果您使用woocommerce,只需使用advanced ajax product filters

此插件将帮助您完成所有post meta。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post