我正在尝试通过 ACF 提供的 dick picker 来订购内容。
我有以下查询参数:
(
[post_type] => people
[posts_per_page] => 10
[paged] => 1
[meta_query] => Array
(
[0] => Array
(
[key] => has_scheduling
[value] => 1
)
[1] => Array
(
[key] => custom_ID
[compare] => !=
[value] =>
)
[2] => Array
(
[key] => date_picker
[compare] => !=
[value] =>
)
)
[tax_query] => Array
(
[0] => Array
(
[taxonomy] => people_types
[field] => term_id
[terms] => 153
)
)
[meta_key] => date_picker
[orderby] => meta_value_num
[order] => ASC
)
我注意到这个查询只会正确加载第一部分。它根据所有参数抓取内容,然后按日期排序,但排除没有设置日期的内容。
我也尝试过这个:
(
[post_type] => people
[posts_per_page] => 10
[paged] => 1
[meta_query] => Array
(
[0] => Array
(
[key] => has_scheduling
[value] => 1
)
[1] => Array
(
[key] => custom_ID
[compare] => !=
[value] =>
)
[2] => Array
(
[relation] => OR
[0] => Array
(
[key] => date_picker
[compare] => EXISTS
)
[1] => Array
(
[key] => date_picker
[compare] => NOT EXISTS
)
)
)
[tax_query] => Array
(
[0] => Array
(
[taxonomy] => people_types
[field] => term_id
[terms] => 153
)
)
[orderby] => meta_value
[order] => ASC
)
所以这里我不排除空字段,我检查它是否存在,然后不存在。然后再次按数据排序。我还改用
meta_value
而不是 meta_value_num
任何提示或技巧,或者如果您也遇到了问题,我很想看看您做了什么。
对于任何也尝试这样做的人来说,最终结果是使用自定义的
orderby
过滤器结束的。下面是示例代码。
// Order By custom date.
add_filter('posts_orderby', function (string $orderby, WP_Query $query) {
if ($query->get('orderby') === '__custom_date__') {
$orderby = "mta.meta_value is NULL, mta.meta_value ='', mta.meta_value ASC";
}
return $orderby;
}, 10, 2);
// Extra join to order by custom date.
add_filter('posts_join', function (string $join, WP_Query $query) {
if ($query->get('orderby') === '__custom_date__') {
$join .= " LEFT JOIN wp_postmeta AS mta ON ( wp_posts.ID = mta.post_id AND mta.meta_key = 'date_picker')";
}
return $join;
}, 10, 2);
然后将其用作传递给
orderby
的参数
$args['orderby'] = '__custom_date__';
对此的快速补充;
我的解决方案有点“脏”,但很简单。
我做了一个简单的
orderby
,所以空白首先出现。当我逐步查看结果时,我将它们放入带有 CSS flex
和 flex-direction:column
的容器中。然后我可以给空白日期 CSS order:1000
,它们会出现在最后。