【发布时间】:2018-05-04 17:18:01
【问题描述】:
我正在构建一个基于 WordPress 的活动网站。每个事件最多需要应用三个日期范围(我已经使用Advanced Custom Fields 插件添加了这些日期范围)。事件显示在带有日期和类别过滤器的简单页面上。我使用meta_query 进行了尝试,但速度非常慢(参见下面的代码)。我现在明白这是一个已知问题。所以基本上,我正在寻找替代方案。根据我的阅读,$wpdb 是一个可能的解决方案,但我对此没有太多经验。
非常感谢任何帮助。谢谢你。
$events = new WP_Query(array(
'post_type' => 'post',
'category_name' => $category_list,
'meta_query' => array(
'relation' => 'OR',
array('relation' => 'AND', array('key' => 'event_start_date_1', 'compare' => '<=', 'value' => $date, 'type' => 'DATE'), array('key' => 'event_finish_date_1', 'compare' => '>=', 'value' => $date, 'type' => 'DATE'),
),
array('relation' => 'AND', array('key' => 'event_start_date_2', 'compare' => '<=', 'value' => $date, 'type' => 'DATE'),array('key' => 'event_finish_date_2', 'compare' => '>=', 'value' => $date, 'type' => 'DATE'),
),
array('relation' => 'AND', array('key' => 'event_start_date_3', 'compare' => '<=', 'value' => $date, 'type' => 'DATE'), array('key' => 'event_finish_date_3', 'compare' => '>=', 'value' => $date, 'type' => 'DATE'),
),
),
));
更新
以下似乎有效
SELECT * FROM $wpdb->posts, $wpdb->postmeta m1, $wpdb->postmeta m2, $wpdb->term_relationships, $wpdb->term_taxonomy, $wpdb->terms
WHERE
$wpdb->posts.ID = m1.post_id AND $wpdb->posts.ID = m2.post_id
AND $wpdb->posts.ID = $wpdb->term_relationships.object_id
AND $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id
AND $wpdb->term_taxonomy.term_id = $wpdb->terms.term_id
AND $wpdb->term_taxonomy.taxonomy = 'category'
AND $wpdb->terms.slug IN ('$category_list')
AND $wpdb->posts.post_status = 'publish'
AND
(
((m1.meta_key = 'event_start_date_1' AND m1.meta_value <= '$date') AND (m2.meta_key = 'event_finish_date_1' AND m2.meta_value >= '$date'))
OR
((m1.meta_key = 'event_start_date_2' AND m1.meta_value <= '$date') AND (m2.meta_key = 'event_finish_date_2' AND m2.meta_value >= '$date'))
OR
((m1.meta_key = 'event_start_date_3' AND m1.meta_value <= '$date') AND (m2.meta_key = 'event_finish_date_3' AND m2.meta_value >= '$date'))
OR
((m1.meta_key = 'event_start_date_4' AND m1.meta_value <= '$date') AND (m2.meta_key = 'event_finish_date_4' AND m2.meta_value >= '$date'))
)
GROUP BY $wpdb->posts.ID
我不确定这是最有效的解决方案,因此欢迎提出任何改进建议。
【问题讨论】:
标签: php mysql wordpress advanced-custom-fields