那个标题真是太好了。
我有一个自定义的帖子类型,叫做work
使用三种自定义分类法work-client
, work-type
, 和work-service
. 我正在使用高级自定义字段为它们创建一个干净的后端,创建一个名为work_client
对于work-client
, 以及“选择多个”字段work-service
和work-type
调用work_services
和work_type
将分类ID保存为序列化数组。
TLDR:帖子有work_client
具有单个分类ID的元字段,以及work_services
和work_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查询专家。
我做错了什么?希望至少我很接近?