Một kỹ thuật không thể bỏ qua khi làm việc với nền tảng WordPress đó chính là Hooking. Hôm nay mình sẽ bàn luận, và phân tích một số khía cạnh về kỹ thuật hooking trong WordPress để mọi người có một cái nhìn rõ ràng hơn về lý thuyết của kỹ thuật này.

Ngay lúc này mà nói kỹ thuật hooking làm WordPress trở nên linh hoạt, dễ mở rộng, bla bla bla, thì cũng mông lung như một trò đùa. Cứ cuộn tay đọc tiếp thôi.

Trong giang hồ, cũng đã có rất nhiều bài viết hay về kỹ thuật này, và đa số là bao gồm 2 phần: giới thiệu kèm với thực hành. Một trong số đó là bài viết của Thach Pham. Ở đây mình không bàn về thực hành, mà sẽ đi sâu phân tích về lý thuyết và so sánh.

Hooking trong WordPress?

Hooking cơ bản nghĩa là nhét một thứ bất kì của chúng ta vào cơ thể của vật thể khác. Nói cách khác, vật thể ấy bị thay đổi mà không hề biết nó đã bị thay đổi và bổ sung. Ví dụ như: ứng dụng unikey đã nhét hành động sửa đổi dấu tiếng việt vào trong quá trình gõ bàn phím. Cơ bản là vậy, nhưng trong hoàn cảnh cụ thể thì nó biến hoá khái niệm đi một chút.

Trong hoàn cảnh của WordPress, hooking cho phép chúng ta gửi gắm hành động vào trong quá trình hoạt động của WordPress. Cũng có thể nói, sử dụng hooking chúng ta sẽ điều khiển được nhiều quá trình hoạt động trong WordPress core mà không cần chạm đến code của nó.

Quá trình WordPress tải trang?

Trước khi bàn luận về cách hooking hoạt động trong WordPress, mình điểm sơ qua về cách WordPress làm việc khi có 1 request từ user.

wordpress_load

Thông thường khi làm việc với WordPress, chúng ta thường làm việc trên 2 cục màu xanh phía trên, plugin và theme. Hay có thể nói, WordPress cung cấp 2 hình thức để tuỳ biến, chỉnh sửa hồn xác của website, đó là Plugin và Theme. Bằng cách tạo ra các plugin hoặc theme chúng ta có thể tạo ra 1 website theo như ý muốn.

Quay trở lại việc tải trang, khi user truy cập một trang web (web page), index.php sẽ được tải trước. Tại đây, wordpress sẽ làm mọi thủ tục để chuẩn bị cho quá trình tải plugin và theme. Tiếp theo, wordpress mở và thực thực thi các đoạn code trong plugin, và rồi đến theme. Ở bước cuối cùng, load template, wordpress hoà trộn hồn xác (data + template) để dựng lên một trang web hoàn chỉnh trả về cho user.

Hooking hoạt động ra sao?

Có 2 khái niệm tạo nên kỹ thuật hooking: Đăng ký hook (register_action), và Thực thi hook (do_action).

Hàm register_action nhận vào 2 tham số: hook_namefunction. Ý nghĩa của việc đăng ký hook là, báo cho wordpress biết, khi hook được thực thi, thì nhớ gọi kèm thêm các hàm mà đã được đăng kí cùng với hook đó.

Hàm do_action nhận 1 tham số: hook_name. Về nghĩa đen, do_action sẽ thực thi các hàm được gắn với hook (các hook phân biệt nhau bằng hook name). Về ý nghĩa thực sự, trong quá trình lập trình, chúng ta mong muốn một phần nào đó trong plugin/theme của chúng ta được mở rộng bởi một plugin khác, hay nói cách khác, khi ta muốn trao cơ hội mở rộng/can thiệp vào code của chúng ta cho một lập trình viên khác (hoặc có thể cho chính chúng ta trong tương lai) THÌ ta nghĩ tới cơ chế hook và cần phải gọi hàm do_action ở đâu đó trong code của chúng ta (cụ thể ở đâu mình sẽ nói tiếp sau đây). Và khi đó, tham số hook_name sẽ do chính chúng ta quy định, các lập trình viên khác muốn mở rộng code của chúng ta thì cứ đăng kí vào hook_name ấy.

hooking_work_flow

Nếu để ý kĩ, hình trên chính là hình phóng to của hình 1. Vùng màu xanh chính là nơi làm việc của chúng ta, file functions.php. Vùng màu xám là nơi wordpress core làm việc, nó làm công chuyện load template của nó. Trong ví dụ này, chúng ta đã dùng hooking để tải thêm các thư viện javascripts của chúng ta vào thẻ head. Chúng ta hoàn toàn có thể đi đến vùng số 3 (vùng này nằm trong wordpress core) để chèn thêm một vài đoạn code giúp tải các thư viện javascripts của chúng ta, NHƯNG, chúng ta đã không làm như vậy.

Để làm rõ những gì mình nói, các bạn có thể thử đi vào vùng số 3 theo đường dẫn sau: /wp-includes/general-template.php dòng 2574. Tại đây bạn có thể thêm code của bạn để tải những thư viện javascripts mà bạn cần. Bạn sẽ thấy cách này vẫn làm việc. NHƯNG đi vào vùng wordpress core để sửa mã nguồn không phải là ý tưởng hay và không bao giờ là ý tưởng hay : )). Điều này hiển nhiên như bố nằm với mẹ ý nhỉ : )) !!!. Sử dụng kỹ thuật hooking, giống như hình ở trên, chính là tuân thủ nguyên tắc lập trình huyền thoại Open/Closed Principal!

Lợi ích sử dụng Hooking

Rõ ràng sử dụng Hooking trong WordPress làm cho mã nguồn của chúng ta dễ dàng được mở rộng phát triển trong tương lai, tránh được thao tác chỉnh sửa thay đổi code của những chức năng đã và đang hoạt động.

Kết luận

Có thể nói Hooking là một trong những điểm mạnh của WordPress và nó khá tương đồng với khái niệm Middleware trong ExpressJS (nodejs). Thành thạo kỹ thuật này có thể giúp nâng cao tâm pháp, linh hoạt uyển chuyển tuỳ biến trong quá trình coding.