Php 如何按日期对包含通过合并get_posts结果创建的WP post对象的数组进行排序?

Php 如何按日期对包含通过合并get_posts结果创建的WP post对象的数组进行排序?,php,wordpress,sorting,Php,Wordpress,Sorting,我想通过合并两个单独的get_posts查询的结果来创建一个post数组,并按发布日期对该数组进行排序 在我下面的代码中,$args_b和$args_a的get_帖子已合并到一个数组中,但它们是分开的:首先列出$args_b的9个标题,然后列出$args_a的9个标题。我想把它们混在一起,按日期点。我该如何分类 <?php $args_a = array( 'posts_per_page' => 9, 'category_name' => 'shinma

我想通过合并两个单独的get_posts查询的结果来创建一个post数组,并按发布日期对该数组进行排序

在我下面的代码中,$args_b和$args_a的get_帖子已合并到一个数组中,但它们是分开的:首先列出$args_b的9个标题,然后列出$args_a的9个标题。我想把它们混在一起,按日期点。我该如何分类

<?php
    $args_a = array(
    'posts_per_page' => 9,
    'category_name' => 'shinmatsudo',
    'category__in' => array( 227 ),
    'category__not_in' => array( 3 ),
    'meta_query' => array(
                          'relation' => 'AND',
                                              array(
                                                    'key'     => '1b',
                                                    'compare' => 'NOT EXISTS'
                                                     ),
    
                                               array(
                                                    'key'     => '1d',
                                                    'compare' => 'NOT EXISTS'
                                                     ),
                                                                
                          ), 
    );?>
    
    
    <?php
    $args_b = array(
    'category_name' => 'matsudo',
    'posts_per_page' => 9,
    'category__in' => array( 329 ),
    'category__not_in' => array( 3 ),
    'meta_query' => array(
                    'relation' => 'and',
                                    array(
                                    'key'=> '2a',
                                    'value' => array('2020-02-01' , '2020-06-01'),
                                    'compare' => 'BETWEEN',
                                    'type' => 'DATE',
                                    ),
                        ),
    );
    ?>
    
    
    <?php
    global $post;
    $my_posts= array_merge( get_posts($args_b), get_posts($args_a) );
    
    
    foreach($my_posts as $post):setup_postdata($post);?>

    <?php the_title(); ?>
        
    <?php endforeach; ?>
    <?php wp_reset_postdata(); ?>

合并两个单独查询的结果不会改变顺序,因此您需要自己对它们进行排序

因为get_posts返回一个对象数组,所以我们需要使用一个排序函数来创建一个用户定义的比较,例如-换句话说,我们告诉它排序的值和顺序

如果您使用的是PHP 7,则可以使用匿名函数进行排序和比较,因此您只需要以下内容:

usort($my_posts, function($post_a, $post_b) {
    // Compare the post_date of the posts, and if $post_b is newer, then it will be displayed first
    return $post_b->post_date <=> $post_a->post_date;
});
请注意,通常使用return$a->value$b->value;要以升序返回结果,但由于我们正在处理日期,并且希望首先返回最新的日期,那么我们需要将比较反转为return$b->value$a->value

因此,在您的代码中,您只需要像这样使用它:

<?php
// do your merge...
$my_posts= array_merge( get_posts($args_b), get_posts($args_a) );

// sort the resulting array...
usort($my_posts, function($post_a, $post_b) {
    return $post_b->post_date <=> $post_a->post_date;
});   

// and now process the new sorted array as required.    
foreach($my_posts as $post):setup_postdata($post);?>
    <?php the_title(); ?>
<?php endforeach; ?>
<?php wp_reset_postdata(); ?>
更新:如果您仍然使用PHP5,那么您不应该使用!,您可以改为使用以下选项:

usort($my_posts, function ($a, $b) {
    if ($a->post_date < $b->post_date)       return -1;
    elseif ($a->post_date > $b->post_date)   return 1;
    else                                     return 0;
});

合并两个单独查询的结果不会改变顺序,因此您需要自己对它们进行排序

因为get_posts返回一个对象数组,所以我们需要使用一个排序函数来创建一个用户定义的比较,例如-换句话说,我们告诉它排序的值和顺序

如果您使用的是PHP 7,则可以使用匿名函数进行排序和比较,因此您只需要以下内容:

usort($my_posts, function($post_a, $post_b) {
    // Compare the post_date of the posts, and if $post_b is newer, then it will be displayed first
    return $post_b->post_date <=> $post_a->post_date;
});
请注意,通常使用return$a->value$b->value;要以升序返回结果,但由于我们正在处理日期,并且希望首先返回最新的日期,那么我们需要将比较反转为return$b->value$a->value

因此,在您的代码中,您只需要像这样使用它:

<?php
// do your merge...
$my_posts= array_merge( get_posts($args_b), get_posts($args_a) );

// sort the resulting array...
usort($my_posts, function($post_a, $post_b) {
    return $post_b->post_date <=> $post_a->post_date;
});   

// and now process the new sorted array as required.    
foreach($my_posts as $post):setup_postdata($post);?>
    <?php the_title(); ?>
<?php endforeach; ?>
<?php wp_reset_postdata(); ?>
更新:如果您仍然使用PHP5,那么您不应该使用!,您可以改为使用以下选项:

usort($my_posts, function ($a, $b) {
    if ($a->post_date < $b->post_date)       return -1;
    elseif ($a->post_date > $b->post_date)   return 1;
    else                                     return 0;
});

非常感谢你!我刚刚尝试了PHP7的方法。它完全按照我的预期工作!我能再问你一件事吗?我通常在数组中使用'paged'=>$paged进行分页。现在,在这种情况下,我应该在哪里设置它?我将它同时设置为$args_a和$args_b,但是分页没有出现。很高兴它起作用了!在自定义查询上设置分页稍微复杂一些。这是一个全新的问题,但这里有几个相关的SO问题:&或此页面:[使用WP_查询创建分页]。。。但是,我不确定您将如何对所做的事情进行分页,因为您正在对查询后的结果进行排序。。。这是一个艰难的时刻@谢谢你的回复。再次感谢您提供的相关链接。@FluttyKitten正如您所提到的,这很难。这几个小时没有结果。我放弃了自己去解决它,并将提出新的问题。非常感谢!我刚刚尝试了PHP7的方法。它完全按照我的预期工作!我能再问你一件事吗?我通常在数组中使用'paged'=>$paged进行分页。现在,在这种情况下,我应该在哪里设置它?我将它同时设置为$args_a和$args_b,但是分页没有出现。很高兴它起作用了!在自定义查询上设置分页稍微复杂一些。这是一个全新的问题,但这里有几个相关的SO问题:&或此页面:[使用WP_查询创建分页]。。。但是,我不确定您将如何对所做的事情进行分页,因为您正在对查询后的结果进行排序。。。这是一个艰难的时刻@谢谢你的回复。再次感谢您提供的相关链接。@FluttyKitten正如您所提到的,这很难。这几个小时没有结果。我放弃了自己去解决这个问题,并且会提出新的问题。谢谢你编辑我的问题。对不起,我的语言能力很差。下次我会小心的。谢谢你编辑我的问题。对不起,我的语言能力很差。下次我会小心的。