Bắt chước Action Hooks của wordpress trong ứng dụng PHP của bạn

563

Action hook trong wordpress

Action Hook là những hook liên quan đến xử lý sự kiện, ví dụ bạn muốn website xử lý một cái gì đó ở phần đầu trang (header) thì bạn có thể sử dụng hook wp_head, bạn sẽ dùng hàm add_action() để thêm đoạn xử lý của bạn vào:

Trong đó:

$tag: là tên của hook (bắt buộc có) $function_to_add: là tên hàm bạn muốn bổ sung vào hook tag (bắt buộc có) priority: độ ưu tiên, giá trị mặc định là 10, hàm nào có độ ưu tiên cao hơn sẽ được thực hiện trướcaccepted_args: tổng số các tham số mà hàm function_to_add cần, không được vượt quá số tham số của hook (mặc định là 1) Ví dụ (bạn hãy thử viết đoạn code này vào file functions.php nhé):

Sau khi thực hiện đoạn code này, website của bạn trước khi load sẽ gọi hook wp_head và đoạn script bên trên sẽ được chạy, bình thường nếu theme của bạn không hỗ trợ hiển thị thì phải sử dụng một hàm do_action() để website thực hiện những action bạn đã add vào hook.

do_action(‘wp_head’); // Chèn dòng lệnh vào file header, trước tag </head> nếu theme của bạn chưa có hook này nhé.

Tất cả hệ thống hook đều quan trọng, nó giúp bạn chỉnh sửa sâu vào hệ thống WordPress mà không phá hỏng source code. Về hàm do_action(), bạn gọi nó trước hay sau hàm bạn muốn thêm vào đều được cả. Ngoài ra bạn có thể sử dụng hàm do_action() bên trên để tạo một hook riêng cho mình, ví dụ bạn muốn một hook có tên là wpguide_after_post thì bạn chỉ cần chèn đoạn code do_action(‘wpguide_after_post’) vào nơi bạn muốn rồi tiến hành add_action() như một hook bình thường.

Đấy là action hook trong wordpress, bây giờ chúng ta sẽ xây dựng cơ chế tương tự trong ứng dụng php của bạn

Ý tưởng

Một phương thức (hàm) thay vì trả về kết quả là A thì trước đó ta sẽ gán nó với 1 action method với đầu vào chính là kết A để xử lý ra kết quả B mà mình mong muốn. Ví dụ:

 

Ta sẽ có action name là ‘before_return_data’. Đây sẽ là tên của action sẽ xử lý để trả về dữ liệu thông qua hàm do_action. Bây giờ nhiệm vụ của chúng ta là phải chỉ định được hàm nào sẽ xử lý hook có tên là ‘before_return_data’ bằng cách gán

Hàm add_action sẽ có 2 tham số lần lượt là tên của action hook và hàm được chỉ định sẽ xử lý hook đó. Như vậy hiểu theo cách thông thường là trước khi trả về dữ liệu thì hàm sẽ gán nó với 1 event và đợi xem đã có hàm nào xử lý event đó chưa, nếu có rồi thì để cho hàm đó xử lý trước, còn nếu chưa có thì trả về dữ liệu được truyền vào.

Sau đây là class mình viết cho toàn bộ việc xử lý hook

Bạn để ý mình viết class với thuộc tính instance với kiểu static. Đây là Singleton class, để lấy ra thể hiện của class thì mình gọi đến Action_hooks::instance(). Vì vậy nên mọi thể hiện của class được đảm bảo là duy nhất thông qua kiểu static. Chú ý: Để gán 1 method cho 1 action, thì method đó có thể là global method hoặc method của 1 thể hiện của class. Để gán method là method của 1 thể hiện, bạn phải truyền vào function dạng mảng như sau:

hoặc