Help us understand the problem. What is going on with this article?

Wordpressのpage.php で if ( have_posts() ) した後に while ( have_posts() ) する理由

More than 5 years have passed since last update.

Wordpressの記事表示部分が非常に気持ち悪かったので聞いたり調べたりしてみました。

      <?php 
      if (have_posts()) :
             while (have_posts()) :
                       the_post();
      ?>
      <h1 class="page_ttl"><?php the_title(); ?></h1>
      <?php the_content(); ?>
      <?php 
      endwhile;
      endif;
      ?>

気になった点は while(have_posts()) がそもそも真偽値チェックをしてるのに何で if(have_posts()) が必要なのかという点です。「二度手間じゃねえか。」と思うわけです。

実際に調べてみたところこの書き方なら if 部分は要りません。下記のように if ~ else ~ endif を使う場合にのみ必要なようです。

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>

ただこれだと無駄なネストがあるので

<?php if ( !have_posts()) : ?>
<p>Postが一つもないですよ〜。エラーですよ〜。</p>
<?php endif; ?>

<?php while ( have_posts()) : the_post(); ?>
ここ本文を書きましょう。
<?php endwhile; ?>

の方が絶対に良いと思うんです。ネストも減るし何をしてるかわかりやすいですから。
何でこうなってないんでしょう?

ちなみに「404.php があれば elseはいらないよ、大体の場合は。」なアドバイスももらったんですが正直良くわかっていません。

あと Wordpress Codex の The Loop の項目では if 文付きの方法が紹介されていましたが、
http://codex.wordpress.org/The_Loop

デフォルトテーマのTwentyTwelveとTwentyThirteenでは while 文だけが使われていてif文はないようでした。
…と思ったらpage.phpにはないけど、他のファイルにはif文もあるようです。

./archive.php:      <?php if ( have_posts() ) : ?>
./archive.php:          <?php while ( have_posts() ) : the_post(); ?>
./author.php:       <?php if ( have_posts() ) : ?>
./author.php:           <?php while ( have_posts() ) : the_post(); ?>
./category.php:     <?php if ( have_posts() ) : ?>
./category.php:         <?php while ( have_posts() ) : the_post(); ?>
./index.php:        <?php if ( have_posts() ) : ?>
./index.php:            <?php while ( have_posts() ) : the_post(); ?>
./page.php:         <?php while ( have_posts() ) : the_post(); ?>
./search.php:       <?php if ( have_posts() ) : ?>
./search.php:           <?php while ( have_posts() ) : the_post(); ?>
./single.php:           <?php while ( have_posts() ) : the_post(); ?>
./tag.php:      <?php if ( have_posts() ) : ?>
./tag.php:          <?php while ( have_posts() ) : the_post(); ?>
./taxonomy-post_format.php:     <?php if ( have_posts() ) : ?>
./taxonomy-post_format.php:         <?php while ( have_posts() ) : the_post(); ?>

以上のファイルの該当部分をすべて確認した結果
if 文と while 文の間に header を入れるか、 else 文を使用していました。やはり不必要なようですね。
header 入れるにしても無駄にネストを増やすのは非常に気持ち悪いです。始めたばっかりですが早速Wordpressが嫌いになりそうで困りました。

stackexchange での熟練者な方の話と食い違いますが、いくら考えても自分のほうが正しいと思うので俺が何かを言えるぐらいの経験を積んでからもう一度読んでみることにします。

自分なりの結論

else 使うなら先にエラー処理をする
header を付けたい時も先に処理をする。
WordpressのCodexのプログラミングの作法が気に食わない。
Twentythirtyとかのデフォルトのテンプレートの記述の作法も気に食わない。
でもやっぱりそれでもWordpressはめちゃくちゃ便利なので女騎士&オーク的なノリで使うことにする。

参考

loop - Why should I put if(have_posts())? while(have_posts()) is not enough? - WordPress Answers
http://wordpress.stackexchange.com/questions/117219/why-should-i-put-ifhave-posts-whilehave-posts-is-not-enough

ironsand
思いついたアイデアをすぐに形にできる能力を身につけたいのでRailsを頑張って習得中。仕事ください。
http://programming.ironsand.net/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away