尝试联接多个元键查询时,未从$wpdb->Get_Results()查询中找到结果

时间:2014-12-05 作者:Ryan Giglio

那个标题真是太好了。

我有一个自定义的帖子类型,叫做work 使用三种自定义分类法work-client, work-type, 和work-service. 我正在使用高级自定义字段为它们创建一个干净的后端,创建一个名为work_client 对于work-client, 以及“选择多个”字段work-servicework-type 调用work_serviceswork_type 将分类ID保存为序列化数组。

TLDR:帖子有work_client 具有单个分类ID的元字段,以及work_serviceswork_type 包含多个分类ID的序列化数组的元字段。

我想做的是创建一个健壮的后期过滤系统,在这个系统中,您有一个包含所有客户端、类型和服务的复选框列表,并且可以选择其中一个或多个进行过滤。不同类型的筛选器具有AND关系,但一个筛选器中的不同值具有OR关系。例如:

如果您选择客户端A和B、类型X和Y以及服务1,那么您应该只返回来自客户端A或B、类型X或Y以及服务1的帖子。我希望这是有意义的。

我了解到在WP\\u查询中不可能同时使用“AND”和“OR”关系,所以我求助于调用$wpdb->get\\u results()来实现这一点。根据一些类似(但不完全相同)尝试的例子,我得出以下结论:

    SELECT $wpdb->posts.* FROM $wpdb->posts
    INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
    WHERE 1=1
    AND $wpdb->posts.post_type = \'work\'
    AND ($wpdb->posts.post_status = \'publish\' OR $wpdb->posts.post_status = \'private\')
    AND (
        (
            obobq8u_postmeta.meta_key = \'work_client\' 
            AND (
                CAST(obobq8u_postmeta.meta_value AS CHAR) IN (\'149\')
            )
        ) OR (
            obobq8u_postmeta.meta_key = \'work_client\' 
            AND (
                CAST(obobq8u_postmeta.meta_value AS CHAR) IN (\'231\')
            )
        )
    ) 
    AND (
        (
            obobq8u_postmeta.meta_key = \'work_services\' 
            AND (
                CAST(obobq8u_postmeta.meta_value AS CHAR) LIKE (\'%247%\')
            )
        )
    ) 
    AND (
        (
            obobq8u_postmeta.meta_key = \'work_type\' 
            AND (
                CAST(obobq8u_postmeta.meta_value AS CHAR) LIKE (\'%244%\')
            )
        )
    ) 
    GROUP BY $wpdb->posts.ID ORDER BY $wpdb->posts.post_title ASC
我知道客户端149和231在系统中都发布了服务247和类型244的帖子,但运行该查询返回时没有结果。

然而,如果我只使用其中一个元查询来运行它,那么这一部分工作正常。例如,这个查询提供了所有包含客户端149或231的帖子

    SELECT $wpdb->posts.* FROM $wpdb->posts
    INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
    WHERE 1=1
    AND $wpdb->posts.post_type = \'work\'
    AND ($wpdb->posts.post_status = \'publish\' OR $wpdb->posts.post_status = \'private\')
    AND (
        (
            obobq8u_postmeta.meta_key = \'work_client\' 
            AND (
                CAST(obobq8u_postmeta.meta_value AS CHAR) IN (\'149\')
            )
        ) OR (
            obobq8u_postmeta.meta_key = \'work_client\' 
            AND (
                CAST(obobq8u_postmeta.meta_value AS CHAR) IN (\'231\')
            )
        )
    ) 
    GROUP BY $wpdb->posts.ID ORDER BY $wpdb->posts.post_title ASC
此查询提供的结果仅为服务247:

    SELECT $wpdb->posts.* FROM $wpdb->posts
    INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
    WHERE 1=1
    AND $wpdb->posts.post_type = \'work\'
    AND ($wpdb->posts.post_status = \'publish\' OR $wpdb->posts.post_status = \'private\')
    AND (
        (
            obobq8u_postmeta.meta_key = \'work_services\' 
            AND (
                CAST(obobq8u_postmeta.meta_value AS CHAR) LIKE (\'%247%\')
            )
        )
    ) 
    GROUP BY $wpdb->posts.ID ORDER BY $wpdb->posts.post_title ASC
这个问题似乎将两者结合在一起。很可能我的“加入”操作有误,但我很难找到有关此特定问题的帮助,而且我绝对不是SQL查询专家。

我做错了什么?希望至少我很接近?

1 个回复
最合适的回答,由SO网友:Ryan Giglio 整理而成

幸运的是,不再需要这种复杂的数据库查询。WordPress 4.1增加了生成复杂嵌套元查询的能力,这正是我想要完成的。

这是具有以下功能的Trac票据:https://core.trac.wordpress.org/ticket/29642

结束

相关推荐

首页WP_QUERY中每个帖子的评论计数相同

我的主页模板上有一个WP\\u查询,它可以很好地为循环中的每个帖子获取\\u title()和许多其他函数。然而,任何获取评论数量的方法都只需获取第一篇帖子的实际数量,然后对其余帖子重复相同的输出。我两个都试过了echo get_comments_number($post->ID); 和comments_number();关键:如果我不在主页上使用相同的模板,那么评论计数就可以了。