情景:我有一个自定义帖子类型,其开始日期和结束日期保存为post meta。这是为了允许管理员安排日期以显示和隐藏帖子。还可以选择将这些日期留空,在这种情况下,帖子默认显示。由于meta_query
似乎不允许您执行AND / OR比较,我已经涉及使用$ wpdb创建自定义SQL查询。 SQL对我来说是新的领域。目前,这适用于开始日期:
$today = date('Y-m-d');
$results = $wpdb->get_results($wpdb->prepare("
SELECT
$wpdb->posts.post_title,
$wpdb->posts.ID,
$wpdb->posts.post_content
FROM
$wpdb->posts,
$wpdb->postmeta
WHERE
$wpdb->posts.ID = $wpdb->postmeta.post_id
AND $wpdb->posts.post_type = 'announcements'
AND ($wpdb->postmeta.meta_key = 'sap_start_date'
AND ($wpdb->postmeta.meta_value <= '$today' OR $wpdb->postmeta.meta_value = ''))
"));
但是,当我尝试修改以上内容来查询结束日期时,我什么也得不回来。我尝试将WHERE
部分更改为:
WHERE
$wpdb->posts.ID = $wpdb->postmeta.post_id
AND $wpdb->posts.post_type = 'announcements'
AND ($wpdb->postmeta.meta_key = 'sap_start_date'
AND ($wpdb->postmeta.meta_value <= '$today' OR $wpdb->postmeta.meta_value = ''))
AND ($wpdb->postmeta.meta_key = 'sap_end_date'
AND ($wpdb->postmeta.meta_value >= '$today' OR $wpdb->postmeta.meta_value = ''))
这将返回一个空数组。
问题:我如何编写此查询以检查sap_start_date
和sap_end_date
后置元值?
答案 0 :(得分:1)
我发现我的问题是我使用逻辑AND两次对同一个元密钥对象; postmeta.meta_key
如何等于start_date
和 end_date
?使用this SO question的答案,我设法重新编写查询以使用别名,这样我就可以获得postmeta
两次并查询两个不同的密钥:
SELECT
$wpdb->posts.post_title,
$wpdb->posts.ID,
$wpdb->posts.post_content
FROM
$wpdb->posts,
$wpdb->postmeta AS postmeta1,
$wpdb->postmeta AS postmeta2
WHERE
$wpdb->posts.ID = postmeta1.post_id
AND $wpdb->posts.ID = postmeta2.post_id
AND $wpdb->posts.post_type = 'announcements'
AND (postmeta1.meta_key = 'sap_start_date'
AND (postmeta1.meta_value <= '$today' OR postmeta1.meta_value = ''))
AND (postmeta2.meta_key = 'sap_end_date'
AND (postmeta2.meta_value >= '$today' OR postmeta2.meta_value = ''))
这很有效,虽然我对 的工作方式仍有点模糊。如果有人能够进一步了解这一点纯粹是出于教育目的,我们将不胜感激。