WordPress - 按 ACF 日期排序,首先是日期,最后是空字段

问题描述 投票:0回答:2

我正在尝试通过 ACF 提供的 dick picker 来订购内容。

  • 按日期字段排序
    • 日期按最早(过去/现在)到最远的顺序排列(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
                (
                    [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

任何提示或技巧,或者如果您也遇到了问题,我很想看看您做了什么。

php wordpress advanced-custom-fields
2个回答
0
投票

对于任何也尝试这样做的人来说,最终结果是使用自定义的

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__';

0
投票

对此的快速补充;

我的解决方案有点“脏”,但很简单。

我做了一个简单的

orderby
,所以空白首先出现。当我逐步查看结果时,我将它们放入带有 CSS
flex
flex-direction:column
的容器中。然后我可以给空白日期 CSS
order:1000
,它们会出现在最后。

© www.soinside.com 2019 - 2024. All rights reserved.