WordPress şablon yükleyicisi, çoğu durumda uygun bağlam şablonu şablonunu içerecektir, bu bağlam için sorgu gönderilmese bile. Örneğin:
- Ana Blog Yazıları Dizini
- Kategori Arşiv Dizini (Kategori var, ancak gönderi yok)
- Etiket Arşivi Dizini (Etiket var, ancak mesajı yok)
- Yazar Arşivi İndeksi (Yazar var ancak yayın yok)
- Arama Sonuçları Dizini
Bu nedenle, bu durumlarda, uygun şablon dosyası yüklenecek, ancak sorgu gönderilemediğinden gönderiler gönderilmez.
Kavram kanıtı örnekleri:
Bu nedenle, bu bağlamlarda, şablon dosyasının if ( have_posts() )
koşullu içermesi yararlıdır .
Diğer bağlamlarda, sorgu gönderilmezse şablon dosya asla yüklenmez. Örneğin:
- Tek blog yazısı
- Statik sayfa
Bu bağlamlarda, if ( have_posts() )
muhtemelen gereksizdir.
Düzenle
Sorgunun the_post () tarafından çağrıldığını anlıyorum, değil mi? Ve eğer (have_posts ()) varsa, yazı yoksa sorgu asla gerçekleşmez.
Neler olduğunu anlamak için, WordPress işlemlerinin sırasına bakmak zorundasınız . wp_loaded
İle başlayan (ve bazı netlik için ihmal):
wp_loaded
parse_request
send_headers
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
wp_footer
Peki neler oluyor ve hangi sırada?
- Sorgu başlatıldı:
parse_query
pre_get_posts
wp
- Şablon seçildi:
- Şablon yüklenir / çıkar. Aşağıdaki işlemler şablon tarafından gerçekleştirilir :
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
Yani, the_post
tarafından ateş the_post()
olur, uzun süre sonra sorgu mesajlar getirilen, ayrıştırılır ve şablon yüklenir.
Bilmediğim çok fazla bilgi verdiğiniz için minnettarım, ama istediğim bu değildi.
Oh, ama tam olarak istediğinin bu olduğuna inanıyorum .
Asıl soru şudur: geçerli bir sorgu dönüşü nedir? Kategori arşiv dizini gibi bağlamlar için, sorgu geçerli ve sorgulanan kategori kimliği varsa, bu kategoriye atanmış bir yazı olmasa bile kategori şablonu yüklenir .
Niye ya? Çünkü ayrıştırılmakta olan sorgu (IIRC) &cat={ID}
- bu kategoriye atanmış mesaj olmasa bile geçerli bir sorundur ve bu nedenle ayrıştırma sırasında 404 ile sonuçlanmaz.
Bu durumda geçerli bir sorgu alırsınız ve bir şablon dosyası yüklenir, ancak yazı gönderilmez . Böylece if ( have_posts() )
, aslında, alakalı. Yine, işte bir örnek: kategori var, ancak atanmış yazı yok. Kategori şablon dosyası ile yüklenen if ( have_posts() )
dönenfalse
.
Bu, tek blog gönderileri ve statik sayfalar gibi bir gönderi değişkeni ( &p={ID}
) içeren sorgular için geçerli olmaz , çünkü gönderi gerçekten varolmaz ve ayrıştırıldığında, sorgu geçerli bir nesne döndürmez.
Düzenle 2
Eğer bir kategori şablonunda if (have_posts ()) olup olmadığını ve kategorinin postası olmadığını doğru anlarsam, 404.php döndürür, post-example.php gönderilmeden dönmesi gerekse bile. Bu doğru mu?
Hayır. Unutmayın: şablon olarak seçilir template_redirect
. Eğer sorgu geçerliyse, uygun şablon dosyası yüklenir. Sorgu geçerli değilse, 404 şablonu yüklenir.
Bu nedenle, bir şablon yüklendiğinde - örneğin kategori şablonu - döngü çıktığında, şablon değişmez .
İşlem sırasına tekrar bakın:
parse_query
pre_get_posts
wp
template_redirect
- burada şablon seçilir ve yüklenir. Bu, geri dönüşü olmayan şablon noktasıdır . Bu noktadan sonra şablon değişemez.
- ...
the_post
- Postdata burada döngü çağrısının bir parçası olarak kurulur. Buna şablonun içinde denir ve şablon , sorgu nesnesindeki kullanılabilir verilere göre değişmez
Son Düzenleme
Ve ben yazıların varlığını kontrol ederken, neden aynı testi iki kez yapmam gerektiğini iddia ediyorum. Bu sadece benim sorduğum ilk noktadan itibaren sorum.
Ve bununla nihayet anladım: başından beri, sorunuzun WordPress veya WordPress Loop ile ilgisi yoktu . İstediğiniz herhangi bir PHP while
döngüsünü if
aynı koşulu kontrol eden bir koşul içinde sarmayı istiyorsunuz .
Bu soru WPSE'nin kapsamı dışında, ancak kısaca açıklayacağım:
Bir if
koşullu ikili değerlendirmedir: ya ya true
da false
, ve bu şartın içinde ne olduğu bir kez yapılır .
Bir while
koşullu a, döngü : tezgahın bir çeşit göre, bazı kesikli bir süre boyunca doğru kalır; ve bu şartın içinde ne olduğu birkaç kez yapılır - sayacın her tekrarı için bir kez .
Öyleyse, eğer bir şeyler listesi doldurulursa, sıralanmamış bir şeyler listesi almak istediğinizi varsayalım. Bir while
döngü kullanır ve if
sarmalayıcıyı atlarsanız, işaretlemeniz şöyle görünür:
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
Ve list_of_things()
boş olsaydı , oluşturulan çıktı şöyle olurdu:
<ul>
</ul>
Gereksiz (ve geçersiz) işaretler.
Ancak if
koşullu bir sarmalayıcı eklerseniz , bunu yapabilirsiniz:
<?php if ( list_of_things() ) : ?>
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
Ve eğer list_of_things()
boş olsaydı , hiçbir işaretleme yapılmazdı.
Bu sadece bir örnek. Bu if
koşullu sarıcı için birçok kullanım alanı vardır ve if
koşullu sargı , döngüden tamamen farklı bir amaca hizmet eder while
.