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_action
add_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.php
hook-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à
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 🙂

Nguồn: freetuts.net

Leave a Reply

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