LoginSignup
16
17

More than 5 years have passed since last update.

ワードプレスのwhile(have_posts())について色々。forー>初心者

Last updated at Posted at 2014-08-06

備忘録 兼 知らない人用。
ちょっとドツボにはまったので。

その1:各種記事ページでループしたい。

どゆこと?

各記事ページで

if (have_posts()) :    
    while (have_posts()) : the_post();
        //ループさせたい処理
    endwhile;
else:
    //記事がない場合の処理
endif;

なんてループ処理を使おうとすると残念ながら一度しか回りません。

各種記事ページでループした際に取得できるのは記事ページで見ている記事のものだけのようですね。

それでも俺は、ループしたい。

そんな人のためにWP_Query()とquery_posts()いう物とがあります。
後者は現在推奨されていない記述のようですが、一応書いておきます。

これらを使うことでカテゴリー別とか、タグ別とかに記事を取得するのにループの前に記述したりするものです。勿論全ての記事を取ってくることも出来るんですね。助かる!

※解決方法1

$args = array(
    'posts_per_page' => -1//すべての記事を取得することにする
);
$the_query = new WP_Query( $args ); 
    if ( $the_query->have_posts() ) :
        while ( $the_query->have_posts() ) : $the_query->the_post();
    //ループさせたい処理
    endwhile;
else:
    //記事がない場合の処理
endif;

※推奨されない解決方法2

query_posts('posts_per_page=-1');//全部の記事を取得することにする。
if (have_posts()) :    
    while (have_posts()) : the_post();
        //ループさせたい処理
    endwhile;
else:
    //記事がない場合の処理
endif;
wp_reset_query();//全ての記事を取得していたことをリセット

その2:ループ中にブレイクして二度目のループもブレイク

おまえは何を言っているんだ。

人によってはオリジナルでウィジェットのような動きをするテーマをコーディングする人も、きっといますよね。

そんな時に、記事を10だけ表示して終わりにしたい考えていた無知な私は

if (have_posts()) : 
    $i = 1;
    while (have_posts()) : the_post();
        //ループさせたい処理
        if($i==10)break;
        $i++;
    endwhile;
else:
    //記事がない場合の処理
endif;

という感じに記述した後に、同じ処理でループ処理の内容を変えてもう一度ループ仕様としたのですが、条件に合致しているはずの一度目のループで抽出した記事が二度目のループで取り出せない!!

そんな罠にハマりました。(仕掛けたのは自分ですが)

解決方法

きちんとループを最後まで回しましょう。そうするとhave_posts()さんはしっかり最初からループを回してくれるようになります。

if (have_posts()) : 
    $i = 1;
    while (have_posts()) : the_post();
        if($i <=10 && 条件2){
            //ループさせたい処理
            $i++;
        }
    endwhile;
else:
    //記事がない場合の処理
endif;

個人的には該当する記事を10見つけたら終わりにするっていう記述をしたかったのでこんな感じになりました。

参考になれば幸いですm(_ _)m

16
17
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
17