Ordering posts in get_posts

时间:2020-12-23 作者:asanas

我有一个自定义块,它使用以下代码获取逗号分隔的帖子列表。

    $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的原始顺序排序。有可能做到吗?你能帮忙吗?

1 个回复
最合适的回答,由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 直接地此循环速度更快,可扩展性更强,兼容性更强numberpostspost_type, 这些是不必要的,如果WP使用它们,实际上会减慢查询速度。WP知道您想通过post__in 所以它只会取那些orderby 设置为post__in 因此,帖子将按请求的顺序显示,我使用了PHP数组,而不是explode 在字符串上(这会给出相同的结果,那么为什么要做额外的工作?)the_ID 和post_class 因此,内部循环标记将具有适当的类strongly建议您通读本文档:https://developer.wordpress.org/reference/classes/wp_query/ 它将在将来节省大量时间,并且有许多示例。

相关推荐