Làm chủ WP_Query: Giới thiệu (ok)
https://code.tutsplus.com/vi/tutorials/mastering-wp_query-an-introduction--cms-23023
Last updated
https://code.tutsplus.com/vi/tutorials/mastering-wp_query-an-introduction--cms-23023
Last updated
Mặc định, WordPress sẽ chạy một truy vấn (query) trên mỗi trang mà trang web của bạn hiển thị, tính chất của truy vấn sẽ được xác định bởi loại trang đang được xem. Vì vậy, nếu một trang tĩnh đang được xem, WordPress sẽ chạy một truy vấn để hiển thị trang bằng ID có liên quan, trong khi đó nếu một trang lưu trữ (archive) đang được xem, thì truy vấn sẽ truy xuất tất cả các bài viết trong lưu trữ đó.
Nhưng đôi khi bạn muốn làm điều gì đó hơi khác một chút. Trong nội dung chính của trang hoặc ở nơi khác trên trang (chẳng hạn như trong sidebar hoặc footer), bạn có thể muốn hiển thị một số nội dung cụ thể mà không được xuất ra bởi truy vấn tiêu chuẩn.
Tin tốt là WordPress hiện thực hoá điều đó với lớp WP_Query
. Lớp này cung cấp cho bạn một số lượng lớn các tham số mà bạn có thể sử dụng để xác định nội dung nào mà bạn muốn xuất ra (không nhất thiết là các bài viết) và sau đó viết một vòng lặp trong đó sẽ hiển thị chính xác nội dung mà bạn muốn.
Trong loạt bài gồm mười phần này về Làm chủ WP_Query
, Baris Unver và tôi sẽ từng bước hướng dẫn bạn chi tiết về WP_Query
để khi bạn hoàn thành loạt bài này, bạn sẽ có thể sử dụng nó trong nhiều tình huống khác nhau và tinh chỉnh cái cách mà WordPress truy vấn dữ liệu trong cơ sở dữ liệu của trang web.
Trong phần giới thiệu này, tôi sẽ khái quát những vấn đề sau:
WP_Query
là gì?
Tại sao nên sử dụng WP_Query
?
Các vấn đề tiềm ẩn hay những điều cần chú ý.
WP_Query
là một lớp được cung cấp bởi WordPress. Thực tế, nó là một lớp có nghĩa là bằng cách sử dụng nó, bạn có thể nhanh chóng truy cập các biến, các điều kiện kiểm tra và các hàm đã được tích hợp vào lớp đó trong nhân của WordPress, mà không phải lo lắng về việc tự viết tất cả code đó. Việc này làm cho code của bạn trở nên hiệu quả hơn và đáng tin cậy hơn.
Nếu bạn muốn hiểu một cách tường tận WP_Query
hoạt động như thế nào, thì bạn có thể xem code của nó trong tập tin includes/query.php
.
WP_Query
bao gồm bốn thành phần chính:
các đối số cho truy vấn, việc sử dụng các tham số sẽ được khái quát chi tiết trong loạt bài này
bản thân truy vấn
vòng lặp sẽ xuất ra nội dung của bài viết, tiêu đề hoặc bất cứ điều gì mà bạn muốn hiển thị
sau cùng: đóng các thẻ if và while và thiết lập lại dữ liệu bài viết
Ví dụ thực tế sẽ giống như sau:
01020304050607080910111213141516
<?php$args
=
array( // arguments for your query);
// the query$query
=
new
WP_Query(
$args
);
// The Loopif
(
$query->have_posts() ) :
while
(
$query->have_posts() ) :
$query->the_post() ; // contents of the Loop go here
endwhile
:
endif;/* Restore original Post Data */wp_reset_postdata();?>
Bạn có thể định nghĩa các đối số của bạn khi đang viết truy vấn, nhưng tôi thích định nghĩa những đối số đó trước, vì nó giữ mọi thứ được gọn gàng.
Trong ví dụ ở trên, tôi đã thêm wp_reset_postdata()
sau mỗi truy vấn. Điều này là rất quan trọng vì nó thiết lập lại truy vấn thành truy vấn chính đang chạy trên trang đó.
Ví dụ, nếu bạn đang sử dụng WP_Query
để chạy một truy vấn trên sidebar, sử dụng wp_reset_postdata()
có tác dụng nói cho WordPress biết rằng chúng ta vẫn đang ở trên bất cứ trang nào đang được xem và nó sẽ làm việc với truy vấn mặc định cho trang đó.
Nếu bạn không làm điều này, thì mọi truy vấn khác đang chạy trên trang (bao gồm truy vấn mặc định) có thể bị ngắt, và bất kỳ thẻ điều kiện nào đang kiểm tra loại trang đang được xem sẽ không hoạt động.Advertisement
Nếu bạn chưa từng sử dụng lớp WP_Query
trước đây, thì bạn có thể tự hỏi tại sao bạn nên bắt đầu với nó. Ở đây, tôi sẽ tập trung vào hai khía cạnh của vấn đề này: tại sao sử dụng WP_Query
thay vì các phương thức viết truy vấn tùy biến khác và các trường hợp nơi bạn có thể muốn sử dụng WP_Query
.
WP_Query không phải là phương pháp duy nhất để tạo một truy vấn tùy biến. Còn có bốn phương pháp khác:
pre_get_posts
get_posts()
get_pages()
query_posts()
(cái mà bạn nên tránh, tôi sẽ giải thích sau)
Tôi sẽ không đi sâu vào chi tiết về cách hoạt động của mỗi phương pháp này, nhưng sẽ rất hữu ích nếu biết khi nào chúng nên được sử dụng:
pre_get_posts
là một hook để thay đổi truy vấn chính. Bạn có thể sử dụng nó với một thẻ điều kiện để kiểm tra xem một loại trang nào đó đang được xem (ví dụ trang chủ) và sau đó sử dụng nó để sửa đổi truy vấn đang chạy (ví dụ như để loại ra ba bài viết gần đây nhất, nếu bạn đang hiển thị chúng ở một nơi khác trên trang). Đó là một cách rất hiệu quả để sửa đổi truy vấn chính và nên là lựa chọn đầu tiên nếu đó là những gì bạn muốn làm. Tuy nhiên, bạn không thể sử dụng nó để tạo một truy vấn mới hoàn toàn.
get_posts()
và get_pages()
là rất giống nhau, với sự khác biệt rõ rệt đến từ tên của chúng. Các thẻ template này thực tế sử dụng lớp WP_Query
, vì vậy chúng là một cách khác để thực hiện điều tương tự, nhưng thêm một bước phụ vì chúng gọi đến lớp WP_Query
thay vì bạn thực hiện trực tiếp điều đó. Bạn chỉ có thể sử dụng chúng để truy vấn các bài viết hoặc các trang, trong khi đó bản thân WP_Query
thì mạnh mẽ hơn và cho phép bạn truy vấn hầu như bất cứ thứ gì được lưu trong cơ sở dữ liệu của bạn.
query_posts()
sửa đổi truy vấn chính nhưng không nên sử dụng nó trong plugin hoặc theme. Điều này là do nó bỏ đi truy vấn chính và bắt đầu tất cả mọi thứ lại từ đầu, thay thế truy vấn chính bằng một truy vấn mới. Nó cũng dễ bị lỗi, đặc biệt với đánh số trang, và không hiệu quả và sẽ ảnh hưởng đến thời gian tải trang của bạn. Nếu bạn cần sửa đổi truy vấn chính, hãy sử dụng pre_get_posts
, và nếu bạn muốn tạo ra một truy vấn hoàn toàn mới, hãy sử dụng WP_Query
.
Có nhiều trường hợp trong đó WP_Query
trở nên hữu ích và tôi không thể khái quát tất cả chúng ở đây, nhưng dưới đây là một cái nhìn tổng quan:
Để thêm một danh sách các bài viết có liên quan dưới bài viết hiện tại—ví dụ như một danh sách tất cả các bài viết trong cùng một thể loại.
Để tạo hai vòng lặp trên cùng một trang: ví dụ như trang FAQ với tiêu đề câu hỏi ở trên cùng và nội dung bên dưới.
Để tạo một danh sách tùy biến các bài viết gần đây trên sidebar hoặc footer của trang web, khi widget Recent Posts không thực hiện được những gì mà bạn cần (hoặc bạn muốn tự viết nó).
Để tạo ra các truy vấn tùy biến cho Taxonomy, sử dụng nhiều hơn một taxonomy để xác định những gì được hiển thị.
Để truy vấn các loại bài viết không được xuất ra bởi truy vấn mặc định, chẳng hạn như các đính kèm.
Để tạo ra trang tùy biến với một số truy vấn cho các loại nội dung khác nhau, giống như tôi đã thực hiện trong trang ví dụ này cho khách hàng.
WP_Query
là một lớp tuyệt vời. Tôi tạo ra rất nhiều trang web cần đến các truy vấn tùy biến, do đó, tôi sử dụng nó một cách thường xuyên. Nhưng không có nghĩa là nó không có những hạn chế. Dưới đây là một số vấn đề bạn cần lưu ý:
Nếu tất cả những gì bạn muốn làm là thay đổi cách các bài viết cho một loại nội dung hoặc lưu trữ nào đó đang được hiển thị, thì đừng sử dụng WP_Query
. Thay vào đó, chỉ cần tạo một tập tin template cho trang lưu trữ hoặc loại nội dung đó và sửa đổi vòng lặp trong tập tin template đó.
Nếu bạn muốn hiển thị thêm hay bớt đi vài bài viết so với bình thường được hiển thị trên trang lưu trữ (ví dụ không hiển thị một danh mục cụ thể), thì không nên sử dụng WP_Query
để tạo một truy vấn hoàn toàn mới. Thay vào đó, hãy sử dụng pre_get_posts
để sửa đổi truy vấn chính, cùng với một thẻ điều kiện để chọn ra chính xác nơi mà bạn muốn làm điều đó.
Hãy chú ý đến việc chạy quá nhiều truy vấn trên một trang. Về lý thuyết, bạn có thể tạo một trang với hàng trăm truy vấn tùy biến, nhưng hãy nghĩ đến vấn đề quá tải máy chủ. Nếu bạn cần nhiều hơn bốn hoặc năm truy vấn trên một trang, thì bạn có thể cần cân nhắc tạo thêm các trang phụ.
Lớp WP_Query
là một công cụ mạnh mẽ và cực kỳ hữu ích để tạo ra các truy vấn tùy biến và làm cho trang WordPress của bạn hoạt động như mong muốn. Như chúng ta đã thấy, có những lúc bạn nên sử dụng các phương pháp khác để tạo ra các truy vấn tùy biến, nhưng cũng có rất nhiều trường hợp để sử dụng nó.
Trong phần còn lại của loạt bài này, chúng tôi sẽ từng bước hướng dẫn chi tiết cho bạn cách sử dụng và tận dụng tối đa WP_Query
.
Sơ đồ dưới đây, phát hành bởi Andrey "Rarst" Savchenko dưới giấy phép Creative Commons, giúp làm rõ điều này: