Bài 04: Tìm hiểu Hooks , Action và Filter trong WordPress
Trong bài này chúng ta sẽ tìm hiểu hook là gì, action là gì và filter là gì trong WordPress, đây là ba khái niệm bạn sẽ gặp rất nhiều trong quá trình học lập trình WordPress nâng cao như làm theme và plugins.
Bạn đã từng nghe khái niệm lập trình hướng sự kiện trong các Framework như Zend, Laravel, Phalcon rồi phải không nào? Hay thậm chí trong Javascript cũng có khái niệm về lập trình sự kiện. Vậy thì trong WordPress có tồn tại khái niệm này không?
Thực ra WordPress chỉ là một phần mềm chạy trên nền web nên sự kiện của nó chính là các điểm nhấn trong quá trình biên dịch mã nguồn, và bạn muốn can thiệp vào những điểm nhấn đó thì phải sử dụng đến các API của hooks.
Hãy đọc bài WordPress API nếu bạn chưa biết về nó.
Bài viết này được đăng tại [free tuts .net]
1. Hooks là gì?
Trong WordPress, hooks là danh sách các điểm nhấn (điểm móc) nằm trong hệ thống mã nguồn của WordPress, tại đây bạn có thể bổ sung các đoạn code thông qua hai hàm add_action và add_filter mà WordPress đã cung cấp sẵn. Chúng ta có hai nhóm hooks chính đó là filter và action.
- Filter là các điểm móc liên quan đến xử lý nội dung
- Action là các điểm móc liên quan đến xử lý hành động
Ví dụ:
(1) Bạn muốn kiểm tra loại bỏ những đường link mà người quản trị đã cố tình thêm vào khi sửa bài viết thì sẽ sử dụng đến hook có tên là save_post, và nó thuộc nhóm action.
add_action('save_post', 'function_name', 10, 2);
(2) Bạn muốn khi hiển thị nội dung bài viết ra ngoài frontend thì thêm một dòng chữ ở vị trí cuối cùng của content thì có thể sử dụng hook có tên là the_content, và nó thuộc nhóm filter.
add_filter( 'the_content', 'function_name', 1 );
Mỗi hook sẽ có các tham số truyền vào khác nhau, nên để chắc chắn thì trước khi sử dụng một hook nào đó bạn hãy lên trang codex để tham khảo nhé. Ví dụ với hook the_title thì sẽ có hai tham số truyền vào đó là $title
và $id
.
Trường hợp trang codex không giải thích rõ về tham số thì bạn hãy tự mình debug bằng cách truyền tham số vào hàm function_name
và kết hợp với hàm var_dump để in ra xem nội dung của tham số đó.
Trước khi tìm hiểu rõ hơn về action và filter thì bạn tạo cho mình hai file hook-filter.php
và hook-action.php
nằm trong thư mục includes của plugin có tên là wp-learn. Cấu trúc này mình đã tạo trong bài viết các bước tạo plugin WordPress, bạn có thể đọc nó nếu chưa biết.
Tiếp theo bạn tạo file nằm wp-learn.php
và bổ sung hai đoạn code require hai file đó vào như sau.
require 'includes/hook-filter.php'; require 'includes/hook-action.php';
Xem bài require trong PHP nếu chưa biết hàm này.
2. Filter WordPress là gì?
Trong WordPress filter thì các hook được ví như là một bộ lọc vì các hook này liên quan đến xử lý nội dung dữ liệu. WordPres có rất nhiều loại filter và bạn có thể xem tại đây.
Đặc điểm chung của filter này là mỗi hook sẽ trả về một nội dung nào đó, và bạn sử dụng hàm add_filter để bổ sung một hành động vào hook.
Hàm add_filter
có cấu trúc như sau:
add_filter ( $tag, $function_to_add, $priority = 10, $accepted_args = 1 )
Trong đó:
- $tag: là tên của filter hook
- $function_to_add là hàm callback muốn bổ sung vào
$tag
- $priority là mức độ ưu tiên của hàm callback, mức độ ưu tiên càng cao thì hàm callback đó sẽ được gọi trước. Giá trị mặc định là 10.
- $accepted_args là tổng số các tham số tham gia vào hàm callback và không được vượt quá tổng số của hook. Giá trị mặc định là 1
Ví dụ: Giả sử mình muốn khi in ra tiêu đề của các bài viết thì bổ sung thêm từ freetuts.net
ở đầu thì làm như sau.
Bạn mở file hook-filter.php
lên và code như sau:
// Hàm bổ sung chữ freetuts.net vào chuỗi function add_string_to_title($title) { return 'freetuts.net - ' . $title; } // Đưa hàm add_string_to_title vào hook filter the_title add_filter('the_title', 'add_string_to_title', 10, 1);
Trong đó:
- the_title là hook filter dùng để lấy tiêu đề bài viết
- add_string_to_title là tên của hàm muốn bổ sung vào hook
the_title
.
Hook the_title
sẽ truyền tiêu đề của bài viết vào hàm add_string_to_title
và thực thi nó, sau đó lấy kết quả của hàm này trả về làm tiêu đề mới.
Luồng xử lý như sau: Gả sử hàm the_title
có nội dung như sau:
function the_title() { $title = 'Nội dung lấy từ CSDL'; // Trả về return $title; }
Lúc này ta sử dụng hàm add_filter
để bổ sung hàm callback add_string_to_title
vào the_title
thì nó sẽ hoạt động dạng như sau:
function the_title() { $title = 'Nội dung lấy từ CSDL'; // Vì có bổ sung hàm callback add_string_to_title // nên lúc này ta phải duyệt title trước khi trả về $title = add_string_to_title($title); // Trả về return $title; }
Vậy thực chất khi bạn bổ sung một hành động nào đó vào filter thì tức là bạn bổ sung một đoạn code xử lý trước khi filter đó trả về quả về.
3. Action WordPress là gì?
Action hooks là danh sách các hook liên quan đến xử lý sự kiện. Ví dụ khi bạn lưu một bài viết thì ta có hook save_post, khi người dùng comment thì có hook comment_post.
Tất cả các hooks đều quan trọng vì nó giúp chúng ta can thiệp vào hệ thống core mà không cần phải phá source của WordPress. Ví dụ bạn muốn khi người dùng bình luận thì gửi email thông báo thì bạn sẽ viết một hàm gửi mail và đưa nó vào hook comment_post.
Ta sử dụng hàm add_action
để bổ sung hành động vào Action Hook. Hàm này có các tham số như sau:
add_action ($tag, $function_to_add, $priority = 10, $accepted_args = 1 )
Trong đó:
- $tag: là tên của filter hook
- $function_to_add là hàm callback muốn bổ sung vào
$tag
- $priority là mức độ ưu tiên của hàm callback, mức độ ưu tiên càng cao thì hàm callback đó sẽ được gọi trước. Giá trị mặc định là 10.
- $accepted_args là tổng số các tham số tham gia vào hàm callback và không được vượt quá tổng số của hook. Giá trị mặc định là 1
Ví du: Khi lưu bài viết nếu bài viết ở trạng thái public thì hãy gửi email đến cho admin
Action hook lưu bài viết là save_post
, hook này có ba tham số truyền vào đó là:
- $id: id bài viết đang lưu hoặc mới thêm
- $post: toàn bộ nội dung như title, content của bài viết
- $is_update: nếu TRUE tức hành động save post này là hành động update, ngược lại là hành động insert.
Ok bây giờ bạn mở file hook-action.php
lên và code như sau:
function send_email_public($id, $post) { if ($post->post_status == 'public'){ // Thực hiện gửi email // Vì là ví dụ nên mình không code gửi email } } // Đưa hàm add_string_to_title vào hook filter the_title add_action('save_post', 'send_email_public', 11, 2);
Quá đơn giản phải không các bạn :)
4. Lời kết
Tóm lại, qua bài này bạn đã học được những kiến thức như sau:
- Hook WordPress chính là những điểm móc nằm trong hệ thống WordPress mà qua đó ta có thể can thiệp vào mà không cần phải thay đổi core.
- Filter WordPress là những hook được dùng để xử lý nội dung dữ liệu trong WordPress.
- Action WordPress là những hook được dùng để xử lý hành động trong WordPress.
Bài này tương đối khó hiểu, vì đây chính là nội dung trọng tâm và quan trọng nhất mà ban phải biết khi lập trình WordPress. Bạn phải hiểu nguyên lý hoạt động của nó thì sau này mới xây dựng được plugin và theme theo ý mình được.