如何结合对多数组meta_key查询的排序

时间:2018-10-01 07:52:28

标签: wordpress

我有一个查询,在这里我首先检查所有具有meta_key topbox(具有特色的帖子)的帖子。之后,我要检查他们在meta_key topbopx_order中设置了哪些自定义顺序。 到目前为止,它工作正常,除非两个帖子具有相同的订单值,否则它的行为会始料不及。在我看来,它根本没有考虑日期,因为我在该行中还有更多的帖子,这些帖子的更新发布日期和顺序设置为1,但它们不会显示。

这是我到目前为止的查询

        $feat_args = array(
                    'posts_per_page'      => 5,
                    'post_status'         => 'publish',
                    'meta_key'            => 'topbox_order',
                    'meta_query'          => array(
                        'relation' => 'AND',
                            array(
                                'key'     => 'asb_topbox',
                                'value'   => 'yes',
                                'compare' => '='
                            ),
                            array(
                                'key'     => 'topbox_order',
                                'value'   => array(1, 2, 3, 4, 5),
                                'compare' => 'IN'
                            )
                       ),
                    'orderby' => array (
                        'meta_value_num' => 'ASC',
                        'date'           => 'DESC'
                        ),                  
                    'ignore_sticky_posts' => true,
                    'no_found_rows'       => true,
                    );

        $feat = new WP_Query( $feat_args );

另外,我将所有帖子的topbox_order默认设置为值1。

修改 我现在知道,我可能正在尝试实现一些不可能的事情。我想将订单设置为发布,但同时,我希望它们被具有相同或更高订单号的新发布下推。 compare的组合是否允许这种行为?

1 个答案:

答案 0 :(得分:0)

解决方案太复杂了,似乎太复杂了。经过与客户的讨论,我们决定走另一条路-仅控制该行中的第一条帖子。

这就是我最终得到的结果-我打电话给两组帖子,在它们到达主wp_query并显示之前对其进行排序。

        // first query
        $first_ids = get_posts( array(
            'fields'         => 'ids',
            'posts_per_page' => '1',
            'post_status'    => 'publish',
            'orderby'        => 'date',
            'meta_key'       => 'asb_topbox',
            'meta_query'     => array(
            'relation'       => 'AND',
                array(
                    'key'     => 'asb_topbox',
                    'value'   => 'yes',
                    'compare' => '='
                    ),
                array(
                    'key'     => 'topbox_ofset',
                    'value'   => 'no',
                    'compare' => '='
                )
            )               
        ));

        // second query
        $second_ids = get_posts( array(
            'fields'         => 'ids',
            'posts_per_page' => '5', // because one can be the same as first
            'post_status'    => 'publish',
            'orderby'        => 'date',
            'meta_key'       => 'asb_topbox',
            'meta_query'     => array(
            'relation'       => 'AND',
                array(
                    'key'     => 'asb_topbox',
                    'value'   => 'yes',
                    'compare' => '='
                ),
                array(                  
                'relation' => 'OR',
                    array(
                        'key'       => 'topbox_ofset',
                        'compare'   => 'EXISTS'
                        ),
                    array(
                        'key'       => 'topbox_ofset',
                        'compare'   => 'NOT EXISTS'
                        )
                )
            )
        ));
        // Remove duplicates
        $mergedposts = array_unique( array_merge( $first_ids, $second_ids));

        $feat_args = array(
                    'posts_per_page'      => 5,
                    'post_status'         => 'publish',
                    'post__in'            => $mergedposts,
                    'orderby'             => 'post__in',                    
                    'ignore_sticky_posts' => true,
                    'no_found_rows'       => true
                    );

原则上,您可以将帖子设置为跳到第二位置。不,我不想为此使用粘性,因为随着时间的流逝,我到处都会有粘性帖子,也不想记住,我必须使它们变得不粘性。我的解决方案使日期保持顺畅,我可以将第一篇文章保留更长的时间,而不会影响其余的档案。