该查询需要根据两个自定义字段从数千篇帖子中获取信息。”每篇文章都需要“原始日期”,而“特色日期”是可选的(根据自定义复选框字段隐藏。选中后,默认情况下,“特色日期”设置为“原始日期”)。但是,如果为特定帖子设置了“特色日期”,那么它应该是优先的,并最终按照特色日期进行排序,就像原始日期设置为与特色日期相等一样。
也就是说,查询不需要首先按特色日期对所有帖子进行排序,&;然后是原始日期。相反,它需要将它们排序在一起,就像这些日期被合并到一列中一样。因此,用户可以通过设置特色日期将事件推到结果的顶部,但一旦创建了另一篇原始日期较晚的帖子,特色日期帖子就会从顶部掉下来。
Example database:
ID | post_title | meta_key | meta_value
---------------------------------------------
1 | Person 1 | original_date | Jan 2nd
2 | Person 2 | featured_date | Jan 1st
2 | Person 2 | original_date | Dec 1st
3 | Person 3 | featured_date | Jan 3rd
Expected query results:
ID | post_title | meta_key | meta_value
---------------------------------------------
3 | Person 3 | featured_date | Jan 3rd
1 | Person 1 | original_date | Jan 2nd
2 | Person 2 | featured_date | Jan 1st
如果创建了一个原始(或特色)日期为1月4日的新帖子,它现在将位于结果的顶部。
我研究了meta\\u查询,可以根据给定帖子是否存在这些自定义字段来获取帖子。但我还没有找到一种方法来对它们进行排序,以便将两个字段中的日期进行组合和排序,而不是先按一个字段排序,再按另一个字段排序。
$args = array(
\'post_type\' => \'custom_post_type\',
\'post_status\' => \'publish\',
\'paged\' => $paged,
\'meta_query\' => array(
\'relation\' => \'OR\',
array(
\'key\' => \'featured_date\',
\'type\' => \'DATE\',
\'compare\' => \'EXISTS\'
),
array(
\'key\' => \'original_date\',
\'type\' => \'DATE\',
\'compare\' => \'EXISTS\'
)
),
\'orderby\' => \'meta_value_date\',
\'order\' => \'DESC\',
// \'orderby\' => array(\'meta_value_date\' => \'DESC\')
);
$results = new WP_Query( $args );
我能够从下面的SQL查询中得到我想要的结果(尽管可能效率很低,因为我对SQL了解不多)。但是,使用此SQL查询的问题是,已经存在基于其他因素向初始查询添加额外参数的逻辑。我必须基于该逻辑重新实现添加到SQL查询,我想通过找出正确的wp\\U查询方法来避免这种情况。
$sql = $wpdb->get_results("SELECT * FROM (
SELECT DISTINCT *, $wpdb->postmeta.meta_value AS sort_date
FROM $wpdb->posts
INNER JOIN $wpdb->postmeta ON ( $wpdb->posts.ID = $wpdb->postmeta.post_id )
WHERE $wpdb->posts.post_type = \'custom_post_type\'
AND $wpdb->postmeta.meta_key = \'featured_date\'
AND $wpdb->posts.post_status = \'publish\'
UNION
SELECT DISTINCT *, $wpdb->postmeta.meta_value AS sort_date
FROM $wpdb->posts
INNER JOIN $wpdb->postmeta ON ( $wpdb->posts.ID = $wpdb->postmeta.post_id )
WHERE $wpdb->posts.post_type = \'custom_post_type\'
AND $wpdb->postmeta.meta_key = \'original_date\'
AND $wpdb->posts.post_status = \'publish\'
) AS created_table
GROUP BY ID
ORDER BY sort_date DESC");
<小时/>
Edit - birgire的回答让我意识到值得一提的是,这是一个插件,它已经在许多网站的生产中使用。当前功能按“original\\u date”对帖子进行排序。但它被要求允许用户将某些帖子推到顶部,同时仍然尊重队列(即,稍后的帖子将位于其上方)。featured\\u日期是请求的功能。