首页 > 解决方案 > 如何在多数组元键查询中组合排序

问题描述

我有一个查询,我首先检查所有具有 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允许这种行为的组合?

标签: wordpress

解决方案


解决方案超出了我的想象,似乎太复杂了。在与客户交谈后,我们决定采用不同的方法 - 仅控制该行中的第一个帖子。

这是我最终得到的结果-我正在调用两组帖子,在它们到达主 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
                    );

原则上,您可以将帖子设置为跳到第二个位置。不,我不想为此使用粘性,因为随着时间的推移,我会在整个地方都有粘性帖子并且不想记住,我必须让它们不粘。我的解决方案保持了日期流,我可以在不影响其余档案的情况下保留第一个帖子更长的时间。


推荐阅读