Làm chủ Action Hook & Filter trong WordPress (Không chỉ là add_action)

Action hook và filter là hai cơ chế cực kỳ quan trọng trong WordPress — đến mức nếu không hiểu rõ, bạn gần như không thể viết plugin hoặc theme đúng cách. Nhưng thực tế, phần lớn hướng dẫn chỉ dừng ở mức add_actionadd_filter cơ bản. Bài viết này sẽ đi sâu hơn, giúp bạn hiểu bản chất, và biết cách tạo, gọi và gỡ hook như một developer thật sự.

Làm chủ Action Hook & Filter trong WordPress (Không chỉ là add_action)

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


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...