Bài 02: Hooks là gì? Action và Filter trong WordPress

Bạn đã từng nghe khái niệm lập trình hướng sự kiện trong các Framework như Zend, Laravel, Phalcon? Hay thậm chí trong Javascript cũng có khái niệm về lập trình sự kiện. Vậy thì trong WordPress có tồn tại khái niệm này không? Để trả lời câu hỏi này thì trong bài này chúng ta sẽ tìm hiểu về Hooks trong WordPress nhé.

1. Hooks là gì?

Hooks có thể được coi là danh sách các điểm đặc biệt trong hệ thống WordPress mà ở đó bạn có thể bổ sung các đoạn code thông qua hai hàm add_actionadd_filter mà WordPress đã cung cấp sẵn. Chúng ta có hai nhóm hooks chính đó là Filter và Action.

  • Filter: Là các điểm liên quan đến xử lý lấy nội dung
  • Action: Là các điểm liên quan đến xử lý hành động

Mỗi hook sẽ có các tham số truyền vào khác nhau nên để chắc chắn thì trước khi sử dụng một hook nào đó bạn hãy lên trang codex để tham khảo nhé. Ví dụ với hook the_title thì sẽ có hai tham số truyền vào đó là $title$id. Trường hợp trang codex không giải thích có bao nhiêu tham số thì bạn hãy tự mình debug bằng cách truyền tham số vào và kết hợp với hàm var_dump để in ra xem nội dung tham số đó là gì.

Trước khi tìm hiểu Action và Filter thì bạn tạo cho tôi hai file hook-filter.phphook-action.php nằm trong thư mục includes mà ở bài plugin là gì chúng ta xây dựng.

Tiếp theo bạn vào file wp-learn.php bổ sung hai đoạn code require hai file đó vào như sau:

require 'includes/hook-filter.php';
require 'includes/hook-action.php';

2. Filter Hooks

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

Ví dụ: Giả sử mình muốn khi in ra tiêu đề của các bài viết thì bổ sung thêm từ freetuts.net ở trước thì làm như sau.

Bạn mở file hook-filter.php lên và code như sau:

// Hàm bổ sung chữ freetuts.net vào chuỗi
function add_string_to_title($title)
{
    return 'freetuts.net - ' . $title;
}

// Đưa hàm add_string_to_title vào hook filter the_title
add_filter('the_title', 'add_string_to_title', 10, 1);

Trong đó:

  • the_title: Ta gọi là hook filter dùng để lấy tiêu đề bài viết
  • add_string_to_title: Ta gọi là hàm callback, hàm này sẽ xử lý nội dung CẦN trả về của hàm the_title trước khi nó trả về. Trong hàm add_string_to_title bạn sẽ thắc mắc biến $title ở đâu ra phải không nào :) biến này chính là tiêu đề mà hook the_title truyền vào (xem danh sách tham số của the_title). 

Luồng xử lý như sau: Gả sử hàm the_title có nội dung như sau:

function the_title()
{
    $title = 'Nội dung lấy từ CSDL';
    
    // Trả về
    return $title;
}

Lúc  này nếu ta sử dụng hàm add_filter để bổ sung hàm callback add_string_to_title vào the_title thì nó sẽ hoạt động dạng như sau:

function the_title()
{
    $title = 'Nội dung lấy từ CSDL';
    
    // Vì có bổ sung hàm callback add_string_to_title nên lúc này ta phải duyệt title trước khi trả về
    $title = add_string_to_title($title);
    
    // Trả về
    return $title;
}

Vậy thực chất khi bạn bổ sung một hành động nào đó vào filter thì tức là bạn bổ sung một đoạn code xử lý trước khi filter đó trả về quả về.

3. Action Hooks

Action hooks là danh sách các hook liên quan đến xử lý sự kiện. Ví dụ khi bạn lưu một bài viết thì ta có hook save_post, khi người dùng comment thì có hook comment_post.

Tất cả các hooks đều quan trọng vì nó giúp chúng ta xâm nhập vào hệ thống core mà không cần phải phá source của WordPress. Ví dụ bạn muốn khi người dùng bình luận thì gửi email thông báo thì bạn sẽ viết một hàm gửi mail và đưa nó vào hook comment_post.

Ta sử dụng hàm add_action để bổ sung hành động vào Action Hook. Hàm này có các tham số như sau:

add_action ($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

Ví du: Khi lưu bài viết nếu bài viết ở trạng thái public thì hãy gửi email đến cho admin

Action hook lưu bài viết là save_post, hook này có ba tham số truyền vào đó là:

  • $id: id bài viết đang lưu hoặc mới thêm
  • $post: toàn bộ nội dung như title, content của bài viết
  • $is_update: nếu TRUE tức hành động save post này là hành động update, ngược lại là hành động insert.

Ok bây giờ bạn mở file hook-action.php lên và code như sau:

// Hàm bổ sung chữ freetuts.net vào chuỗi
function send_email_public($id, $post)
{
    if ($post->post_status == 'public'){
        // Thực hiện gửi email
        // Vì là ví dụ nên mình không gửi email
    }
}

// Đưa hàm add_string_to_title vào hook filter the_title
add_action('save_post', 'send_email_public', 11, 2);

Quá đơn giản phải không các bạn :)

4. Lời kết

Bài này tương đối khó hiểu vì đây chính là nội dung trọng tâm và quan trọng nhất mà ban phải biết khi lập trình WordPress, vì vậy bạn phải hiểu nguyên lý hoạt động của nó thì sau này bạn mới có thể code những website có tính sáng tạo được.

Qua bài này mình đã giải thích khái niệm Hooks là gì và hai nhóm hooks trong WordPress đó là Action và Filter, hy các ví dụ kèm với các lời giải thích sẽ giúp bạn mở rộng kiến thức của mình và từ đó ngày càng yêu mến WordPress :)

Hãy để lại link bài viết gốc khi chia sẻ bài viết này, mình sẽ report DMCA với những website lấy nội dung mà không để nguồn hoặc copy bài với số lượng lớn.

Nguồn: freetuts.net

Profile photo of adminTheHalfHeart

TheHalfHeart

Có sở thích viết tuts nên đã từng tham gia viết ở một số diễn đàn, đến năm 2014 mới có điều kiện sáng lập ra freetuts.net. Sinh năm 90 và có 1 vợ 2 con, thích ca hát và lập trình.

ĐĂNG BÌNH LUẬN: Đăng câu hỏi trên Group Facebook để được hỗ trợ nhanh nhất.