Saya punya pertanyaan tentang "loop".
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
Kode diambil dari halaman The Loop WordPress Codex .
Mengapa saya harus ikut if
serta? Sepertinya jika ada while
loop, berfungsi dengan baik.
Dalam kasus apa masalah terjadi jika tidak ada if
pernyataan?
Edit
Saya menerima jawaban @ Chip. tapi jujur mengatakan aku hanya butuh bagian terakhir.
Saya tahu sekarang apa yang ingin saya ketahui dari pertanyaan saya.
if
pernyataan hanya bila diperlukan, jika Anda ingin meletakkan header atau footer yang harus ditulis hanya sekali. jika Anda tidak menggunakan "bungkus", makaif
pernyataan itu tidak perlu.
Jawaban:
Pemuat template WordPress akan menyertakan file templat kontekstual yang sesuai dalam banyak keadaan, bahkan jika kueri untuk konteks itu tidak mengembalikan tulisan. Sebagai contoh:
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:
Dalam konteks ini,
if ( have_posts() )
mungkin tidak perlu.Edit
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?
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
Jadi,,
the_post
dipecat olehthe_post()
, terjadi lama setelah kueri diuraikan, posting diambil, dan templat dimuat.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, denganif ( 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
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 kueriEdit Terakhir
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 dalamif
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 satutrue
ataufalse
, 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 menghilangkanif
pembungkus, markup Anda akan terlihat seperti ini:Dan jika
list_of_things()
kosong, output yang diberikan adalah:Yang meninggalkan markup yang tidak perlu (dan tidak valid).
Tetapi jika Anda menambahkan
if
pembungkus bersyarat, Anda bisa melakukan ini: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, danif
pembungkus bersyarat melayani tujuan yang sama sekali berbeda dariwhile
loop.sumber
the_post();
karena jugawhile
tidak perlu. +1 untuk kelengkapan informasi.if( have_posts() )
pernyataan itu masuk akal (itulah yang saya coba cari tahu), tetapi jangan hanya gunakanthe_post()
di halaman tunggal!if( have_post() )
kondisi sebelum loop penuh dalam kontekssingle-*.php
danpage-*.php
templat file?Sangat tidak mungkin untuk memperbaiki jawaban Chip, tetapi hanya untuk memotong untuk mengejar:
Gunakan
if
bagian ini jika Anda ingin menampilkan sesuatu yang berbeda saat tidak ada pos . Ini sangat berguna, misalnya, pada halaman arsip tanggal atau kategori. Jika seseorang menavigasi ke halaman yang tidak memiliki posting, senang memiliki pesan yang mengatakannya, daripada hanya tidak muncul sama sekali, karena loop tidak pernah dieksekusi.sumber
Mungkin ada beberapa pertimbangan yang tidak dimasukkan dalam jawaban sejauh ini. Tidak disarankan untuk menghilangkan pernyataan if.
Pernyataan if biasanya digunakan untuk:
no posts found
menunjukkan bahwa kategori tersebut tidak memiliki artikel yang ditugaskan untuk itu.Bagaimana jika sebuah kait baru ditambahkan?
Kemungkinan masalah lain dari tidak menggunakan pernyataan if adalah bahwa jika tim wordpress pernah memutuskan untuk menambahkan hook baru yang memicu pada
$wp_query->have_posts()
panggilan pertama , itu akan memicu pada waktu yang salah. Dan jika itu menyebabkan perilaku tak terduga, itu akan menjadi kesalahan Anda karena tidak mengikuti spesifikasi dengan benar.Pengembang lainnya berharap untuk melihat struktur spesifik untuk loop wordpress
Saya kira pengembang lain berharap untuk melihat seluruh loop wordpress. Jadi mungkin itu ide yang buruk untuk meminta mereka mencari pernyataan if yang tidak ada.
sumber
Saya melihat ini sebagai pertanyaan mendasar dari teori struktur kontrol. Blok terlampir dalam loop sementara tidak mengeksekusi bahkan sekali jika kondisi (have_posts ()) mengevaluasi sebagai false pertama kali.
Jadi, tujuan dari
if ( have_posts() )
loop WordPress hanya untuk mengeksekusi fungsi have_posts () satu kali sebelum kondisi sementara dievaluasi. Jikahave_posts()
tidak memiliki efek samping, makaif ( have_posts() )
sama sekali tidak ada gunanya. Jikahave_posts()
memang memiliki efek samping, Anda dapat menyederhanakan sebagai berikut:sumber
if
sana karenaelse
setelahnya. Tidak ada alasan lain. Jika tidak ada posting, maka menampilkan pesan "no posts" yang bagus lebih baik daripada tidak menampilkan apa pun.