いくつかの投稿を表示するためのクエリがあります。
$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の上に目的の投稿を「貼り付ける」のではなく、ページごとに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の記事の上に固執する
ページクエリ内
次のように2つのクエリを実行できます。
// 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();
}
あなたが前にそれらの投稿を持つ1つのページだけを必要とするならば、そして@ birgireによる解決策はちょうどうまく仕事をするでしょう
これを2つのクエリで実行できます。
最初に必要な投稿IDを最初のクエリで取得し、それをスティッキーな投稿IDとマージして、フィルタリングと順序付けのためにpost__in
パラメータを使用して2番目のクエリに渡します。
$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
を調整します。
Birgireの解決策はそのままでは私にはうまくいきませんでした。ソート後に引数にpost_type
を指定する必要がありました。
これがクラスとして作られた私の修正です。
class locations{
public function __construct(){
$this->args = [
'post_type' => 'location',
'posts_per_page' => -1,
'orderby' => 'title',
'order' => 'asc',
'fields' => 'ids',
'ignore_sticky_posts' => true,
];
$this->ids = get_posts($this->args);
$this->get = new WP_Query($this->sort_ids());
}
//Sorts the locations by specified criteria
private function sort_ids(){
$stickies = [2071,2080,2069,1823];
$post__in = array_unique(array_merge($stickies, $this->ids));
$args = [
'post_type' => 'location',
'post__in' => $post__in,
'orderby' => 'post__in',
'order' => 'asc',
'posts_per_page' => -1,
'ignore_sticky_posts' => true,
];
return $args;
}
}