Php 如何按日期对包含通过合并get_posts结果创建的WP post对象的数组进行排序?
我想通过合并两个单独的get_posts查询的结果来创建一个post数组,并按发布日期对该数组进行排序 在我下面的代码中,$args_b和$args_a的get_帖子已合并到一个数组中,但它们是分开的:首先列出$args_b的9个标题,然后列出$args_a的9个标题。我想把它们混在一起,按日期点。我该如何分类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
<?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正如您所提到的,这很难。这几个小时没有结果。我放弃了自己去解决这个问题,并且会提出新的问题。谢谢你编辑我的问题。对不起,我的语言能力很差。下次我会小心的。谢谢你编辑我的问题。对不起,我的语言能力很差。下次我会小心的。