WP_Query: Tất cả những thông tin bạn cần biết

WP_Query Class là một công cụ đặc biệt mạnh mẽ trong WordPress. Như bạn đã biết, mọi trang web WordPress đều có cơ sở dữ liệu lưu trữ nhiều bài đăng (thuộc nhiều post type khác nhau) tạo nên phần lớn nội dung của trang web đó. WP_Query là cách tốt nhất để tìm nạp hoặc truy xuất một danh sách các bài viết đáp ứng một số yêu cầu nhất định do mình đặt ra. Vì vậy, không ngạc nhiên khi các files trong theme wordpress sử dụng nó thường xuyên và rất nhiều plugin của WordPress cũng sử dụng WP Query.

Việc sử dụng và sức mạnh của WP_Query sẽ có ý nghĩa hơn khi chúng ta đi sâu vào tìm hiểu nó. Cùng bắt đầu nhé!

Tất Cả Những Thông Tin Bạn Cần Biết Về Class WP_Query

Tất Cả Những Thông Tin Bạn Cần Biết Về Class WP_Query

WP_Query và Object-Oriented PHP

WP_Query là một class PHP có một số thuộc tính nhất định. Khi sử dụng, trong PHP, new WP_Query() tức là bạn tạo một đối tượng (hoặc thể hiện) của lớp đó.

Nếu chưa hiểu về lập trình PHP hướng đối tượng, bạn có thể sẽ phải tìm hiểu sâu hơn về nó trước khi nghiên cứu về WP_Query. Nếu bạn đã đọc hoặc đã hiểu những kiến thức cơ bản về lập trình hướng đối tượng trong PHP, hãy áp dụng những khái niệm đó cho WP_Query.

Lấy đối tượng WP_Query bạn muốn

Khi bạn tạo một đối tượng WP_Query mới, tức là bạn tạo một truy vấn tới cơ sở dữ liệu để lấy dữ liệu tất cả các bài đăng WordPress mà bạn yêu cầu.

Vì vậy, một trong những điều đầu tiên bạn cần hiểu về WP_Query là theo mặc định, khi bạn khai báo new WP_Query, bạn sẽ không sử dụng được nhiều từ nó. Thay vào đó, cách bạn tạo đối tượng – cùng với truy vấn cụ thể mà bạn chạy – là cách bạn khai thác sức mạnh của WP_Query.

Phương thức khởi tạo của WP_Query chỉ nhận một tham số, $args. Điều này phổ biến trong WordPress – bạn chỉ cần chuyển một mảng hoặc chuỗi $args có chứa thông số về những gì bạn muốn. Độ sâu của những gì có thể đưa vào $args của bạn vượt xa những gì có giá trị để chia sẻ ở đây, nhưng mình sẽ đề cập đến các điểm cơ bản.

Tham số $args chấp nhận cả mảng và chuỗi, và cú pháp hơi khác nhau giữa chúng. Theo kinh nghiệm của mình thì mình khuyên bạn nên chủ yếu xây dựng $args dưới dạng mảng, bởi vì nó dễ và can thiệp được sâu hơn so với chuỗi.

Tạo đối tượng query mới với WP_Query

Như vậy, mỗi một trang trong WordPress đều có một truy vấn mặc định để lấy dữ liệu và được lưu trong $wp_query. Tất nhiên, không chỉ có 1, chúng ta có thể tạo ra nhiều đối tượng query khác nhau với các tham số khác nhau để lấy bài viết theo ý bạn muốn. Đó là lúc chúng ta cần sử dụng Class WP_Query.

Có vẻ như WordPress sử dụng SQL_CALC_FOUND_ROWS trong hầu hết các truy vấn để thực hiện phân trang. Ngay cả khi bạn không cần phân trang. SQL_CALC_FOUND_ROWS yêu cầu MySQL thực hiện công việc bổ sung để đếm tổng số kết quả của truy vấn và điều này có thể tạo ra nhiều khác biệt nếu bạn có một lượng dữ liệu lớn.

