Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. WordPress

Làm chủ WP_Query: Action và Filter

by
Read Time:6 minsLanguages:
This post is part of a series called Mastering WP_Query.
Mastering WP_Query: Related Functions
Mastering WP_Query: Properties and Methods

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Chào mừng đến với phần thứ ba của loạt bài gọi là "Làm chủ WP_Query". Trong phần trước, chúng ta đã trải qua 13 hàm WordPress có liên quan đến lớp WP_Query. Trong phần này, chúng ta sẽ ôn lại các hook của WordPress (các filter và action) mà bạn có thể sử dụng kết hợp với WP_Query.

Vậy không cần phải rườm rà nữa, chúng ta hãy bắt đầu nào!

Những Filter Liên quan đến WP_Query

Trong phần "Tài liệu Tham khảo về Filter" của Codex, có 16 filter WordPress được liệt kê bên dưới tiêu đề "WP_Query Filters". Trong phần này, chúng ta sẽ nói về chúng. Nó sẽ là một phần khá nhanh, bởi vì hầu hết các filter là xoay quanh các "mệnh đề" khác nhau của một truy vấn cơ sở dữ liệu được thực hiện bởi lớp WP_Query.

Chúng ta sẽ liên hệ trở lại chúng, ngay sau khi đi qua các filter mà không liên quan đến các mệnh đề.

Lọc số bài viết đã được tìm thấy cho truy vấn: found_posts

Filter này cho phép bạn thay đổi số phần tử đã được tìm thấy mà không bị hạn chế bởi đối số posts_per_page của WP_Query.

Filter này đặc biệt hữu ích cho việc tạo phân trang tùy biến. Hãy xem Codex nói gì:

Ví dụ, nếu bạn khai báo giá trị offset tuỳ biến trong các truy vấn của bạn, WordPress sẽ KHÔNG khấu trừ phần offset khỏi tham số $wp_query->found_posts (ví dụ, nếu bạn có 45 bài viết có thể sử dụng được sau 10 offset, thì WordPress sẽ bỏ qua offset và tiếp tục cho found_posts giá trị là 55).

Dễ hiểu.

Lọc truy vấn để chạy truy xuất các bài viết được tìm thấy: found_posts_query

Số lượng các phần tử được tìm thấy được tính toán bằng lệnh SELECT FOUND_ROWS() trong MySQL. Filter này cho phép bạn thay đổi lệnh này thành một cái gì đó khác, trong trường hợp bạn cần tính số lượng các phần tử đã được tìm thấy theo một cách khác.

Lọc toàn bộ truy vấn SQL: posts_request

Nếu bạn muốn thay đổi truy vấn SQL đã hoàn tất, thì đây là filter mà bạn nên sử dụng. Về cơ bản, nó sẽ thay thế toàn bộ truy vấn SQL được tạo ra bởi lớp WP_Query.

Lọc mảng mà truy vấn trả về: posts_results

Nếu bạn muốn thay đổi mảng (array) PHP mà WP_Query tạo ra bằng truy vấn SQL, bạn có thể sử dụng filter này. Có một ví dụ dễ hiểu trên Codex để bạn có thể xem cách nó hoạt động.

(Xin lưu ý rằng filter này xử lý mảng thô được tạo ra từ truy vấn SQL.)

Lọc mảng các bài viết đã truy vấn được: the_posts

Không giống như posts_results, filter the_posts chờ cho mảng được xử lý bên trong, có nghĩa là mảng đó sẽ được kiểm tra đề phòng các bài viết chưa được xuất bản và sticky. Sử dụng filter này nếu bạn không muốn các bài viết chưa xuất bản ở trong mảng của bạn.

Lọc danh sách các trường  (và Mệnh đề SELECT) của Query: posts_fields

Mệnh đề SELECT của một truy vấn SQL xác định các trường cơ sở dữ liệu sẽ được chọn từ các dòng cơ sở dữ liệu kết quả, và filter này sẽ giúp bạn lọc nó.

Lọc mệnh đề LIMIT của truy vấn: post_limits

Mệnh đề LIMIT của một truy vấn SQL thiết lập các giới hạn cho truy vấn, và filter này sẽ giúp bạn lọc nó.

Lọc mệnh đề DISTINCT của truy vấn: posts_distinct

Mệnh đề DISTINCT của một truy vấn SQL phát biểu rằng truy vấn chỉ nên trả về các kết quả khác nhau, và filter này sẽ giúp bạn lọc nó. Đương nhiên, WP_Query không trả về các kết quả khác biệt nhưng khi bạn sử dụng filter này với một hàm trả về "DISTINCT", thì truy vấn sẽ được điều chỉnh để chỉ trả về các kết quả khác nhau.

Lọc mệnh đề WHERE của truy vấn: posts_where

