WordPressテンプレートローダーには、多くの状況で、そのコンテキストのクエリが投稿を返さない場合でも、適切なコンテキストテンプレートファイルが含まれます。例えば:
- メインのブログ投稿インデックス
- カテゴリアーカイブインデックス(カテゴリは存在しますが、投稿はありません)
- タグアーカイブインデックス(タグは存在しますが、投稿はありません)
- 著者アーカイブインデックス(著者は存在しますが、投稿はありません)
- 検索結果インデックス
したがって、これらの場合、適切なテンプレートファイルが読み込まれますが、クエリは投稿を返さないため、投稿は出力されません。
概念実証の例:
そのため、これらのコンテキストでは、テンプレートファイルにif ( have_posts() )
条件を含めると便利です。
他のコンテキストでは、クエリが投稿を返さない場合、テンプレートファイルはロードされません。例えば:
これらのコンテキストでif ( have_posts() )
は、おそらく不要です。
編集
クエリはthe_post()によって呼び出されることを理解していますか?また、while(have_posts())が存在する場合、投稿がないとクエリは発生しません。
何が起こっているのかを理解するには、WordPressアクションの順序を確認する必要があります。開始wp_loaded
(および明確にするために一部を省略):
wp_loaded
parse_request
send_headers
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
wp_footer
それで、何が起こって、どのような順序で?
- クエリが呼び出されます:
parse_query
pre_get_posts
wp
- テンプレートが選択されます:
- テンプレートがロード/出力されます。次のアクションがテンプレートによって起動されます:
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
したがって、the_post
によって起動されるのthe_post()
は、クエリが解析され、投稿がフェッチされ、テンプレートがロードされた後、長時間かかります。
私が知らなかった多くの情報を提供してくれたことに感謝していますが、これは私が尋ねたものではありません。
ああ、でもそれはまさにあなたが尋ねたものだと思う。
本当の問題は、有効なクエリリターンとは何ですか?カテゴリアーカイブインデックスなどのコンテキストでは、クエリが有効で、クエリされたカテゴリIDが存在する場合、そのカテゴリに割り当てられた投稿がない場合でもカテゴリテンプレートがロードされます。
どうして?解析されるクエリは(IIRC)&cat={ID}
であるためです。これは、そのカテゴリに割り当てられた投稿がない場合でも有効なクエリであり、解析時に404になりません。
その場合、有効なクエリとテンプレートファイルが読み込まれますが、投稿はありません。このように、if ( have_posts() )
、実際には、ある関連します。繰り返しますが、ここに例があります:カテゴリは存在しますが、投稿は割り当てられていません。カテゴリテンプレートファイルが読み込まれ、がif ( have_posts() )
返されfalse
ます。
これは、単一のブログ投稿や静的ページなどの投稿変数(&p={ID}
)を含むクエリには当てはまりません。これは、投稿が実際には存在せず、解析時にクエリが有効なオブジェクトを返さないためです。
編集2
カテゴリテンプレートにif(have_posts())がなく、カテゴリに投稿がない場合、私が正しく理解している場合、投稿なしでcategory-sample.phpを返す必要がありますが、404.phpを返します。そうですか?
いいえ。覚えておいてください。テンプレートはで選択されていtemplate_redirect
ます。クエリが有効であれば、適切なテンプレートファイルがロードされます。クエリが無効な場合、404テンプレートがロードされます。
そのため、テンプレート(カテゴリテンプレートなど)が読み込まれると、ループが出力されると、テンプレートは変更されません。
アクションの順序をもう一度見てください。
parse_query
pre_get_posts
wp
template_redirect
- テンプレートが選択され、ここにロードされます。これは、戻り値のないテンプレートポイントです。この時点以降、テンプレートは変更できません。
- ...
the_post
- ループ呼び出しの一部として、postdataがここでセットアップされます。これが呼び出され、テンプレート内、およびテンプレートは変更されませんクエリオブジェクトで利用可能なデータに基づいて、
最終編集
そして、投稿の存在を確認しながら、同じテストを2回実行する必要があると主張しています。それは最初の点から私がそれについてだけ尋ねてきた私の質問です。
ことで、私は最終的に理解:すべてに沿って、あなたの質問は、とは何の関係もなかったワードプレス、またはWordPressのループを。同じ条件をチェックwhile
するif
条件内に任意のPHP ループをラップすることを求めています。
この質問はWPSEの範囲外ですが、簡単に説明します。
if
条件は、バイナリの評価である:それはどちらかだtrue
かfalse
、そして何が起こるの内部、条件のが実行された後。
while
条件付きではあるループ:それはカウンターのいくつかの並べ替えに基づいて、いくつかの離散的な期間のための真のまま。そして、その条件の内部で何が起こるかは、数回実行されます - カウンターの各反復に対して1回です。
そのため、物のリストにデータが入力されている場合、物の順序付けられていないリストを出力するとします。while
ループを使用し、if
ラッパーを省略すると、マークアップは次のようになります。
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
そして、もしlist_of_things()
空だった、レンダリングされた出力は次のようになります。
<ul>
</ul>
不要な(そして無効な)マークアップが残ります。
ただし、if
条件付きラッパーを追加すると、次のことができます。
<?php if ( list_of_things() ) : ?>
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
場合やlist_of_things()
空だった、全くのマークアップは出力されないだろう。
それはほんの一例です。そのif
条件付きラッパーには多くの用途があり、if
条件付きラッパーはループとはまったく異なる目的を果たしwhile
ます。