web-dev-qa-db-ja.com

5つの異なるカスタム投稿タイプのそれぞれから最新の投稿を3つ取得する

5種類のカスタム投稿タイプがあります。以下のクエリを使用して、私のホームページにそれらの最新の投稿15件を表示しています。

$query = new WP_Query( array (
             'posts_per_page'   => 15,
             'post_type' => array ( 'cpt1', 'cpt2', 'cpt3', 'cpt4', 'cpt5' ) 
          )
 );

それはうまく機能し、これら5つのカスタム投稿タイプからの最新の15の投稿を表示します。しかし、問題は、cpt1およびcpt3()の更新が多すぎることです。各投稿タイプで1日あたり約8-10件の投稿)。ホームページでは、cpt2/4/5からの投稿はめったに見つかりません。

だから私は(ソート)で順序として日付を使用して、各投稿タイプ(合計15の投稿)から最新の3の投稿を表示したいです。そのため、各投稿タイプから3つの投稿が表示され、5つの投稿タイプすべての中で日付に基づいてソートされます。しかし、私はこれに対する良い解決策を見つけることができませんでした。

これまでに思いついたのは、5つのクエリを実行し、それらを配列に保存してから並べ替えることです。

5つのクエリではなく、1つのクエリだけでこれを実行できる方法はありますか。

2
тнє Sufi

これが最も効率的なオプションであるかどうかはわかりませんが、次のようにして行っています。

  1. get_postsを使用して5つの別々のクエリを保存し、それらを単一の配列に保存しました
  2. 多次元であるため、配列を平坦化する必要がありました。それから、最新の投稿を得るためにpost_dateを使ってusortを使いました
  3. データベースの呼び出しを最小限に抑えるために、 Transient API を使用してこのソート済みデータを保存しました。

これがコードです:

function delete_front_page_query_results() {
    delete_transient('post_data');

    $query_cpt1 = array (
            'posts_per_page'   => 3,
            'post_type' => 'cpt1'
            );
    $query_cpt2 = array (
            'posts_per_page'   => 3,
            'post_type' => 'cpt2'
            );
    $query_cpt3 = array (
            'posts_per_page'   => 3,
            'post_type' => 'cpt3'
            );
    $query_cpt4 = array (
            'posts_per_page'   => 3,
            'post_type' => 'cpt4'
            );
    $query_cpt5 = array (
            'posts_per_page'   => 3,
            'post_type' => 'cpt5'
            );

    $query_results[] = get_posts($query_cpt1);
    $query_results[] = get_posts($query_cpt2);
    $query_results[] = get_posts($query_cpt3);
    $query_results[] = get_posts($query_cpt4);
    $query_results[] = get_posts($query_cpt5);

    //flattening three dimentional array to two dimensonal array
    $flatten_array =array();
    foreach ($query_results as $data) {
            foreach($data as $flatten_data) {
                 $flatten_array[] = $flatten_data;
            }
    }

    function cpt_array_sort($a, $b) {
            return strtotime($b->post_date) - strtotime($a->post_date);
    }
    usort($flatten_array, 'cpt_array_sort');

    //setting transient with the array
    set_transient ( 'post_data', $flatten_array, 365*24*60*60);
}
add_action('publish_post', 'delete_front_page_query_results);
2
тнє Sufi

単一のクエリでこれを行う方法はありません。 SQLコマンドはこのタイプの処理を処理するようには構築されていないため、複数のクエリに分割する必要があります。したがって、WordPressのQuery APIも同様です。

0
Tyler Carter