我创建查询以从元键输出所有元值select_analyst
但如果我把或包括两个post_status
这是印在预计之后的。你能告诉我我做错了什么吗?
如果我只放了一个职位状态,那就是工作,但我需要另一个post_status
.
我的查询:
$query = $wpdb->prepare(\'
SELECT DISTINCT pm.meta_value FROM %1$s pm
LEFT JOIN %2$s p ON p.ID = pm.post_id
WHERE pm.meta_key = "%3$s"
AND p.post_status = "%4$s"
OR p.post_status = "%5$s"
AND p.post_type = "%6$s"
ORDER BY "%3$s"\',
$wpdb->postmeta,
$wpdb->posts,
\'select_analyst\',
\'new\',
\'pending_review\',
$post_type
);
最合适的回答,由SO网友:Jacob Peattie 整理而成
这不是一个真正的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\'
, 这没什么用。我假设您想按元值排序,所以我这样做了
还要注意,缩进代码以反映查询的结构可以更容易地发现这些问题。