1. Hiểu đúng về Action và Filter
- Action: là “điểm móc” (hook point) cho phép bạn chèn hành động vào một thời điểm cụ thể trong luồng chạy.
- Filter: là “điểm can thiệp” để thay đổi dữ liệu trước khi nó được sử dụng hoặc hiển thị.
Ví dụ:
// Action: in thêm HTML sau nội dung bài viết
add_action('the_content', 'append_notice');
function append_notice($content) {
return $content . '<p>Cảm ơn bạn đã đọc!</p>';
}
Ở đây the_content là một filter hook – vì bạn đang thay đổi giá trị của $content – nhưng lại gọi bằng add_action, vẫn hoạt động được. Nhưng… không phải cách nên làm.
2. Sự khác biệt giữa do_action và apply_filters
Đây là hai hàm lõi tạo nên toàn bộ hệ thống hook:
do_action('hook_name', $param1, $param2, ...);
apply_filters('hook_name', $value, $param1, $param2, ...);
do_action() dùng để chạy các hàm không cần return.
apply_filters() dùng để truyền qua các hàm xử lý rồi trả kết quả về.
Ví dụ: bạn muốn cho phép người khác sửa nội dung nút:
$label = apply_filters('init_button_label', 'Gửi bình luận');
Ai đó có thể sửa như sau:
add_filter('init_button_label', function($label) {
return 'Send it!';
});
3. Ưu tiên và số lượng tham số
Mỗi hook đều có thể được gắn nhiều lần. WordPress sẽ gọi theo thứ tự ưu tiên (mặc định là 10):
add_action('init', 'do_this_first', 5);
add_action('init', 'do_this_normal'); // Ưu tiên mặc định = 10
add_action('init', 'do_this_later', 20);
Nếu hook có nhiều tham số truyền vào, bạn phải khai báo đúng:
add_filter('the_title', 'my_title', 10, 2);
function my_title($title, $id) {
if ($id === 42) return 'Tiêu đề đặc biệt';
return $title;
}
4. Tự tạo hook trong plugin
Nếu bạn viết plugin, việc tạo hook giúp người khác mở rộng plugin dễ dàng:
do_action('initfx_effect_before_run', $effect_name);
Ai đó có thể hook vào:
add_action('initfx_effect_before_run', function($effect) {
if ($effect === 'fireworks') {
// Ghi log, thay đổi hiệu ứng...
}
});
5. Gỡ hook bằng remove_action và remove_filter
Không phải lúc nào bạn cũng muốn hook nào đó hoạt động. Để gỡ, cần phải biết tên hàm và ưu tiên:
remove_action('init', 'default_function', 10);
Nếu hàm là ẩn danh hoặc closure, không thể remove được – vì không có tên hàm để đối chiếu.
6. Hook trong class – cẩn thận khi gán
Nếu viết hook trong class, bạn cần truyền đúng instance:
class MyPlugin {
public function __construct() {
add_action('init', [$this, 'run']);
}
public function run() {
// ...
}
}
Nếu bạn remove sau này, phải truyền đúng instance đó:
$plugin = new MyPlugin();
remove_action('init', [$plugin, 'run']);
Kết luận
Hook là nền tảng mở rộng của WordPress. Nhưng muốn dùng đúng – bạn phải hiểu sâu hơn mức chỉ “add_action là móc sự kiện, add_filter là thay dữ liệu”.
Hãy bắt đầu viết plugin với các hook riêng của bạn. Đừng ngại tạo thêm 1 dòng do_action hoặc apply_filters – vì đó là cách bạn mở cánh cửa cho người khác kết nối vào plugin của mình.
Bình luận