7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. WordPress

Action và Filter trong WordPress: Khác nhau như thế nào?

Scroll to top
Read Time: 13 mins

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

Action và Filter là một phần cơ bản của các WordPress API khác nhau. Nếu không có chúng bạn sẽ bị giới hạn về những gì bạn có thể làm trong các theme và (đặc biệt) các plugin của bạn.

Nhưng đôi khi, rất dễ nhầm lẫn giữa hai cái đó, đặc biệt là trong các trường hợp khi mà WordPress có một action và filter cùng tên.

Trong bài này, chúng ta sẽ định nghĩa action và filter và mô tả sự khác biệt giữa chúng, và tôi sẽ minh hoạ cách sử dụng chúng trong các theme và plugin của bạn. Tôi cũng sẽ đưa ra một số ví dụ minh hoạ để bạn biết nên sử dụng chúng khi nào.

Khi bạn thêm action và filter vào code của bạn (hoặc bạn đang gắn các hàm vào chúng), bạn cần phải hiểu được action và filter được gọi như thế nào bởi WordPress và những gì xảy ra sẽ theo thứ tự nào. Tôi sẽ không đi sâu vào chi tiết ở đây vì chúng ta có một hướng dẫn khác thực hiện công việc đó.

Định nghĩa và Sự khác biệt

Hãy bắt đầu với một số định nghĩa. Tôi sẽ định nghĩa action và filter và cả hàm nữa, để bạn có thể thấy được sự khác biệt giữa tất cả chúng.

Hàm

Hàm là thứ đầu tiên mà hầu hết mọi người đối mặt khi họ học phát triển WordPress; nếu bạn đã từng thêm code vào tập tin functions.php của theme, thì bạn sẽ phải viết một hàm.

Hàm xác định một điều gì đó sẽ xảy ra như thế nào. Bạn viết một hàm để truy vấn dữ liệu, để xuất nội dung, hoặc để thực hiện nhiều tác vụ khác. Bạn có thể gọi (thực thi) hàm trực tiếp bên trong tập tin template của theme, hoặc bạn có thể gắn chúng vào action và filter. Hàm cũng có thể bao gồm các thẻ template như các thẻ điều kiện, để xác định khi nào hàm sẽ được áp dụng.

Tôi sẽ trình bày cho bạn những cách khác nhau để thực thi các hàm trong phần sau của bài viết này.

Action Hook

Action Hook (hay đơn giản là Action) được kích hoạt khi một điều gì đó xảy ra, chẳng hạn như tải một trang, người dùng đăng nhập, hoặc hành động tùy biến mà bạn định nghĩa trong theme hoặc plugin của mình.

Bạn có thể thêm các action của riêng bạn bằng cách sử dụng hàm do_action(), điều mà tôi sẽ trình bày trong giây lát nữa. Bất kỳ hàm nào mà bạn gắn vào action đó thì sẽ được thực thi tại thời điểm đó trong code.

Filter Hook

Filter Hook, hay đơn giản là Filter, kiểm soát một thứ gì đó xảy ra hoặc thay đổi một thứ gì đó đang được xuất ra như thế nào. Bạn có thể sử dụng một filter để xuất ra metadata trong một định dạng cụ thể, để thay thế văn bản được xuất ra bởi plugin của bạn, hoặc để ngăn hoàn toàn không cho một cái gì đó được hiển thị.

Bạn có thể thêm filter trong code của bạn bằng cách sử dụng hàm apply_filters(), điều mà tôi sẽ trình bày trong giây lát nữa. Giống như ý nghĩa của từ 'apply' tức áp dụng, bạn áp dụng các filter cho code hiện có, còn một action mà bạn tạo ra bằng hàm do_action() thì rỗng cho đến khi bạn gắn các hàm vào nó.

Sử dụng Hàm, Action và Filter

Hãy cùng xem xét một số ví dụ minh hoạ cách bạn sử dụng từng hàm, action và filter. Trước tiên, chúng ta sẽ xem xét việc sử dụng các hàm trực tiếp bên trong code của bạn mà không gắn chúng vào một hook.

Gọi Hàm Trực tiếp

Dưới đây là một ví dụ về một hàm được gọi trực tiếp bên trong một tập tin template. Trong các trang web khách hàng của tôi, tôi thêm một ghi chú cuối ở footer, trong đó bao gồm thông tin copyright hay bản quyền. Dưới đây là hàm:

Hàm này là pluggable (nghĩa là có thể gắn vào) vì tôi sử dụng nó trong một theme cha; sau đó nếu tôi tạo ra một hàm mới có cùng tên trong theme con của tôi, thì hàm đó sẽ thay thế hàm này. Lưu ý rằng, hàm bao gồm một hàm khác, compass_colophon(), gọi nó trực tiếp bên trong code.

