Ở 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.
Filter Hook nghĩa là một điểm neo được khai báo trong mã nguồn WordPress, plugin hoặc theme để chúng ta có thể sửa lại kịch bản PHP tại nơi mà điểm neo đó đã được khai báo.
Filter Hook được khai báo bằng hàm apply_filters() như thế này (có thể đặt thử vào template footer.php):
<?php $copyright = 'Design by cddos'; echo apply_filters( 'cddos_copyright', $copyright ); ?>
Như bạn thấy, thay vì echo cái biến $copyright
ra thì mình sẽ cho biến này vào hàm apply_filters()
, trong đó cddos_copyright
là tên Filter Hook của mình.
Bây giờ mình muốn nó không echo cái $copyright
nữa mà sẽ là biến khác do tự đặt lại thì chúng ta không cần sửa trực tiếp vào code trên mà có thể tạo ra một hàm callback rồi sử dụng hàm add_filter()
để gọi nó. Và nhắc lại, đây không phải là template tag nên cho vào functions.php của theme hoặc plugin của bạn.
function cddos_change_copyright( $output ) { $output = 'Design by WordPress'; return $output; } add_filter( 'cddos_copyright', 'cddos_change_copyright' );
Bây giờ bạn thấy, cái dòng Design by cddos đã được thay thế thành chuỗi dữ liệu mới là Design by WordPress thông qua việc filter.
Filter này chỉ đơn giản là chúng ta khai báo tham số bất kỳ trong hàm callback, nó sẽ tự hiểu đây là hàm chứa dữ liệu, sau đó ở trong hàm chúng ta gán cho nó một giá trị mới và return
về, cuối cùng là dùng add_filter()
móc vào cái filter hook cần thay đổi.
Cũng giống như Action Hook, WordPress có một số filter hook có sẵn mà bạn có thể sử dụng. Ở đây mình sẽ nói qua một vài filter hook điển hình để bạn thực hành.
Hook này sẽ giúp chúng ta lọc lại nội dung hiển thị ra bên ngoài. Chúng ta thử áp dụng nó vào việc in đậm một từ khoá nào đó bằng việc kết hợp hàm str_replace() trong PHP nhé.
function cddos_content_filter( $content ) { $find = 'hello'; $replacement = "<strong>hello</strong>"; $content = str_replace( $find, $replacement, $content ); return $content; } add_filter( 'the_content', 'cddos_content_filter' );
Hook này sẽ được gọi ra để lọc lại tập tin upload lên Media Library của WordPress. Dựa vào hook này, bạn có thể sử dụng tham số $file để đổi tên tập tin sau khi upload lên server.
<?php add_filter('wp_handle_upload_prefilter', 'custom_upload_filter' ); function custom_upload_filter( $file ){ $file['name'] = 'wordpress-is-awesome-' . $file['name']; return $file; } ?>
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, nó cũng đơn giản giống như Action Hook thôi chứ không có gì cả. Nhưng từ cái đơn giản này, bạn có thể sẽ làm
được rất nhiều việc, từ việc sử dụng một số theme framework hay tự viết plugin cho riêng mình.