我有一个自定义块,它使用以下代码获取逗号分隔的帖子列表。
$numberposts = "7,9,5,10";
$post_ids = explode( \',\', $numberposts );
$args = array(
\'post_type\' => \'post\',
\'post__in\' => $post_ids,
\'numberposts\' => \'9999999\'
);
$list_posts = get_posts( $args );
问题是返回的数据没有按照提供的ID的原始顺序排序。有可能做到吗?你能帮忙吗?
最合适的回答,由SO网友:Tom J Nowell 整理而成
您可以将orderby设置为post__in
. 下面是一个出色的post循环:
$args = [
\'post__in\' => [ 1, 2, 3, 4 ],
\'orderby\' => \'post__in\',
];
$q = new \\WP_Query( $args );
if ( $q->have_posts() ) {
while ( $q->have_posts() ) {
$q->the_post();
?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<?php the_title(); ?>
</article>
<?php
}
wp_reset_postdata();
} else {
echo \'<p>No posts found</p>\';
}
重要变化:
get_posts
不会触发所有循环生命周期筛选器,默认情况下绕过缓存(suppress_filters
在中设置为trueget_posts
), 不会为您设置当前帖子。它还使用WP_Query
在内部,所以我去掉了中间人WP_Query
直接地此循环速度更快,可扩展性更强,兼容性更强numberposts
和post_type
, 这些是不必要的,如果WP使用它们,实际上会减慢查询速度。WP知道您想通过post__in
所以它只会取那些orderby
设置为post__in
因此,帖子将按请求的顺序显示,我使用了PHP数组,而不是explode
在字符串上(这会给出相同的结果,那么为什么要做额外的工作?)我用过the_ID
和post_class
因此,内部循环标记将具有适当的类strongly建议您通读本文档:https://developer.wordpress.org/reference/classes/wp_query/ 它将在将来节省大量时间,并且有许多示例。