Hàm này nằm trong tập tin functions.php của theme cha. Tôi có thể gọi nó trực tiếp bên trong tập tin footer.php của theme, như sau:

Hàm này xuất ra code trong hàm tại thời điểm trong theme của tôi, nơi tôi gọi nó. Bạn cũng có thể truyền các tham số vào các hàm của bạn, sau đó chúng được sử dụng bên trong hàm.

Như tôi sẽ trình bày trong giây lát nữa, hàm này cũng có thể được gắn vào một action hoặc filter.

Gắn Hàm vào Action

Thay vì gọi hàm colophon đó một cách trực tiếp, sẽ linh hoạt hơn nếu tôi đính kèm nó vào một cái hook.

Tạo Action

Thay vì gọi hàm compass_colophon() bên trong tập tin footer của tôi, tôi có thể thêm một action tại thời điểm đó trong tập tin footer.php bằng cách thêm vào code sau đây:

Hàm do_action() có một tham số bắt buộc, đó là tên của action. Bạn cũng có thể tuỳ ý thêm các đối số vào nó.

Gắn Hàm vào Action

Như vậy, bây giờ thay vì gọi hàm colophon của tôi, tôi cần phải gắn nó vào action mới của tôi. Trong tập tin functions.php của tôi, tôi thêm code này cùng với hàm của tôi:

Code này gắn hàm của tôi vào action compass_in_footer, có nghĩa là code bên trong hàm của tôi sẽ chạy tại thời điểm trong code nơi mà action được đặt. Tham số đầu tiên là tên của action, và thứ hai là tên của hàm.

Một ưu điểm trong việc làm theo cách này là bạn có thể gắn nhiều hơn một hàm vào cùng một action, và bạn có thể thiết lập mức độ ưu tiên để chúng thực thi theo thứ tự mà bạn muốn.

Như vậy, giả sử rằng tôi có một hàm khác mà tôi muốn gắn nó vào hook compass_in_footer của tôi, được gọi là compass_smallprint(), trong đó in ra một số thứ nhỏ hơn:

Bạn có thể thấy ở đây rằng, tôi đã thêm một tham số thứ ba vào hàm add_action() của tôi, đây là mức độ ưu tiên. Mức độ ưu tiên mặc định là 10, điều mà sẽ được áp dụng nếu bạn để trống. Do đó, vì tôi không thiết lập mức độ ưu tiên cho hàm compass_colophon() của tôi, thiết lập 20 cho hàm compass_smallprint() sẽ làm cho hàm đó chạy sau hàm compass_colophon().

Gỡ Hàm khỏi Action

Đôi khi bạn muốn ngăn chặn không cho một hàm chạy, và bạn không thể thay thế nó bởi vì nó không phải là pluggable. Nếu hàm đó đã được gắn vào một action, thì bạn có thể làm điều này bằng cách sử dụng hàm remove_action().

Vì vậy, nếu tôi muốn ngăn chặn hàm compass_smallprint() của tôi chạy, tôi gỡ nó khỏi action compass_in_footer như sau:

Hàm remove_action() có ba tham số: tên của action, tên của hàm và mức độ ưu tiên mà ban đầu hàm được gắn vào action. Bạn phải bao gồm mức độ ưu tiên để điều này có tác dụng.

Bạn cũng có thể gỡ bỏ tất cả các hàm khỏi một action nếu bạn muốn ngăn chặn tất cả chúng khỏi việc thực thi. Hãy cẩn thận khi làm việc này, vì có thể có những hàm mà bạn không để ý được hook vào action của bạn.

Để làm việc này, hãy sử dụng hàm remove_all_actions():

Thêm một mức độ ưu tiên như là tham số thứ hai sẽ chỉ gỡ bỏ các hàm được gắn vào action đó với mức độ ưu tiên mà bạn đã chỉ định, điều này cho phép bạn kiểm soát nhiều hơn.

Gắn Hàm vào Filter

Bạn cũng có tùy chọn gắn các hàm của bạn vào filter. Bạn làm điều này khi bạn muốn thay đổi hoặc thay thế một số code hiện có. Khi bạn tạo một filter (bằng hàm apply_filters()), bạn sẽ bao quanh code trong theme hoặc plugin của bạn, sau đó được thay đổi bởi bất kỳ hàm nào được gắn vào filter.

Điều này có thể hữu ích khi bạn có các tùy chọn theme hoặc plugin mà bạn muốn thay thế một thiết lập mặc định, hoặc nếu bạn đang tạo một theme cha mà có thể có các phần tử bị thay thế bởi một theme con.

Tạo Filter

Hàm apply_filters() có ba tham số: tên của filter, giá trị mà bạn muốn lọc (nghĩa là giá trị mặc định), và các biến tùy chọn mà sau đó bạn truyền vào các hàm được gắn vào filter.