Mệnh đề WHERE của truy vấn SQL được sử dụng để lọc các câu lệnh SELECT, INSERT, UPDATE hoặc DELETE của MySQL, và filter này sẽ giúp bạn lọc điều này. Mặc dù lớp WP_Query thực hiện tất cả các công việc cần thiết để lọc kết quả, nhưng bạn có thể nâng cao nó bằng cách sử dụng filter này.

Lọc mệnh đề WHERE của truy vấn sau khi phân trang đã được tính: posts_where_paged

Filter này là sự lặp lại đối với filter posts_where, cái mà bạn có thể sử dụng với các truy vấn phân trang.

Lọc mệnh đề WHERE của truy vấn tìm kiếm: posts_search

Một sự lặp lại khác của filter posts_where là filter này, bạn có thể sử dụng để thay đổi mệnh đề WHERE của một truy vấn được sử dụng để lấy kết quả tìm kiếm trong WordPress.

Lọc mệnh đề JOIN của truy vấn: posts_join

Mệnh đề JOIN của một truy vấn SQL cho phép bạn làm việc với lệnh SQL của bạn bên trong nhiều bảng cơ sở dữ liệu, và filter này sẽ giúp bạn lọc nó. Đây là một trong những phần nâng cao của MySQL, vì vậy tôi không khuyến khích bạn sử dụng filter này trừ khi bạn biết rõ công việc của JOIN trong MySQL.

Lọc mệnh đề JOIN của truy vấn sau khi đã tính phân trang: posts_join_paged

Cũng giống như posts_where_paged là một sự lặp lại của posts_where, đây là một sự lặp lại của filter posts_join hoạt động trên các truy vấn phân trang.

Lọc mệnh đề ORDER BY của truy vấn: posts_orderby

Mệnh đề ORDER BY của một truy vấn SQL sắp xếp thứ tự của truy vấn, và filter này sẽ giúp bạn lọc thứ tự.

Lọc mệnh đề GROUP BY của truy vấn: posts_groupby

Mệnh đề GROUP BY của một truy vấn SQL làm cho truy vấn trả về "nhóm" các kết quả theo một trường của cơ sở dữ liệu, và filter này sẽ giúp bạn lọc cách nhóm các kết quả.

Lọc tất cả các mệnh đề của truy vấn: posts_clauses

Nếu bạn muốn xử lý tất cả các mệnh đề cùng một lúc, có một filter để làm điều đó: posts_clauses. Filter này bao quát các mệnh đề WHERE, GROUP BY, JOIN, ORDER BY, DISTINCT, SELECT, và LIMITS.

Những Action liên quan đến WP_Query

Bây giờ chúng ta đã ôn lại các filter liên quan đến WP_Query, hãy chuyển sang một loại hook khác: action.

Can thiệp vào truy vấn trước khi nó chạy: pre_get_posts

Trước khi truy vấn được phân tích, bạn có thể tương tác với nó (ví dụ, đưa vào các biến truy vấn bổ sung) bằng cách sử dụng action này. Hãy xem một ví dụ đơn giản từ Tom McFarlin để xem cách loại trừ một thể loại (category) khỏi vòng lặp chính:

Xử lý phân tích của truy vấn: parse_query

Không giống như pre_get_posts, can thiệp vào truy vấn trước khi các biến truy vấn được thiết lập, action parse_query xử lý quá trình sau khi các biến truy vấn được thiết lập. Do đó, bạn nên sử dụng action này nếu bạn muốn kiểm tra các biến hiện tại và thực hiện hành động phù hợp với chúng.

Thay đổi đối tượng Post: the_post

Thuật ngữ the_action hơi khó hiểu một chút vì nó là tên của một action, một hàm liên quan đến WP_Query và cũng là một phương thức của lớp WP_Query.

Action này, theo như Codex nói, cho phép chúng ta thay đổi đối tượng post ngay sau khi được truy vấn và thiết lập. Sử dụng action này, bạn có thể thay đổi trực tiếp đầu ra. Hãy xem một ví dụ nhanh:

Kết thúc Phần ba

Action và filter luôn là một chủ đề thú vị để nói và viết. (Tôi biết chắc rằng hai loạt bài của tôi về các actionfiilter của WordPress đã rất thú vị khi viết và có một phản ứng tuyệt vời từ những người đọc.) Tôi hy vọng bạn thích phần này cũng như tôi đã rất thích viết về nó.

Bạn có muốn bổ sung thêm điều gì vào bài viết này không? Hãy để lại một bình luận trong phần bình luận ở bên dưới nhé. Và nếu bạn thích bài viết, đừng quên chia sẻ nó với bạn bè của mình!

Hẹn gặp bạn ở phần tiếp theo, nơi chúng ta sẽ nói về các thuộc tính và phương thức của lớp WP_Query!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.