南国スキーぶろぐ・Z

岩手県盛岡市のランチ情報・お出かけ情報をメインとしたブログです。

岩手県と盛岡市のブログです

【WordPress】先頭固定の記事があっても通常記事の表示件数が変わらずメインループに影響を与えないサブループ

にほんブログ村 地域生活(街) 東北ブログ 岩手県情報へ にほんブログ村 地域生活(街) 東北ブログ 盛岡市情報へ

wordpress

地味に上手くいかなくてChatGPTに聞きまくった。
やりたかった内容は、

  • page.phpに記述するサブループ。
  • 固定ページのコンテンツを表示させるメインループに影響を与えない。
  • 希望の表示件数に先頭固定記事がプラスにならない(表示件数4件で先頭固定が2件なら6件表示にならず、あくまでも合計で4件になるようにする)。
  • 先頭固定記事が無い場合は通常記事が希望の表示件数4件で表示される。

いろいろ試したけど、上記条件のいずれかが上手くいかなくて結構困った。
困ったとか言いつつも、自力じゃなくチャッピーことChatGPTが上手いこと正解コードを出してくれたから超絶助かっし、疑問点も分かりやすく解説してくれた。
まぁ、仕組み自体はいたってシンプルっちゃシンプル(ゼロから掛けるかは別の話)。

AIを活用しよう。

<?php
// sticky投稿IDを取得
$sticky_ids = get_option('sticky_posts');
// stickyが1件以上ある時
if (!empty($sticky_ids)) {
    // stickyクエリ
    $sticky_args = array(
        'post_type'      => 'post',
        'category_name'  => 'カテゴリスラッグ(必要であれば)',
        'post__in'       => $sticky_ids,
        'posts_per_page' => -1,
        'orderby'        => 'date',
        'order'          => 'DESC',
    );
    $sticky_query = new WP_Query($sticky_args);
    // sticky件数を取得
    $sticky_count = $sticky_query->found_posts;
} else {
    // stickyが0件の時は0じゃなく「空」になっちゃうから「0」を入れる
    $sticky_count = 0;
}
// 通常記事の残り枠(4件表示から固定表示を引く)
$remaining = max(0, 4 - $sticky_count);
// 通常投稿クエリ
$normal_args = array(
    'post_type'      => 'post',
    'category_name'  => 'カテゴリスラッグ',
    'posts_per_page' => $remaining,
    'orderby'        => 'date',
    'order'          => 'DESC',
);
// 上記配列に一緒に書けないから分けて先頭固定を除外設定
if (!empty($sticky_ids)) {
    $normal_args['post__not_in'] = $sticky_ids;
}
$normal_query = new WP_Query($normal_args);
// stickyループ
if (!empty($sticky_ids) && $sticky_query->have_posts()): while ($sticky_query->have_posts()): $sticky_query->the_post();
?>
          

  <p>ループの中身</p>


<?php // 通常投稿のループ(通常ループに影響なし)
endwhile; endif; wp_reset_postdata();
  if ($normal_query->have_posts()): while ($normal_query->have_posts()) : $normal_query->the_post(); ?>
           

  <p>ループの中身</p>


<?php endwhile; else: ?>
  <p>記事無いよ。</p>
<?php endif; wp_reset_postdata(); ?>

簡単に言うと、先頭固定ループと通常ループを分けて記述。
先頭固定の記事数を取得して、通常ループの表示件数からマイナスする。
書いてないけど、この後のメインループに影響を与えないようにしっかり「wp_reset_postdata」でリセットする。
って感じ。

最初に出来たコードでは「foreach ($posts as $post): setup_postdata($post);」でループしてたんだけど、グローバス変数の「$post」が上書きされちゃってリセットしてもリセットできなかったとの事(知らんけど)。

投稿記事の先頭固定って便利な機能だけど、しっかりループ組まないと表示件数にプラスされてデザイン崩れちゃったり、思い通りの結果が出なかったりと以外に難しい。

タイル表示じゃなくリスト表示にするとか、先頭固定記事が増えてもデザインに影響を与えないようなデザイン案を作るのが手っ取り早いとか思ったw