Cách sử dụng Filter Hook trong WordPress

Ở phần trước chúng ta đã tìm hiểu qua một loại hook thông dụng trong WordPress là Action Hook. Nhưng bên cạnh Action Hook, chúng ta còn một loại hook nữa cũng sử dụng rất thường xuyên và đóng vai trò quan trọng không kém khi lập trình trong WordPress, đó là Filter Hook.

1. Filter Hook là gì?

Filter hooks được ví như một bộ lọc trong WordPress vì các hook này liên quan đến xử lý lấy nội dung. Hiện nay có rất nhiều loại filter và bạn có thể xem tại đây. Đặc điểm chung của loại này là mỗi hook sẽ trả về một nội dung nào đó, và bạn sử dụng hàm add_filter để bổ sung dữ liệu vào nội dung trả về đó.

Hàm add_filter có cấu trúc như sau:

add_filter ( $tag, $function_to_add, $priority = 10, $accepted_args = 1 )

Trong đó:

  • $tag: là tên của filter hook
  • $function_to_add là hàm callback muốn bổ sung vào $tag
  • $priority là mức độ ưu tiên của hàm callback, mức độ ưu tiên càng cao thì hàm callback đó sẽ được gọi trước. Giá trị mặc định là 10.
  • $accepted_args là tổng số các tham số tham gia vào hàm callback và không được vượt quá tổng số của hook. Giá trị mặc định là 1

2. Làm việc với filter

Để tạo và thực hiện một filter là cực kì đơn giản, các bạn chỉ cần gọi bằng hàm apply_filters là có thể mở một filter với một tên bạn định sẵn, các framwork và các plugin lớn đều mở các filter để plugin khác có thể cấu hình hoặc thay đổi kết quả cho nó.

Ví dụ, ở trên giao diện của HIHIWEB có hỗ trợ filter tên là after_title, tôi làm như sau:

echo apply_filters( 'after_title', '' );

Như vậy, tôi đặt code trên ở ngay dưới tựa đề để mở một filter tên là after_title với nội dung trống, nhằm giúp các plugin khác của HIHIWEB có thể hook vào đó mà hiển thị theo cách của mình.

Ví dụ với filter vừa mở, plugin có thể hiển thị chữ PHÚC ngay dưới tựa đề, ta làm như sau trong plugin:

function echo_phuc_to_theme( $data ) {
echo 'PHUC';
}
add_filter('after_title', 'echo_a_to_theme');

Một số ví dụ Filter Hook trong WordPress

Ở trên là cách đơn giản nhất để mở một filter, trường hợp thứ hai là các bạn muốn filter đó có chứa nội dung, tôi lấy ví dụ ngay cái filter của WordPress:

function the_title() {
	global $post;
	echo apply_filter( 'the_title', $post->post_title );
}

Như vậy, khi hook vào các bạn có thể chỉnh sửa lại tựa đề trong plugin như sau:

function edit_title_again( $title ) {
	echo 'Tựa đề: ' . $title;
}
add_filter('the_title', 'edit_title_again');

Tuy nhiên, các bạn nên để ý, nếu chỉ có một biến trong filter, ta không cần khai báo, nhưng nếu sử dụng từ 2 biến trở lên là phải khai báo thêm trong hàm Add_filter, ta ví dụ như sau:

Trong giao diện, ta khai báo filter cho một trường hiển thị author, dạng thế này:

apply_filters('userdata', $user->name, $user->value);

Thì trong plugin, để tùy chỉnh cả $user->name và $user->value ta cần khai báo như sau trong plugin:

function change_user_data( $name, $value ) {
	return $name . $value;
}
add_filter('userdata', 'change_user_data', 99, 2);

Trong đó “99” là độ nặng, càng số bé thì càng hành động sớm, mặc định của WordPress là 10, nếu bạn để 99 thì đợi các hàm khác hook vào Filter trên trả về kết quả rồi tới lượt nó mới hành động, càng số to càng muộn ! Số “2” để khai báo ta sẽ sử dụng 2 giá trị trong hàm change_user_data, nếu không mặc định của nó sẽ là 1, nghĩa là $value sẽ không có giá trị nào cả.

Lời kết

Cũng đơn giản phải không nào? Chỉ cần chịu khó đọc kỹ một xíu và siêng tìm đọc code trong WordPress, bạn có thể biết sử dụng một số filter có sẵn của nó rất hay để phục vụ mục đích của mình.

Leave a Reply

Your email address will not be published. Required fields are marked *

arrow