这不是一个真正的WordPress问题,因为它只是标准SQL,所以它不属于这里,但我有一些关于您使用$wpdb->prepare()
所以我会回答这个问题。
那么,让我们看看你的WHERE
子句,单独,替换值,缩进以反映其解释方式:
WHERE
pm.meta_key = "select_analyst" AND p.post_status = "new" OR
p.post_status = "pending_review" AND p.post_type = "post_type"
这又回来了
meta_value
对于满足以下条件的行:
meta_key
是select_analyst
和post_status
是new
或post_status
是pending_review
和post_type
是您的帖子类型注意,第二个条件没有指定元键,因此meta_values
对于所有pending_review
.您需要设置条件的格式,以便查询:
meta_key
是select_analyst
post_type
是您的帖子类型post_status
是new
或pending_review
这方面的SQL是
WHERE
pm.meta_key = \'select_analyst\' AND
p.post_type = \'post_type\' AND
p.post_status IN (\'new\', \'pending_review\' )
因此,您的完整查询应该是:
$query = $wpdb->get_results(
"SELECT
DISTINCT pm.meta_value
FROM
$wpdb->postmeta pm
LEFT JOIN
$wpdb->posts p ON p.ID = pm.post_id
WHERE
pm.meta_key = \'select_analyst\' AND
p.post_type = $post_type AND
p.post_status IN (\'new\', \'pending_review\')
ORDER BY
pm.meta_value"
);
我还做了一些其他更改:
你不需要准备这份声明。查询中没有不安全的用户输入。您希望这样做的唯一原因是不必多次将键写出来,但如果变量不是来自不安全的输入,则始终可以直接将其放入语句中。您甚至没有多次使用任何变量(除了元键,请参见下文),因此这对于您的查询来说是不必要的
您是按文本值排序的\'select_analyst\'
, 这没什么用。我假设您想按元值排序,所以我这样做了还要注意,缩进代码以反映查询的结构可以更容易地发现这些问题。