问题描述
我有一个查询显示一些帖子。
$args = array(
'post_type' =>'products'
'posts_per_page'=> 12,
'orderby' => 'meta_value_num',
'meta_key' => '_price',
'order' => 'asc',
);
$loop=new WP_Query($args);
while($loop->have_posts()) : $loop->the_post();
the_content();
endwhile;
在这个循环中我得到的产品,但我需要在这个循环中首先出现一些产品。 12,13,14,34 这些是我的帖子 id,我需要首先出现在循环中。
我该如何首先显示这个帖子,休息其他人? 。有没有办法做到这一点。如果 $ args 中的任何变量支持这种功能?
最佳解决方案
如果你需要:
-
页面查询
-
每页保留 12 个帖子,而不是”sticking” 所需的帖子在所需的 12 个顶部
-
只需要在第一页显示这些帖子
你可以尝试以下几点
$ids_args = [
'post_type' => 'products'
'posts_per_page' => -1,
'orderby' => 'meta_value_num',
'meta_key' => '_price',
'order' => 'ASC',
'fields' => 'ids'
];
$all_posts_ids = get_posts( $ids_args );
// Make sure we have posts before continuing
if ( $all_posts_ids ) {
// Set all our posts that should move to the front
$move_to_front = [12,13,14,34];
// Add the array of posts to the front of our $all_posts_ids array
$post_ids_merged = array_merge( $move_to_front, $all_posts_ids );
// Make sure that we remove the ID's from their original positions
$reordered_ids = array_unique( $post_ids_merged );
// Now we can run our normal query to display 12 posts per page
$args = [
'post_type' => 'products'
'posts_per_page' => 12,
'post__in' => $reordered_ids,
'orderby' => 'post__in',
'order' => 'ASC',
'paged' => get_query_var( 'paged', 1 ),
];
$loop = new WP_Query( $args );
while( $loop->have_posts() ) {
$loop->the_post();
the_content();
}
wp_reset_postdata();
}
如果你需要这些帖子
-
在每个页面上贴上 12 个帖子
-
在分页查询中
您可以运行两个查询如下
// Set an array of id's to display in front
$move_to_front = [12,13,14,34];
// Run the query to display the posts you need in front
$args_front = [
'post_type' => 'products'
'posts_per_page' => count( $move_to_front ),
'post__in' => $move_to_front,
'orderby' => 'meta_value_num',
'meta_key' => '_price',
'order' => 'ASC',
];
$loop_front = new WP_Query( $args_front );
if( $loop_front->have_posts() ) {
while( $loop_front->have_posts() ) {
$loop_front->the_post();
the_content();
}
wp_reset_postdata();
}
// Now we can run our major loop to display the other posts
$args = [
'post_type' => 'products'
'posts_per_page' => 12,
'post__not_in' => $move_to_front,
'orderby' => 'meta_value_num',
'meta_key' => '_price',
'order' => 'ASC',
'paged' => get_query_var( 'paged', 1 ),
];
$loop = new WP_Query( $args );
if( $loop->have_posts() ) {
while( $loop->have_posts() ) {
$loop->the_post();
the_content();
}
wp_reset_postdata();
}
如果您只需要前面那些帖子的一个页面,那么 @birgire 的解决方案就可以做到这一点
次佳解决方案
我们可以用两个查询:
首先,我们使用第一个查询获取我们需要的帖子,然后我们将其与我们的粘贴帖子 ID 进行合并,并将其提供到第二个查询中,并使用 post__in
参数进行过滤和排序:
$args = [
'post_type' => 'products'
'posts_per_page' => 12,
'orderby' => 'meta_value_num',
'meta_key' => '_price',
'order' => 'asc',
'ignore_sticky_posts' => true,
'fields' => 'ids',
];
$ids = get_posts( $args );
if( ! empty( $ids ) )
{
$stickies = [12,13,14,34];
$post__in = array_unique( array_merge( $stickies, $ids ) );
$args = [
'post__in' => $post__in,
'orderby' => 'post__in',
'ignore_sticky_posts' => true,
];
$loop = new WP_Query( $args );
// ... etc
}
在那里我们调整 $stickies
的自定义粘贴帖子。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。