Với các hàm get_posts và query_posts có một tham số mặc đinh để ngăn cho việc đếm kết quả truy vấn. Tham số được đặt tên là no_found_rows và nó chấp nhận các giá trị boolean – tức là true hoặc false. Nó nói với WordPress không tính tổng số kết quả của truy vấn. Đây là một ví dụ sử dụng:

Kể từ phiên bản WordPress 4.6.1 hàm get_posts đã được tự động đặt no_found_rows=true. Riêng query_posts và WP_Query thì vẫn đếm tổng số kết quả của truy vấn, vì vậy bạn vẫn nên đặt no_found_rows=true khi sử dụng chúng và không cần phân trang.

Cách sử dụng WP_Query

Như đã nói ở trên, class này nhận duy nhất một tham số dưới dạng mảng hoặc chuỗi. Chúng ta muốn tùy chỉnh để lấy bài viết thì chúng ta chỉ cần thay đổi tham số khai báo trong mảng hoặc chuỗi này là được.
Cấu trúc đoạn mã như sau:

Trong đó, $args là biến chứa tham số.

Một số ví dụ cụ thể cho các bạn dễ hiểu nhé

Lấy bài viết theo tác giả

Hiển thị bài viết của 1 tác giả nào đó khi đã biết id của tác giả. Ví dụ bên dưới id của tác giả là 123

Hiển thị bài viết của 1 tác giả nào đó khi đã biết user_nicename của tác giả. Ví dụ bên dưới user_nicename của tác giả là admin

Hiển thị bài viết từ nhiều tác giả

Ví dụ bên dưới dùng để lấy bài viết của nhiều tác giả với các id là 3,5,7,10

Lấy bài viết nhưng không lấy bài của tác giả có id là 10

Lấy tất cả bài viết trừ những bài của tác giả có id là 10:

Sử dụng array để lấy bài viết của nhiều tác giả

Tương tự bạn cũng có thể loại bỏ các bài viết của nhiều tác giả khác nhau:

Tương tự với category.

Lấy tất cả bài viết trong category có id là 4 (bao gồm cả các category con của category có id là 4)

Tương tự như bên trên nhưng thay vì lấy theo id thì ta lấy theo slug của category:

Nếu muốn lấy bài viết của category có id là 4 thôi, không lấy các bài viết của category con của category có id là 4 thì thay vì dùng cat, ta dùng category__in

Cũng như vậy, để lấy bài viết ở nhiều category:

Lấy bài ở nhiều category dùng slug:

Lấy dữ liệu bài viết nằm ở cả 2 category du-lich và meo-vat

Ta cũng có thể loại bỏ các category không muốn lấy bài viết bằng dấu trừ (-).

Lấy dữ liệu bài viết nằm ở cả 2 category có id là 2 và 6

Để lấy bài viết ở category có id là 2 HOẶC 6 thì ta có thể dùng ‘cat’=>’2,6’ hoặc là category__in (cái này nó không lấy bài ở các category con):

Tương tự có thể loại bỏ bài viết ở nhiều category khác nhau bằng cách dùng ‘category__not_in’:

Tất cả các tham số trong WP_Query

Ngoài các ví dụ cụ thể bên trên, mình list ra đây tất cả các tham số có thể sử dụng của chuỗi $args khi truyền vào class WP_Query. Mời các bạn tham khảo. Lưu ý khi sử dụng phải kết hợp cho chuẩn, đừng kết hợp kiểu có cả __in và __not_in cùng id nhé :D.

Tất cả các tham số có thể sử dụng của chuỗi $args khi truyền vào Class WP Query

Tất cả các tham số có thể sử dụng của chuỗi $args khi truyền vào Class WP Query

Sử dụng WP Query và Loop (vòng lặp) để lấy bài viết

Ví dụ dưới đây sử dụng WP Query và vòng lặp để lấy bài viết của tác giả admin

Một ví dụ phức tạp hơn là lấy tất cả bài viết của tác giả admin, trong vòng 1 tuần qua, được post trong mục du-lich

Tham khảo thêm thông tin về WP_Query tại WordPress Developer Resources

Đánh giá
Share.
About Author