Filter Hook là gì ? Cách sử dụng filter hook trong lập trình WordPress

Ngoài cách sử dụng Action Hooks trong bài trước thì Filter Hook cũng là một kiến trúc rất hay của mã nguồn mở WordPress bởi nó giúp chúng ta xử lý code trong theme và plugin theo hướng sự kiện. Nếu các bạn chưa hiểu rõ về kiến trúc này thì hãy đọc bài đó trước nhé. Việc xử lý code theo hướng sự kiện giúp lập trình viên móc nối các sự kiện với nhau theo một flow chuẩn và các sự kiện này sẽ xảy ra liên tục theo một trình tự nhất định.

Ngoài Action Hook thì chúng ta còn có một khái niệm khác cũng không kém phần quan trọng đó chính là Filter Hook, vậy Filter Hook là gì thì chúng ta sẽ cùng nhau tìm hiểu khái niệm Filter Hook và cách sử dụng Filter Hook trong lập trình WordPress nhé.

Filter Hook là gì ?

Cũng giống như Action Hook, bản chất của Filter Hook cũng là những điểm móc để chúng ta có thể gắn các function vào điểm móc đó. Tuy nhiên khác với Action Hook, các function được móc vào các Filter Hook thay vì làm một hành động nào đó thì lại chỉ thay đổi giá trị của 1 biến được truyền vào Filter Hook đó.

Filter Hooks là gì ?

Filter Hooks là gì ?

Filter Hook xuất hiện rất nhiều trong bộ mã nguồn của WordPress, chúng ta sẽ có các Filter Hook mặc định của WordPress và các Filter Hook chúng ta có thể tự tạo ra trong theme hoặc plugin của mình. Cách sử dụng cụ thể mình sẽ hướng dẫn ở dưới đây nhé.

Có thể bạn quan tâm

Cách sử dụng Filter Hook

Làm quen với hàm add_filters() và hàm apply_filter()

Hàm apply_filters($tag, $value, $addtional_args ) : hàm này có nhiệm vụ giống như khai báo lên 1 filter hook mới và chạy tất cả các hàm callback nhận được từ các add_filters() . Nếu chúng ta xem trong source code của WP sẽ thấy hàm apply_filters() này được gọi khá nhiều. Hàm này gồm 2 tham số chính là $tag (tên hook) và $value (giá trị cần filter). Ngoài ra chúng ta có thể truyền thêm 1 số tham số vào sau $value nếu cần thiết.

Hàm add_filters($tag,$callback,$priority,$accepted_args): hàm này dùng để móc các hàm callback vào cái hook (tag) đã được khai báo bởi add_filters(). Gồm 4 tham số $tag (tên hook muốn sửa giá trị – bắt buộc), $callback (tên hàm thực hiện sửa giá trị – bắc buộc), $priority (thứ tự – không bắt buộc), accepted_args (số lượng tham số sẽ nhận vào hàm callback – không bắt buộc).

// khai báo hàm callback
function example_callback( $string, $arg1, $arg2 ) {
    // thực hiện các biểu thức thay đôi giá trị của $string
    // $arg1 $arg2 là các tham số bổ sung nhận được từ việc gọi hàm apply_filters
    return $string;
}
// móc callback vào filter với thứ tự ưu tiên là 10 và chấp nhận 3 tham số trong hàm callback
add_filter( 'example_filter', 'example_callback', 10, 3 );

Tạo filter hook  mới trong theme

Lật lại một chút về khái niệm, mục đích sử dụng filter hook là giúp chúng ta thay đổi giá trị của 1 biến nào đó mà không cần mở lại file gốc chứa biến đó. Hãy hình dung chúng ta chỉ cần nhớ được tên của filter hook thì dù chúng ta đang code ở chỗ nào trong theme chúng ta cũng có thể thay đổi giá trị của biến được gắn vào filter hoook đó.

Cụ thể trong file footer.php mình tạo 1 filter hook và gắn giá trị của biến $copyright vào filter hook đó. Như các bạn thấy, thay vì mình in thẳng giá trị của $copyright ra thì mình lại dùng filter hook bằng cách dùng echo apply_filter(‘copyright_footer’,$copyright).

$copyright = "Tôi là Huy";
echo apply_filters('footer_copyright',$copyright);

Ok, vậy là việc tạo filter hook đã xong. Và tiếp theo mình sẽ chỉ cho các bạn thấy làm sao để thay đổi được giá trị của biến $copyright kia nhé. Bây giờ chúng ta sẽ móc 1 function vào filter hook có tên là copyright_footer mà chúng ta đã tạo ở footer.php

Hàm móc này thường được gọi ở file functions.php hoặc bất cứ file nào mà bạn tạo ra trong theme tuy nhiên những file này phải được include vào file functions.php thì code mới chạy nhé =))

function modify_copyright_footer( $copyright ) {
    // $copyright lúc này đang có giá trị là Tôi là Huy, và giờ mình sẽ thực hiện thay đổi giá trị này
    $copyright = "Tôi là Quân";
    // Giá trị đã được thay đổi, trả về giá trị mới, như vậy bất cứ chỗ nào chúng ta gọi hàm apply_filters cho tag copyright_footer thì giá trị mới sẽ được in ra.
    return $copyright;
}
// thực hiện móc vào hook
add_filters('copyright_footer','modify_copyright_footer');

Ngày lúc sau khi update lại code , các bạn reload lại trang sẽ thấy đoạn text ở chân trang nhận giá trị mới.

Như vậy, để thay đổi giá trị của một filter hook nào đó chúng ta cần gọi hàm add_filter() với 2 tham số: tên filter hook và 1 hàm callback. Hàm callback này luôn có tham số , tham số này chính là biến được truyền vào từ hàm apply_filter(), và hàm callback luôn phải return về 1 giá trị (đây chính là giá trị mới của biến $copyright trong ví dụ trên).

Thay đổi giá trị của filter hook có sẵn của WordPress

Như đã đề cập ở trên, WordPress sử dụng rất nhiều filter hook trong bộ source code của nó. Tiêu biểu nhất chính là hook có tên là the_content, hook này có nhiệm vụ trả về giá trị của nội dung bài viết. Giả sử các muốn thêm 1 đoạn gạch ngang vào sau mỗi nội dung của bài viết thì chúng ta sẽ thực hiện như sau:

add_filter('the_content','add_line_to_content');
function add_line_to_content ($content) {
    return $content . "<hr>";
}

Đây là chỉ một ví dụ đơn giản nhất khi sử dụng filter hook, còn rất nhiều các Hook khác đã được WordPress định sẵn trong Core, các bạn có thể tham khảo thêm tại đây nhé. Hy vọng bài viết giúp ích được cho các bạn trong quá trình học lập trình WordPress.

 

Trả lời

Chấm điểm bài viết