• 解決済 qnqn

    (@qnqn)


    初めて質問させていただきますので不作法がございましたら申し訳ありません。

    以下の条件で新着情報一覧を表示したい部分があります。
    ・デフォルトの投稿で新着情報を投稿し、通常通り一覧表示する
    ・カスタム投稿も同じ一覧に表示するが、最新のみ取得する

    WP_queryでpost_typeを複数設定すると「最新記事のみ」という条件を反映できないため、
    https://teratail.com/questions/26139
    の記事を参考にSQL文を以下のように記載いたしました。

    $query = <<<EOT
    SELECT * FROM
        (
            SELECT post_type, max(post_date) AS tmp
                FROM {$wpdb->posts}
                WHERE post_status = 'publish'
                AND post_type IN ('post','post1','post2')
                GROUP BY post_type
                ORDER BY post_date DESC
        ) AS post
        INNER JOIN {$wpdb->posts} AS ij ON ij.post_type = post.post_type
        AND ij.post_date = post.tmp
        LIMIT 10
    EOT;
    $posts = $wpdb->get_results($wpdb->prepare($query, null));
    foreach($posts as $post):
    the_title();
    endforeach;
    

    これで「最新の記事のみ」という条件は果たすことが出来たのですが、デフォルトの投稿も1件しか読み込めません。
    SQL文に触れたことが無かったので以下のような書き方が出来ないか試してみたのですが、うまく取得できませんでした。
    基礎的な文法が理解できていないのでかなり頓珍漢な書き方をしてしまっているようにも思います。

    $query = <<<EOT
    SELECT * FROM
        (
            SELECT post_type, max(post_date) AS tmp
                FROM {$wpdb->posts}
                WHERE post_status = 'publish'
                AND post_type IN ('post1','post2')
                GROUP BY post_type
                ORDER BY post_date DESC
        ) AS c_post
    SELECT * FROM
        (
            SELECT post_type, post_date
                FROM {$wpdb->posts}
                WHERE post_status = 'publish'
                AND post_type IN ('post')
                ORDER BY post_date DESC
        ) AS post
        INNER JOIN {$wpdb->posts} AS ij ON ij.post_type = c_post.post_type
        AND ij.post_date = c_post.tmp
        INNER JOIN {$wpdb->posts} AS ij ON ij.post_type = post.post_type
        AND ij.post_date = post.post_date
        FULL JOIN c_post ON post.post_type = c_post.post_type
        AND post.tmp = c_post.post_date
        LIMIT 10
    EOT;
    $posts = $wpdb->get_results($wpdb->prepare($query, null));
    foreach($posts as $post):
    the_title();
    endforeach;
    

    他の方法でも結構です。どうかお力添えいただけましたら幸いです。
    よろしくお願いいたします。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • こんにちは

    UNION 構文を使うといいかと思います。
    https://dev.mysql.com/doc/refman/5.6/ja/union.html

    例:

    SELECT * FROM {$wpdb->posts} WHERE post_status='publish' AND post_type='post'
    UNION 
    (SELECT * FROM {$wpdb->posts} WHERE post_status='publish' AND post_type='カスタム投稿タイプ' ORDER BY post_date DESC LIMIT 1)
    ORDER BY post_date DESC
    LIMIT 10
    トピック投稿者 qnqn

    (@qnqn)

    >ishitakaさま

    お返事遅くなってしまってすみませんでした。
    アドバイスいただきました通りにUNON構文に変更したところ、希望通りの動作を実現できました。
    的確なアドバイスをありがとうございました。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「カスタム投稿の最新記事を投稿一覧に」には新たに返信することはできません。