Bạn có thể thêm một filter trong template của theme của bạn hoặc bên trong một hàm được gắn vào thông qua một action. Hãy cùng tìm hiểu cả hai tuỳ chọn.

Quay trở lại hàm compass_colophon() của tôi, tôi chuyển đổi hàm này thành một filter bằng cách thêm nội dung của nó vào tập tin footer.php bên trong hàm apply_filters() như sau:

Việc này xuất ra code mà tôi đã thiết lập như là tham số thứ hai của hàm apply_filters() của tôi.

Tuy nhiên, tôi không muốn thêm trực tiếp điều này vào tập tin template của theme, vì vậy tôi sẽ thêm filter vào hàm mà tôi đã đính kèm thông qua một action.

Vì vậy, tôi thêm action compass_in_footer vào tập tin footer.php của tôi bằng hàm do_action() như đã minh hoạ ở trên, và sau đó tôi tạo một hàm trong tập tin functions.php của tôi, hàm được gắn vào action đó và chứa một filter:

Điều này có nghĩa là giờ đây tôi có thể thay thế nội dung mặc định theo một trong ba cách:

  • bằng cách tạo một hàm mới được gọi là compass_colophon() trong theme con, nó sẽ thay thế hàm trong theme cha của tôi vì nó là có thể gắn vào.
  • bằng cách gỡ hàm compass_colophon() khỏi action compass_in_footer và viết một hàm mới mà tôi đính kèm với nó ở vị trí của nó
  • bằng cách tạo ra một hàm mới mà sau đó tôi gắn vào filter compass_colophon_filter, thay thế giá trị trong hàm apply_filters() của tôi

Trong thực tế, bạn sẽ không cần phải có nhiều tuỳ chọn như thế này, vì vậy có nhiều khả năng là bạn muốn áp dụng filter cho một phần nội dung trong hàm của bạn chứ không phải toàn bộ mọi thứ.

Vì vậy, tôi có thể tạo ra hai filter, một cho phần copyright và một cho credit:

Sau đó, tôi có thể thay thế toàn bộ hàm compass_colophon của tôi bằng cách gỡ nó hoặc viết một hàm mới trong theme con của tôi, hoặc tôi có thể tạo một hàm được gắn vào filter compass_copyright_filter hoặc compass_credits_filter, để thay thế từng phần tử.

Gắn Hàm vào Filter

Để gắn một hàm vào một filter, bạn sử dụng hàm add_filter() có hai tham số: tên của filter và tên của hàm.

Vì vậy, để thay đổi credit, tôi sẽ viết hàm này:

Hàm này thay thế giá trị được thiết lập trong filter ban đầu của tôi compass_credits_filter bằng nội dung của hàm new_credits() của tôi, nhưng giữ nguyên mọi thứ khác trong hàm compass_colophon().

Bạn cũng có thể chỉ định mức độ ưu tiên khi gắn các hàm vào filter, theo cùng một cách tương tự với action. Hàm với mức độ ưu tiên thấp hơn sẽ được chạy trước.

Gỡ Hàm khỏi Filter

Tương tự như action, bạn cũng có thể gỡ các hàm khỏi filter. Bạn thực hiện việc này bằng hàm remove_filter() với ba tham số: tên của filter, tên của hàm, và mức độ ưu tiên, nó tham số bắt buộc nếu mức độ ưu tiên được thiết lập khi hàm ban đầu được gắn vào filter.

Vì vậy để gỡ hàm new_credits() của tôi, tôi sử dụng điều này:

Đầu ra của code sau đó sẽ trở về với giá trị mà tôi đã chỉ định trong hàm apply_filters() ban đầu của tôi. Vì vậy, nếu tôi muốn gỡ hàm new_credits() và không có gì xuất hiện ở vị trí của nó, tôi phải thêm một hàm mới. Sau đó tôi gỡ bỏ hàm đầu tiên và gắn hàm mới của tôi như sau:

Tổng hợp

Hiểu được sự khác nhau giữa action và filter và có thể sử dụng cả hai một cách hiệu quả sẽ làm cho việc phát triển theme và plugin của bạn trở nên hiệu quả hơn. Trong thực tế, nếu không sử dụng, ít nhất là một loại hook, thì bạn không thể viết các plugin, vì cách duy nhất code trong plugin của bạn được kích hoạt là thông qua action và filter mà nó gắn vào.

Hướng dẫn này chỉ cho bạn cách thêm tính năng tương tự bằng một hàm, một action và một hoặc nhiều filter, cùng với các kỹ thuật để gỡ các hàm khỏi các hook và những lời khuyên về mỗi kỹ thuật trở nên hữu ích hơn khi nào.

Tương tự như việc gắn các hàm vào action và filter mà bạn tạo ra, bạn cũng có thể gắn chúng vào actionfilter được cung cấp bởi WordPress, chẳng hạn như action wp_head hoặc filter body_class.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
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.