Trình tải mẫu WordPress sẽ bao gồm tệp mẫu theo ngữ cảnh phù hợp trong nhiều trường hợp, ngay cả khi truy vấn cho ngữ cảnh đó không trả về bài đăng nào. Ví dụ:
- Chỉ mục bài viết trên Blog chính
- Danh mục Lưu trữ Danh mục (Danh mục tồn tại, nhưng không có bài đăng)
- Thẻ lưu trữ chỉ mục (Thẻ tồn tại, nhưng không có bài viết)
- Chỉ mục Lưu trữ Tác giả (Tác giả tồn tại, nhưng không có bài đăng)
- Chỉ số kết quả tìm kiếm
Do đó, trong những trường hợp này, tệp mẫu thích hợp sẽ được tải, nhưng không có bài đăng nào được xuất ra, vì truy vấn không trả về bài viết nào.
Ví dụ bằng chứng về khái niệm:
Vì vậy, trong các bối cảnh này, rất hữu ích cho tệp mẫu để bao gồm các if ( have_posts() )
điều kiện.
Trong các bối cảnh khác, tệp mẫu sẽ không bao giờ được tải nếu truy vấn không trả về bài viết. Ví dụ:
- Bài đăng trên blog
- Trang tĩnh
Trong những bối cảnh này, if ( have_posts() )
có lẽ là không cần thiết.
Chỉnh sửa
Tôi hiểu truy vấn được gọi bởi the_post (), phải không? Và nếu while (have_posts ()) tồn tại, truy vấn sẽ không bao giờ xảy ra nếu không có bài đăng.
Để hiểu những gì đang xảy ra, bạn phải xem thứ tự các hành động của WordPress . Bắt đầu với wp_loaded
(và bỏ qua một số cho rõ ràng):
wp_loaded
parse_request
send_headers
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
wp_footer
Vì vậy, những gì đang xảy ra, và theo thứ tự?
- Truy vấn được gọi:
parse_query
pre_get_posts
wp
- Mẫu được chọn:
- Mẫu được tải / đầu ra. Các hành động sau đây được kích hoạt bởi mẫu :
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
Vì vậy, được the_post
kích hoạt bởi the_post()
, xảy ra rất lâu sau khi truy vấn được phân tích cú pháp, các bài đăng được tìm nạp và mẫu được tải.
Tôi rất biết ơn vì bạn đã cung cấp rất nhiều thông tin mà tôi không biết, nhưng đây không phải là điều tôi đã hỏi.
Ồ, nhưng tôi tin rằng đó là chính xác những gì bạn yêu cầu.
Câu hỏi thực sự là: trả về truy vấn hợp lệ là gì? Đối với các bối cảnh như chỉ mục lưu trữ danh mục, truy vấn hợp lệ và mẫu danh mục được tải, nếu ID danh mục được truy vấn tồn tại, ngay cả khi không có bài đăng nào được gán cho danh mục đó .
Tại sao? Bởi vì truy vấn đang được phân tích cú pháp là (IIRC) &cat={ID}
- đây là một truy vấn hợp lệ ngay cả khi không có bài đăng nào được gán cho danh mục đó và do đó không dẫn đến 404 khi phân tích cú pháp.
Trong trường hợp đó, bạn nhận được một truy vấn hợp lệ và một tệp mẫu được tải, nhưng không có bài đăng . Do đó, if ( have_posts() )
, là, trên thực tế có liên quan. Một lần nữa, đây là một ví dụ: thể loại tồn tại, nhưng không có bài viết nào được chỉ định. Tập tin mẫu danh mục được tải, với if ( have_posts() )
trả lạifalse
.
Điều này sẽ không đúng với các truy vấn bao gồm một biến bài ( &p={ID}
) như các bài đăng trên blog và các trang tĩnh, bởi vì bài đăng sẽ không thực sự tồn tại và khi được phân tích cú pháp, truy vấn sẽ không trả về một đối tượng hợp lệ.
Chỉnh sửa 2
Nếu tôi hiểu đúng nếu không có if (have_posts ()) trong mẫu danh mục và danh mục không có bài đăng, thì nó trả về 404.php, mặc dù nó phải trả về category-sample.php mà không cần đăng. Có đúng không?
Không. Hãy nhớ rằng: mẫu được chọn tại template_redirect
. Vì vậy, nếu truy vấn nếu hợp lệ, thì tệp mẫu thích hợp được tải. Nếu truy vấn không hợp lệ, thì mẫu 404 được tải.
Vì vậy, một khi mẫu được tải - ví dụ mẫu danh mục - một khi vòng lặp được xuất ra, mẫu không thay đổi .
Nhìn lại thứ tự các hành động:
parse_query
pre_get_posts
wp
template_redirect
- mẫu được chọn và tải ở đây. Đây là điểm mẫu không có lợi nhuận . Mẫu không thể thay đổi sau thời điểm này.
- ...
the_post
- postdata được thiết lập ở đây, như là một phần của cuộc gọi vòng lặp. Điều này được gọi bên trong mẫu và mẫu không thay đổi dựa trên dữ liệu có sẵn trong đối tượng truy vấn
Chỉnh sửa cuối cùng
Và tôi khẳng định rằng trong khi kiểm tra sự tồn tại của bài viết, tại sao tôi phải chạy thử nghiệm tương tự hai lần. Đó là câu hỏi của tôi từ điểm đầu tiên tôi chỉ hỏi về điều đó.
Và với điều đó, cuối cùng tôi cũng hiểu: tất cả cùng, câu hỏi của bạn không liên quan gì đến WordPress hay Vòng lặp WordPress . Bạn đang hỏi về việc gói bất kỳ while
vòng lặp PHP tùy ý nào trong một if
điều kiện kiểm tra cùng một điều kiện.
Câu hỏi đó nằm ngoài phạm vi của WPSE, nhưng tôi sẽ giải thích ngắn gọn:
Một if
điều kiện là một đánh giá nhị phân: nó hoặc true
hoặc false
, và những gì xảy ra bên trong điều kiện đó được thực hiện một lần .
Một while
điều kiện là một vòng lặp : nó vẫn đúng trong một khoảng thời gian riêng biệt, dựa trên một số loại bộ đếm; và những gì xảy ra bên trong điều kiện đó được thực thi nhiều lần - một lần cho mỗi lần lặp của bộ đếm.
Vì vậy, giả sử rằng bạn muốn đưa ra một danh sách các thứ không có thứ tự, nếu danh sách các thứ được điền. Nếu bạn sử dụng mộtwhile
vòng lặp và bỏ qua if
trình bao bọc, đánh dấu của bạn sẽ như thế này:
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
Và nếu list_of_things()
trống, đầu ra được kết xuất sẽ là:
<ul>
</ul>
Mà để lại đánh dấu không cần thiết (và không hợp lệ).
Nhưng nếu bạn thêm vào if
trình bao bọc có điều kiện, bạn có thể làm điều này:
<?php if ( list_of_things() ) : ?>
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
Và nếu list_of_things()
trống, không có đánh dấu nào được xuất ra.
Đó chỉ là một ví dụ. Có rất nhiều cách sử dụng cho if
trình bao bọc có điều kiện đó và if
trình bao bọc có điều kiện phục vụ một mục đích hoàn toàn khác so với while
vòng lặp.