เทมเพลตโหลดเดอร์เทมเพลต WordPress จะรวมไฟล์เทมเพลตบริบทที่เหมาะสมในหลาย ๆ สถานการณ์แม้ว่าการสืบค้นสำหรับบริบทนั้นจะไม่มีการโพสต์ ตัวอย่างเช่น:
- ดัชนีโพสต์บล็อกหลัก
- ดัชนีที่เก็บหมวดหมู่ (มีอยู่ แต่ไม่มีโพสต์)
- ดัชนีคลังแท็ก (มีแท็กแล้ว แต่ไม่มีโพสต์)
- ดัชนีผู้แต่งถาวร (มีอยู่ แต่ไม่มีโพสต์)
- ดัชนีผลการค้นหา
ดังนั้นในกรณีนี้ไฟล์เทมเพลตที่เหมาะสมจะถูกโหลด แต่จะไม่มีการโพสต์ข้อความใด ๆ
ตัวอย่างการพิสูจน์แนวคิด:
ดังนั้นในบริบทเหล่านี้จะเป็นประโยชน์สำหรับไฟล์เทมเพลตที่จะรวม if ( have_posts() )
เงื่อนไข
ในบริบทอื่นไฟล์เทมเพลตจะไม่สามารถโหลดได้ถ้าแบบสอบถามไม่ส่งคืนโพสต์ ตัวอย่างเช่น:
- โพสต์บล็อกเดียว
- หน้าคงที่
ในบริบทเหล่านี้ if ( have_posts() )
อาจไม่จำเป็น
แก้ไข
ฉันเข้าใจว่าการสืบค้นนั้นเรียกใช้โดย the_post () ใช่ไหม และถ้าในขณะที่ (have_posts ()) อยู่แบบสอบถามจะไม่เกิดขึ้นหากไม่มีโพสต์
จะเข้าใจในสิ่งที่เกิดขึ้นคุณจะต้องดูที่คำสั่งของการกระทำเวิร์ดเพรส เริ่มต้นด้วย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()
เกิดขึ้นนานหลังจากที่แยกวิเคราะห์แบบสอบถามโพสต์จะถูกดึงและแม่แบบถูกโหลด
ฉันขอบคุณมากที่คุณให้ข้อมูลมากมายที่ฉันไม่รู้ แต่นี่ไม่ใช่สิ่งที่ฉันถาม
แต่ฉันเชื่อว่ามันเป็นสิ่งที่แน่นอนสิ่งที่คุณถาม
คำถามจริงคืออะไรแบบสอบถามที่ถูกต้องส่งกลับ ? สำหรับบริบทเช่นดัชนีหมวดหมู่การสืบค้นจะใช้งานได้และมีการโหลดแม่แบบหมวดหมู่หากรหัสหมวดหมู่ที่สอบถามมีอยู่แม้ว่าจะไม่มีการกำหนดโพสต์ในหมวดหมู่นั้นก็ตาม
ทำไม? เนื่องจากเคียวรีที่ถูกวิเคราะห์คำคือ (IIRC) &cat={ID}
- ซึ่งเป็นเคียวรีที่ถูกต้องแม้ว่าจะไม่มีโพสต์ที่กำหนดให้กับหมวดหมู่นั้นและดังนั้นจึงไม่ส่งผลให้ 404 เมื่อแยกวิเคราะห์
ในกรณีที่คุณได้รับการสืบค้นที่ถูกต้องและแม่แบบไฟล์โหลดแต่ไม่มีโพสต์ ดังนั้นif ( have_posts() )
, ในความเป็นจริงที่เกี่ยวข้อง อีกครั้งนี่คือตัวอย่าง: หมวดหมู่มีอยู่ แต่ไม่มีการกำหนดโพสต์ ไฟล์ประเภทแม่แบบจะเต็มไปด้วยการif ( have_posts() )
false
กลับมา
สิ่งนี้จะไม่ถือเป็นจริงสำหรับข้อความค้นหาที่มีตัวแปรโพสต์ ( &p={ID}
) เช่นโพสต์บล็อกเดียวและหน้าคงที่เพราะโพสต์จะไม่มีอยู่จริงและเมื่อแยกวิเคราะห์แล้วแบบสอบถามจะไม่ส่งคืนวัตถุที่ถูกต้อง
แก้ไข 2
ถ้าฉันเข้าใจถูกต้องว่าไม่มี (if_posts ()) ในเทมเพลตหมวดหมู่และหมวดหมู่ไม่มีโพสต์ก็จะส่งคืน 404.php แม้ว่ามันควรจะส่งคืน category-sample.php โดยไม่โพสต์ นั่นถูกต้องใช่ไหม?
เลขที่จำเอาไว้: template_redirect
แม่แบบที่มีการเลือก ดังนั้นถ้าแบบสอบถามถ้าถูกต้องแล้วไฟล์แม่แบบที่เหมาะสมจะถูกโหลด ถ้าแบบสอบถามไม่ถูกต้องจะมีการโหลดแม่แบบ 404
ดังนั้นเมื่อแม่แบบที่มีการโหลด - เช่นหมวดหมู่แม่แบบ - เมื่อห่วงคือการส่งออกแม่แบบไม่เปลี่ยนแปลง
ดูคำสั่งของการกระทำอีกครั้ง:
parse_query
pre_get_posts
wp
template_redirect
- เลือกแม่แบบและโหลดที่นี่ นี้เป็นแม่แบบจุดกลับไม่มี เทมเพลตไม่สามารถเปลี่ยนแปลงได้หลังจากจุดนี้
- ...
the_post
- postdata ตั้งค่าไว้ที่นี่เป็นส่วนหนึ่งของการโทรแบบวนซ้ำ สิ่งนี้เรียกว่าภายในแม่แบบและแม่แบบนั้นจะไม่เปลี่ยนแปลงตามข้อมูลที่มีอยู่ในวัตถุแบบสอบถาม
การแก้ไขครั้งสุดท้าย
และฉันอ้างว่าขณะที่ตรวจสอบการมีอยู่ของโพสต์ทำไมฉันควรรันการทดสอบเดียวกันสองครั้ง นั่นคือคำถามของฉันตั้งแต่แรกฉันได้ถามเกี่ยวกับเรื่องนั้นเท่านั้น
และด้วยที่ในที่สุดผมก็เข้าใจทั้งหมดพร้อมคำถามของคุณมีอะไรจะทำอย่างไรกับWordPressหรือWordPress ห่วง คุณกำลังถามเกี่ยวกับการตัดการwhile
วนลูปPHP ใด ๆภายในif
เงื่อนไขที่ตรวจสอบสภาพเดียวกัน
คำถามนั้นอยู่นอกขอบเขตของ WPSE แต่ฉันจะอธิบายสั้น ๆ :
if
เงื่อนไขคือการประเมินผลไบนารี: มันเป็นอย่างใดอย่างหนึ่งtrue
หรือfalse
และสิ่งที่เกิดขึ้นภายในของเงื่อนไขที่จะถูกดำเนินการครั้งเดียว
while
เงื่อนไขเป็นห่วงมันยังคงเป็นจริงสำหรับระยะเวลาที่ต่อเนื่องบางส่วนขึ้นอยู่กับการจัดเรียงของเคาน์เตอร์บาง และสิ่งที่เกิดขึ้นภายในเงื่อนไขนั้นจะถูกดำเนินการหลายครั้ง - หนึ่งครั้งสำหรับการวนซ้ำแต่ละครั้งของตัวนับ
ดังนั้นสมมติว่าคุณต้องการแสดงรายการสิ่งที่ไม่เรียงลำดับหากรายการสิ่งต่าง ๆ มีประชากรอยู่ หากคุณใช้การwhile
วนซ้ำและไม่ใส่if
เสื้อคลุมมาร์คอัปของคุณจะเป็นดังนี้:
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
และถ้าlist_of_things()
ว่างเปล่าผลลัพธ์ที่แสดงจะเป็น:
<ul>
</ul>
สิ่งใดปล่อยให้มาร์กอัปที่ไม่จำเป็น (และไม่ถูกต้อง)
แต่ถ้าคุณเพิ่มในif
wrapper ที่มีเงื่อนไขคุณสามารถทำได้ดังนี้
<?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
wrapper แบบมีเงื่อนไขนั้นและif
wrapper แบบมีเงื่อนไขนั้นมีจุดประสงค์ที่แตกต่างไปจากwhile
วงอย่างสิ้นเชิง