web-dev-qa-db-ja.com

投稿IDに基づいてループの最初の投稿を一覧表示する方法

いくつかの投稿を表示するためのクエリがあります。

$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内の変数がこの種の機能をサポートしているとしたら?

6
Ron

もしあなたが必要ならば:

  • クエリをページングする

  • 必要な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による解決策はちょうどうまく仕事をするでしょう

7
Pieter Goosen

これを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を調整します。

4
birgire

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;
  }
}
0
Alex Standiford