Hooks (Filters và Actions) là một bước quan trọng để tùy chỉnh và mở rộng WordPress. Dưới đây là hướng dẫn chi tiết về Filters và Actions trong WordPress, kèm theo ví dụ cụ thể:
1. Khái niệm cơ bản về Hooks
Hooks trong WordPress cho phép bạn “chèn” vào các điểm cụ thể trong quá trình xử lý của WordPress để thực hiện các hành động tùy chỉnh hoặc sửa đổi dữ liệu. Có hai loại Hooks chính:
- Actions (Hành động): Cho phép bạn thực hiện một hành động nào đó tại một thời điểm cụ thể trong quá trình xử lý của WordPress. Ví dụ: gửi email khi một bài viết được xuất bản, thêm một meta box vào trang chỉnh sửa bài viết.
- Filters (Bộ lọc): Cho phép bạn sửa đổi dữ liệu tại một thời điểm cụ thể trong quá trình xử lý của WordPress. Ví dụ: thay đổi tiêu đề bài viết trước khi hiển thị, lọc nội dung bài viết.
2. Actions (Hành động)
2.1. Cách sử dụng add_action()
Để “chèn” một hàm của bạn vào một Action Hook, bạn sử dụng hàm add_action()
:
add_action( 'hook_name', 'your_function_name', [priority], [accepted_args] );
hook_name'
: Tên của Action Hook mà bạn muốn chèn vào. WordPress cung cấp rất nhiều Action Hooks khác nhau tại các thời điểm khác nhau trong quá trình xử lý (ví dụ:init
,wp_head
,wp_footer
,save_post
,publish_post
).'your_function_name'
: Tên của hàm PHP mà bạn muốn thực thi khi Action Hook này được gọi.[priority]
(tùy chọn): Một số nguyên chỉ định thứ tự ưu tiên thực thi của hàm. Giá trị thấp hơn có nghĩa là hàm sẽ được thực thi sớm hơn. Giá trị mặc định là10
.[accepted_args]
(tùy chọn): Số lượng tham số mà hàm của bạn chấp nhận. WordPress sẽ truyền các tham số tương ứng khi Action Hook được gọi. Giá trị mặc định là1
.
2.2. Ví dụ về Action
Giả sử bạn muốn thêm một đoạn mã HTML vào phần <footer>
của trang web. Bạn có thể sử dụng Action Hook wp_footer
:
Trong file functions.php
của theme hoặc một plugin tùy chỉnh:
function my_custom_footer_message() {
echo '<div style="text-align: center; padding: 10px; background-color: #f0f0f0;">';
echo 'Đây là thông báo tùy chỉnh ở footer!';
echo '</div>';
}
add_action( 'wp_footer', 'my_custom_footer_message' );
Khi WordPress xử lý và đến phần wp_footer
, hàm my_custom_footer_message()
sẽ được gọi và đoạn HTML sẽ được hiển thị trong footer của trang web.
2.3. Các Action Hook phổ biến
init
: Được kích hoạt sau khi WordPress đã tải các file cốt lõi, plugin và theme, nhưng trước khi bất kỳ nội dung nào được gửi đến trình duyệt. Thường được sử dụng để đăng ký post type tùy chỉnh, taxonomy tùy chỉnh, và các hành động khởi tạo khác.wp_head
: Được kích hoạt trong phần<head>
của tài liệu HTML. Thường được sử dụng để thêm các script, style, hoặc meta tag tùy chỉnh.wp_footer
: Được kích hoạt ngay trước thẻ</body>
của tài liệu HTML. Thường được sử dụng để thêm các script hoặc nội dung tùy chỉnh ở cuối trang.admin_init
: Tương tự nhưinit
nhưng chỉ kích hoạt trong trang quản trị WordPress.admin_menu
: Được sử dụng để thêm các mục menu tùy chỉnh vào trang quản trị.save_post
: Được kích hoạt khi một bài viết (bao gồm post, page, custom post type) được lưu hoặc cập nhật.publish_post
: Được kích hoạt khi một bài viết được chuyển sang trạng thái “Đã xuất bản”.wp_enqueue_scripts
: Được sử dụng để đăng ký và tải các file CSS và JavaScript cho frontend.admin_enqueue_scripts
: Tương tự nhưwp_enqueue_scripts
nhưng dành cho trang quản trị.
3. Filters (Bộ lọc)
3.1. Cách sử dụng add_filter()
Để “chèn” một hàm của bạn vào một Filter Hook và sửa đổi dữ liệu, bạn sử dụng hàm add_filter()
:
add_filter( 'hook_name', 'your_filter_function_name', [priority], [accepted_args] );
'hook_name'
: Tên của Filter Hook mà bạn muốn chèn vào. WordPress cung cấp nhiều Filter Hooks khác nhau để lọc dữ liệu tại các thời điểm khác nhau (ví dụ:the_title
,the_content
,wp_mail
,pre_get_posts
).'your_filter_function_name'
: Tên của hàm PHP mà bạn muốn thực thi để sửa đổi dữ liệu. Hàm này phải trả về dữ liệu đã được lọc.[priority]
(tùy chọn): Tương tự như trongadd_action()
, chỉ định thứ tự ưu tiên thực thi của hàm.[accepted_args]
(tùy chọn): Số lượng tham số mà hàm của bạn chấp nhận. WordPress sẽ truyền các tham số tương ứng (dữ liệu cần lọc) khi Filter Hook được gọi.
3.2. Ví dụ về Filter
Giả sử bạn muốn thêm tiền tố “Đã lọc: ” vào tiêu đề của tất cả các bài viết hiển thị trên trang web. Bạn có thể sử dụng Filter Hook the_title
:
Trong file functions.php
của theme hoặc một plugin tùy chỉnh:
function my_prefix_post_title( $title ) {
return 'Đã lọc: ' . $title;
}
add_filter( 'the_title', 'my_prefix_post_title' );
Khi WordPress chuẩn bị hiển thị tiêu đề của một bài viết, Filter Hook the_title
sẽ được gọi, hàm my_prefix_post_title()
sẽ nhận giá trị tiêu đề hiện tại ($title
) và trả về tiêu đề đã được thêm tiền tố.
3.3. Các Filter Hook phổ biến
the_title
: Lọc tiêu đề của bài viết trước khi hiển thị.the_content
: Lọc nội dung của bài viết trước khi hiển thị.the_excerpt
: Lọc đoạn trích của bài viết trước khi hiển thị.wp_mail
: Lọc các tham số của email trước khi nó được gửi đi (ví dụ: tiêu đề, nội dung, người nhận).pre_get_posts
: Một filter mạnh mẽ cho phép bạn sửa đổi đối tượng$wp_query
trước khi nó thực hiện truy vấn cơ sở dữ liệu để lấy các bài viết. Thường được sử dụng để thay đổi số lượng bài viết hiển thị, sắp xếp, hoặc lọc các bài viết dựa trên các tiêu chí tùy chỉnh.widget_title
: Lọc tiêu đề của widget trước khi hiển thị.login_redirect
: Lọc URL chuyển hướng sau khi người dùng đăng nhập thành công.
4. Gỡ bỏ Hooks
Đôi khi bạn cần gỡ bỏ một Hook đã được thêm trước đó. Bạn có thể sử dụng các hàm sau:
remove_action( 'hook_name', 'function_to_remove', [priority] )
: Gỡ bỏ một Action Hook. Cần cung cấp tên Hook, tên hàm đã được thêm và tùy chọn là độ ưu tiên nếu nó khác với mặc định.remove_filter( 'hook_name', 'function_to_remove', [priority] )
: Gỡ bỏ một Filter Hook. Tương tự nhưremove_action()
.remove_all_actions( 'hook_name', [priority] )
: Gỡ bỏ tất cả các hàm đã được chèn vào một Action Hook cụ thể.remove_all_filters( 'hook_name', [priority] )
: Gỡ bỏ tất cả các hàm đã được chèn vào một Filter Hook cụ thể.
5. Tìm kiếm Hooks
WordPress có rất nhiều Hooks, và việc tìm kiếm Hook phù hợp có thể hơi khó khăn lúc đầu. Dưới đây là một số cách bạn có thể tìm kiếm Hooks:
- Xem mã nguồn WordPress: Cách chính xác nhất là xem trực tiếp mã nguồn của WordPress. Các hàm
do_action()
được sử dụng để gọi Action Hooks vàapply_filters()
được sử dụng để gọi Filter Hooks. Bạn có thể tìm kiếm các hàm này trong các file core, theme, hoặc plugin. - Sử dụng tài liệu WordPress Developer: Trang web WordPress Developer có tài liệu chi tiết về nhiều Hooks.
- Sử dụng plugin hỗ trợ: Có một số plugin của bên thứ ba có thể giúp bạn liệt kê các Hooks đang được sử dụng trên trang web của bạn.
- Tìm kiếm trực tuyến: Sử dụng các công cụ tìm kiếm với các từ khóa liên quan đến hành động hoặc dữ liệu bạn muốn sửa đổi trong WordPress.
6. Thực hành và thử nghiệm
Cách tốt nhất để học về Filters và Actions là thực hành và thử nghiệm. Hãy bắt đầu với những ví dụ đơn giản và dần dần thử nghiệm với các Hooks phức tạp hơn. Đừng ngại mắc lỗi, vì đó là một phần của quá trình học tập.
Lưu ý quan trọng:
- Luôn đặt code tùy chỉnh của bạn trong file
functions.php
của theme con (child theme) hoặc trong một plugin tùy chỉnh. Tránh sửa đổi trực tiếp các file của theme cha hoặc plugin, vì những thay đổi này sẽ bị mất khi bạn cập nhật theme hoặc plugin. - Hiểu rõ mục đích và thời điểm kích hoạt của mỗi Hook trước khi sử dụng.
- Kiểm tra kỹ lưỡng code của bạn sau khi thêm hoặc sửa đổi Hooks để đảm bảo không gây ra lỗi cho trang web.
Chúc bạn thành công trên hành trình khám phá sức mạnh của Filters và Actions trong WordPress!