Pemuat template WordPress akan menyertakan file templat kontekstual yang sesuai dalam banyak keadaan, bahkan jika kueri untuk konteks itu tidak mengembalikan tulisan. Sebagai contoh:
- Indeks Posting Blog Utama
- Indeks Arsip Kategori (Kategori ada, tetapi tidak memiliki pos)
- Indeks Arsip Tag (Tag ada, tetapi tidak memiliki posting)
- Indeks Arsip Penulis (Penulis ada, tetapi tidak memiliki posting)
- Indeks Hasil Pencarian
Dengan demikian, dalam kasus ini, file template yang sesuai akan dimuat, tetapi tidak ada posting yang akan dihasilkan, karena permintaan tidak mengembalikan posting.
Contoh bukti konsep:
Jadi, dalam konteks ini, berguna untuk file templat untuk memasukkan if ( have_posts() )
kondisi.
Dalam konteks lain, file template tidak akan pernah dimuat jika permintaan tidak mengembalikan tulisan. Sebagai contoh:
- Posting blog tunggal
- Halaman statis
Dalam konteks ini, if ( have_posts() )
mungkin tidak perlu.
Edit
Saya mengerti permintaan dipanggil oleh the_post (), kan? Dan jika sementara (have_posts ()) ada, permintaan tidak pernah terjadi jika tidak ada posting.
Untuk memahami apa yang terjadi, Anda harus melihat urutan tindakan WordPress . Dimulai dengan wp_loaded
(dan menghilangkan beberapa untuk kejelasan):
wp_loaded
parse_request
send_headers
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
wp_footer
Jadi, apa yang terjadi, dan dalam urutan apa?
- Permintaan dipanggil:
parse_query
pre_get_posts
wp
- Templat dipilih:
- Template dimuat / keluaran. Tindakan berikut dipecat oleh templat :
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
Jadi,, the_post
dipecat oleh the_post()
, terjadi lama setelah kueri diuraikan, posting diambil, dan templat dimuat.
Saya sangat berterima kasih karena Anda memberikan banyak informasi yang saya tidak tahu, tapi ini bukan yang saya minta.
Oh, tapi saya yakin itu persis seperti yang Anda minta.
Pertanyaan sebenarnya adalah: apa itu pengembalian permintaan yang valid ? Untuk konteks seperti indeks arsip kategori, kueri itu valid, dan templat kategori dimuat, jika ID kategori yang ditanyakan ada, bahkan jika tidak ada tulisan yang ditugaskan untuk kategori itu .
Mengapa? Karena kueri yang diuraikan adalah (IIRC) &cat={ID}
- yang merupakan permintaan yang valid bahkan jika tidak ada posting yang ditugaskan untuk kategori itu , dan dengan demikian tidak menghasilkan 404 pada penguraian.
Dalam hal itu, Anda mendapatkan kueri yang valid, dan file template dimuat, tetapi tidak ada posting . Dengan demikian, if ( have_posts() )
, , pada kenyataannya relevan. Sekali lagi, ini adalah contohnya: kategori ada, tetapi tidak memiliki posting yang ditetapkan. File templat kategori dimuat, dengan if ( have_posts() )
pengembalianfalse
.
Ini tidak akan berlaku untuk kueri yang menyertakan variabel posting ( &p={ID}
) seperti posting blog tunggal dan halaman statis, karena posting tersebut tidak benar-benar ada, dan ketika diuraikan, kueri tidak akan mengembalikan objek yang valid.
Edit 2
Jika saya benar memahami jika tidak ada if (have_posts ()) dalam templat kategori dan kategorinya tidak memiliki kiriman, maka ia mengembalikan 404.php, meskipun itu seharusnya mengembalikan kategori-sample.php tanpa kiriman. Apakah itu benar?
Ingat: templat dipilih di template_redirect
. Jadi jika kueri jika valid, maka file templat yang sesuai dimuat. Jika kueri tidak valid, maka templat 404 dimuat.
Jadi, begitu template dimuat - misalnya templat kategori - setelah loop di-output, template tidak berubah .
Lihat kembali urutan tindakan:
parse_query
pre_get_posts
wp
template_redirect
- Templat dipilih dan dimuat di sini. Ini adalah titik templat tidak dapat kembali . Templat tidak dapat berubah setelah titik ini.
- ...
the_post
- postdata diatur di sini, sebagai bagian dari panggilan putaran. Ini disebut di dalam templat , dan templat tidak berubah berdasarkan data yang tersedia di objek kueri
Edit Terakhir
Dan saya mengklaim bahwa ketika memeriksa keberadaan posting, mengapa saya harus menjalankan tes yang sama dua kali. Itulah pertanyaan saya dari poin pertama yang saya tanyakan hanya tentang itu.
Dan dengan itu, saya akhirnya mengerti: selama ini, pertanyaan Anda tidak ada hubungannya dengan WordPress , atau WordPress Loop . Anda bertanya tentang membungkus while
loop PHP sewenang-wenang di dalam if
kondisi yang memeriksa kondisi yang sama.
Pertanyaan itu di luar lingkup WPSE, tapi saya akan jelaskan secara singkat:
Suatu if
kondisi adalah evaluasi biner: itu adalah salah satu true
atau false
, dan apa yang terjadi di dalam kondisi itu dieksekusi sekali .
Sebuah while
kondisional adalah sebuah loop : ia tetap benar untuk beberapa periode diskrit, berdasarkan pada semacam counter; dan apa yang terjadi di dalam kondisi itu dieksekusi beberapa kali - satu kali untuk setiap iterasi dari counter.
Jadi, katakanlah Anda ingin menampilkan daftar hal-hal yang tidak terurut, jika daftar hal-hal tersebut terisi. Jika Anda menggunakan while
loop, dan menghilangkan if
pembungkus, markup Anda akan terlihat seperti ini:
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
Dan jika list_of_things()
kosong, output yang diberikan adalah:
<ul>
</ul>
Yang meninggalkan markup yang tidak perlu (dan tidak valid).
Tetapi jika Anda menambahkan if
pembungkus bersyarat, Anda bisa melakukan ini:
<?php if ( list_of_things() ) : ?>
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
Dan jika list_of_things()
kosong, tidak ada markup sama sekali akan menjadi output.
Itu hanya satu contoh. Ada banyak kegunaan untuk if
pembungkus bersyarat itu, dan if
pembungkus bersyarat melayani tujuan yang sama sekali berbeda dari while
loop.