WordPress查询-按日期排序和按类别替换

WordPress查询-按日期排序和按类别替换,wordpress,Wordpress,我有一个名为“services”的自定义post类型和一个名为“location”的自定义分类法。每个职位被归类为“位置A”或“位置B” 我需要从“服务”帖子类型查询所有帖子,并按日期排序。但是,我不想简单地按日期列出,而是想按每个类别交替发布帖子,如下所示: “地点A”的最新帖子 来自“位置B”的最新帖子 “地点A”的第二篇最新帖子 “位置B”的第二篇最新帖子 “地点A”的第三篇最新帖子 “位置B”的第三篇最新帖子 等等 是否可以修改以下查询以实现此目的?或者我必须做一些高级的数据库连接/合并

我有一个名为“services”的自定义post类型和一个名为“location”的自定义分类法。每个职位被归类为“位置A”或“位置B”

我需要从“服务”帖子类型查询所有帖子,并按日期排序。但是,我不想简单地按日期列出,而是想按每个类别交替发布帖子,如下所示:

  • “地点A”的最新帖子
  • 来自“位置B”的最新帖子
  • “地点A”的第二篇最新帖子
  • “位置B”的第二篇最新帖子
  • “地点A”的第三篇最新帖子
  • “位置B”的第三篇最新帖子 等等
  • 是否可以修改以下查询以实现此目的?或者我必须做一些高级的数据库连接/合并(不太熟悉这种方法)

    
    
    补充说明:

    • 在每个类别中不会有偶数个帖子,所以我需要查询来继续列出位置A中的帖子,一旦位置B中的帖子用完,反之亦然
    • 如果一篇文章被分为两个类别,会发生什么?我不想让它表现出来 两次
    • 自定义分类法“位置”由几个不同的帖子类型共享。但我一次只想查询一个帖子类型
    • 我需要保留的能力,使某些职位粘性

    这可能吗?非常感谢。

    请检查代码是否适合您。对不起,代码太长了

    <?php
    $a1 = get_posts(array(
        'post_type' => 'services',
        'posts_per_page' => '-1',
        'order_by' => 'date',
        'order' => 'DESC',
        'tax_query' => array(
            array(
                'taxonomy' => 'location',
                'field' => 'slug',
                'terms' => 'location-a'
            )
        ),
        'fields' => 'ids' // only get post IDs.
    ));
    $a2 = get_posts(array(
        'post_type' => 'services',
        'posts_per_page' => '-1',
        'order_by' => 'date',
        'order' => 'DESC',
        'tax_query' => array(
            array(
                'taxonomy' => 'location',
                'field' => 'slug',
                'terms' => 'location-b'
            )
        ),
        'fields' => 'ids' // only get post IDs.
    ));
    if (count($a1) >= count($a2)) {
    
        $count = count($a1);
    
    } else {
        $count = count($a2);
    
    }
    
    $newArray = array();
    for ($i = 0; $i < $count; $i++) {
        $newArray[] = $a1[$i];
        $newArray[] = $a2[$i];
    }
    
    
    $wp_query = new WP_Query(array(
        'post_type' => 'product',
        'post__in' => $newArray,
        'orderby' => 'post__in'
    ));
    
    if ($wp_query -> have_posts()):
        while ($wp_query -> have_posts()):
            the_post();
    
            echo get_the_title() . '<br>';
        endwhile;
    endif;
    ?>
    
    
    
    这可以在一个查询中通过适当的排序完成:-)。只是一个提示,千万不要使用
    query\u posts
    。这里要使用的正确函数是
    WP\u Query
    get\u posts
    @Pieter Goosen Thanx。我会记住你的建议。你能发布一个好的解决方案吗?它将在未来帮助我们所有人。我已经按照Pieter的建议制作了chnegs。如果今晚有时间,我会看一看:-)我认为这是一个值得回答的问题。感谢@Pieter Goosen thanx提出的解决方案,我觉得它确实不错。但是我会测试它,让你知道我已经测试并重新测试了我的代码,它是有效的。我认为你的价值观在某个地方犯了错误。我现在已经把我的答案移到了WPSE,因为它会更有用。嗯,也许我已经这样做了。如果你得到了正确的结果,我一定是弄错了。我将使用您的代码重新测试并仔细查看。看起来你已经删除了你的答案,但是如果我能够让你的代码正常工作,我想把它标记为正确的,因为它更精简。对于任何感兴趣的人来说,@PieterGoosen code有效,并且比下面的答案更有效,尽管这个答案也是正确的。您可以在此处找到Pieter的代码:
    <?php
    $a1 = get_posts(array(
        'post_type' => 'services',
        'posts_per_page' => '-1',
        'order_by' => 'date',
        'order' => 'DESC',
        'tax_query' => array(
            array(
                'taxonomy' => 'location',
                'field' => 'slug',
                'terms' => 'location-a'
            )
        ),
        'fields' => 'ids' // only get post IDs.
    ));
    $a2 = get_posts(array(
        'post_type' => 'services',
        'posts_per_page' => '-1',
        'order_by' => 'date',
        'order' => 'DESC',
        'tax_query' => array(
            array(
                'taxonomy' => 'location',
                'field' => 'slug',
                'terms' => 'location-b'
            )
        ),
        'fields' => 'ids' // only get post IDs.
    ));
    if (count($a1) >= count($a2)) {
    
        $count = count($a1);
    
    } else {
        $count = count($a2);
    
    }
    
    $newArray = array();
    for ($i = 0; $i < $count; $i++) {
        $newArray[] = $a1[$i];
        $newArray[] = $a2[$i];
    }
    
    
    $wp_query = new WP_Query(array(
        'post_type' => 'product',
        'post__in' => $newArray,
        'orderby' => 'post__in'
    ));
    
    if ($wp_query -> have_posts()):
        while ($wp_query -> have_posts()):
            the_post();
    
            echo get_the_title() . '<br>';
        endwhile;
    endif;
    ?>