ブロガーのゆうです。
現在、ブログを2つ立ち上げて運営しています。
会社員として働きながら、webデザインを0から勉強しました。
ブログはwordpressを使い、オリジナルテーマ(自分デザイン)を読み込ませています。
その中で、自分がぶつかった壁と解決法、体験談などを発信しています。
この記事の内容を先に言うと、
「posts_per_pageがサブ、メインループ両方に反映される」です。
ピンポイントな問題なので需要は少ないかもですが、一人でもお役に立てればと(^^)/
問題
「最近の記事欄」を作成したかったのですが、
こんな感じです。
posts_per_pageで指定した記事の数が、have_posts()にも適用されてしまって🙄
一週間以上ハマってました。(下記、写真)
サブループ(最近の記事欄)とメインループ(メイン記事)が同じ4件の投稿を読み込んでいます。
本当は、最近の記事(上側)を4件、メインのブログ記事(下側)は9件表示するはずでした。
下記のイメージです。
posts_per_pageとは
posts_per_pageは1ページに表示する記事の最大数を設定できます。
以下のコードをみてみましょう。
—————————–
—————————-
数字の部分を4⇒8に変更すると8件の記事が表示されます。
その下側は、$postsという変数 にget_posts( $arg );を格納。
foreach ( $posts as $post ) で $postsに格納された中の一件の記事を$postに渡します。
setup_postdata( $post );でwordpressさんに反映。
<?php endforeach; ?>でforeach ( $posts as $post )がなくなるまで繰り返し処理するコードになっています。
問題の解決
なかなか解決できそうな記事がなく困り果ててたところ
こちらのサイトを参考に解決⇒こちら
グローバル変数$postsの上書きはwp_reset_postdata()でリセットされない
僕がハマった具体的な部分を説明します。
みなさまの問題の解決になれば幸いです。
get_postsのposts_per_pageで4件の記事の表示数を指示。
最後のループ終わりに
<?php endforeach; ?>
<?php wp_reset_postdata(); wp_reset_query(); ?>
を記述して、posts_per_pageの内容をリセットした気でいました。
というか、コピペなので何をリセットしているかもわかってませんが(笑)
wp_reset_postdata() 効かない
get_posts メインループ 反映される
とか検索しまくりました。
どこのサイトをみても、上記のリセットで解決、だとか$wp_queryは使うな。
とかしかなかった。
だから、上記のリセットの位置を変えまくったり、
ちょっとコードのニュアンスが違うやつ書いてみたり。
適当にいじりまくったわけです。
で、一瞬で解決したのが下記のコード変更です。
$postsのところを$tostsに変更しました。
変数なので名前は自由です。問題はないでしょう。
下記のように問題なく表示できています。
$postsはグローバル変数でサブ、メインループに共通して使われています。
サブで$postsに上書きした情報をリセットしないとメインにも反映されてしまいます。
僕の場合はwp_reset_postdata()でリセットしていたはずなのですが、解決しませんでした。
根本的な理由はわからないままです。
ですが、正常に動いているのでオッケーです(^^)/
さいごに
ネットで検索してもなかなか解決できなかったので、
同じことで困っているかもと思い、記事にしました。
このブログでは釣りブログをメインにwebデザインの情報も発信しています。
SNSのフォロー等、応援よろしくお願いします。
疑問等があれば気軽にTwitterやInstagramにメッセージをお願いします(^^♪
ブログを独学でデザインから学んでいる方は是非連絡をください。
一緒に問題を解決できるかもしれません。