Hướng dẫn add_filter 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.

Filter Hook là gì?

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.

Cách sử dụng Filter Hook

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):


            $copyright = ‘Design by ThachPham’;
        echo apply_filters( ‘thachpham_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 đó thachpham_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 thachpham_change_copyright( $output ) {
    $output = ‘Design by WordPress’;
    return $output;
}
add_filter( ‘thachpham_copyright’, ‘thachpham_change_copyright’ );

Bây giờ bạn thấy, cái dòng Design by ThachPham đã đượ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.

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

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.

the_content

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 thachpham_content_filter( $content ) {
    $find = ‘hello’;
    $replacement = "hello";
    $content = str_replace( $find, $replacement, $content );
    return $content;
}
add_filter( ‘the_content’, ‘thachpham_content_filter’ );

wp_handle_upload_prefilter

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.


add_filter(‘wp_handle_upload_prefilter’, ‘custom_upload_filter’ );

function custom_upload_filter( $file ){
    $file[‘name’] = ‘wordpress-is-awesome-‘ . $file[‘name’];
    return $file;
}

?>

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, 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.

Thạch Phạm

Bé Thạch 18 tuổi, hiện công tác tại AZDIGI với vị trí giữ xe và viết thuê tại ThachPham.Com. Sở thích nghiên cứu về website, DevOps, SysAdmin và xăm mình nữa. Phương châm sống của bé là "No Pain, No Gain".

Hiện tại blog tạm đóng bình luận vì mình cần tập trung thời gian vào cập nhật bài viết. Bình luận sẽ mở ra cho đến khi mình sẵn sàng.

Trong bài hôm nay, các bạn sẽ có cái nhìn tổng quát về hệ thống hooks trong wordpress. WordPress được xây dựng từ một thư viện Hooks khổng lồ, hầu như trong khi thiết kế wordpress bạn cũng phải sử dụng đến hook. Hooks được hiểu là các hàm (function), dùng để nhóm các hàm lại. ví dụ đơn giản: để giải quyết một vấn đề bạn có thể chia tách làm nhiều hàm và kết hợp gọi chúng, nhằm thiết kế cấu trúc này wordpress đã xây dựng ra khai niệm hooks để liên kết 1 hook với nhiều function.

Có 2 loại hooks là action và filter. Tất cả các hooks được tạo ra thì lưu ở biến toàn cục $wp_filter có kiểu mảng mà keys củ nó là tên hook (action và filter).

Hướng dẫn add_filter trong wordpress

Filters

Hệ thống Filter bao gồm các hàm của wordpress và của bạn tạo thêm. Khác với action, filter có thể trả về giá trị.
Để đăng ký một filter bạn sử dụng hàm add_filter:

add_filter( $tag, $function_to_add, $priority, $accepted_args );

Trong đó:

  • $tag: tên filter
  • $function_to_add: tên hàm của filter, nó được gọi khi sử dụng.
  • $priority: một filter có thể chứa nhiều hàm, chỉ định thứ tự hàm này được gọi

Gọi filter và truyền tham số cho nó. WordPress có filter img_caption_shortcode dùng để tạo caption image, đoạn code sau đây ta truyền 3 tham số vào filter img_caption_shortcode.

// Allow plugins/themes to override the default caption template.
$output = apply_filters('img_caption_shortcode', '', $attr, $content);
if ( $output != '' )
	return $output;

Tạo nhiều hàm sử lý cho 1 filter.

add_filter('myfilter','myfun1',3);
add_filter('myfilter','myfun2',1);
add_filter('myfilter','myfun3',2);
function myfun1(){
}
function myfun2(){
}
function myfun3(){}

Khi gọi myfilter thì gọi 3 hàm trên của filter theo thứ tự: myfun2,myfun3,myfun2.

apply_filters('myfiter');

Các ví dụ khác về sử dụng filters:

Custom dynamic sidebar, tạo hàm riêng thay vì sử dụng hàm lấy sidebar dynamic_sidebar.

function mytheme_sidebar($name)
{
     $name = apply_filters('mytheme_sidebar', $name);
     get_sidebar($name);
}
//Then use your own filter to modify the sidebar
add_filter('mytheme_sidebar', 'mytheme_custom_sidebar');
function mytheme_custom_sidebar($name)
{
    return is_user_logged_in() ? 'loggedin' : $name;
}

Lưu ý: tất cả các tên hooks cần phải được viết thường mới hoạt động chính xác.

Liên kết action với hàm bạn sử dụng add_action(). Cũng giống như filter 1 action có thể liên kết với nhiều hàm, và tất cả các hàm của action được gọi khi bạn gọi do_action(‘your-action-name’)

Ví dụ sau tạo custom action, chèn đoạn sau vào functions.php

/* a custom action hook */

/*
 * 1. Create your own custom action hook named 'the_action_hook'
 *    with just a line of code. Yes, it's that simple.
 *    
 *    The first argument to add_action() is your action hook name
 *    and the second argument is the name of the function that actually gets
 *    executed (that's 'callback function' in geek).
 *
 *    In this case you create an action hook named 'the_action_hook'
 *    and the callback function is 'the_action_callback'.
 */

add_action('the_action_hook', 'the_action_callback');

/*
 * 2. Declare the callback function. It prints a sentence.
 *    Note that there is no return value.
 */

function the_action_callback()
{
echo '

WordPress is nice!

'; } /* * 3. When you call do_action() with your action hook name * as the argument, all functions hooked to it with add_action() * (see step 1. above) get are executed - in this case there is * only one, the_action_callback(), but you can attach as many functions * to your hook as you like. * * In this step we wrap our do_action() in yet another * function, the_action(). You can actually skip this step and just * call do_action() from your code. */ function the_action() { do_action('the_action_hook'); }

Đến đây bạn đã hiểu về cách hoạt động và sử dụng hooks trong wordpress rồi chứ. Chúc các bạn học tập tốt.

Nếu bạn thấy bài viết này hữu ích, hãy chia sẻ với bạn bè bằng cách nhấn nút chia sẻ ở bên dưới. Theo dõi chúng tôi trên Twitter và Facebook