Học Wordpress

Cách sử dụng Action Hook trong WordPress

279

Bài này thuộc phần 6 của 10 phần trong serie WordPress nâng cao

Trong mã nguồn WordPress, ngoài việc nắm vững WP Query để hiểu cách nó lấy nội dung như mình đã trình bày ở phần trước thì một trong các tính năng cực kỳ quan trọng khác để bạn “giao tiếp” với mã nguồn của nó đó chính là Action Hook, trong bài này mình sẽ nói chi tiết về action hook nhiều nhất có thể.

Action Hook là gì?

Như trong bài 2 mình đã có nói qua về quy trình WordPress xử lý mỗi khi có một lượt truy cập vào. Và Action Hook chính là một điểm neo để chúng ta thực hiện một hành động gì đó tại một chu kỳ nhất định.

Ví dụ bạn muốn đoạn script của chúng ta sẽ thực thi sau khi mã nguồn đã được tải để tránh việc bị lỗi do sử dụng một số thành phần trong mã nguồn thì chúng ta sẽ móc đoạn script đó vào hook init trong WordPress.

Cách sử dụng một Action Hook

Để sử dụng Action Hook, chúng ta sẽ phải tạo ra một hàm chứa đoạn script PHP cần chạy (gọi là callback function), sau đó sử dụng hàm add_action() trong WordPress để móc cái callback của mình vào cái action hook cần cho nó móc vào. Ví dụ dưới đây là mình sẽ chạy một hàm móc vào hook init.


function thachpham_theme_setup(){
    // PHP Script here
}
add_action( ‘init’, ‘thachpham_theme_setup’ )

Và đây không phải là template tag, nên bạn sẽ chèn nó ở functions.php trong theme hoặc trong plugin của bạn.

Cấu trúc sử dụng của hàm add_action() là:

add_action( $hook, $function_to_add, $priority, $accepted_args );

Trong đó:

  • $hook (string) (bắt buộc) – Tên hook cần móc vào.
  • $function_to_add (callback) (bắt buộc) – Tên hàm cần sử dụng.
  • $priority (integer) (tuỳ chọn) – Mức độ ưu tiên của hàm này thực thi với các hàm khác nếu nó có chung một hook. Mặc định là 10, số càng nhỏ thì nó càng thực hiện sớm hơn.
  • $accepted_args (integer) (tuỳ chọn) – Số lượng tham số được sử dụng trong hàm callback. Mặc định là 1.

Action Hook được tạo ra thế nào?

Action Hook được tạo ra bằng hàm do_action(), hàm này chỉ đơn giản là khai báo một điểm neo ngay tại vị trí của nơi nó cần thực thi. Do tính chất của nó chỉ là khai báo điểm neo nên nó có thể sử dụng như tạo điểm neo hành động trong một chu kỳ nào đó, hoặc bạn có thể chèn thêm một cái gì đó vào ngay tại vị trí của điểm neo.

Ví dụ bạn có thể khai báo một action hook tên thachpham_before_content trong template ở vị trí bất kỳ với đoạn code sau (đặt vào template của theme):

<?php do_action( ‘thachpham_before_content’ ); ?>

Và bây giờ, nếu bạn muốn chèn một cái gì đó hoặc thực thi cái gì đó ngay tại vị trí mà bạn đã chèn hook thachpham_before_content thì chỉ cần móc nó vào một hàm callback nào đó là được.

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

Bạn đã biết Action Hook là gì rồi và cách sử dụng cơ bản của nó, bây giờ chúng ta cùng thực hành một số action hook thông dụng trong WordPress nhé. Bạn có thể tham khảo danh sách action hook trong WordPress để biết thêm.

pre_get_posts

Đây là hook mà bạn sẽ sử dụng nếu như bạn cần thay đổi lại tham số của truy vấn ở một trang nào đó bằng hàm callback của mình. Hook này được gọi ra sau khi truy vấn mặc định của WordPress được tạo ra nhưng trước khi truy vấn được chạy. Hook này thường được sử dụng kèm với đối tượng $query để sửa lại tham số của truy vấn hay làm việc gì đó để thao tác với truy vấn mặc định.

Ví dụ mình muốn ở trang lưu trữ của WordPress sẽ có truy vấn lấy bài viết ngẫu nhiên thì mình sẽ kết hợp với các hàm điều kiện của WordPress và phương thức $query->set() trong hook này.

Các hàm điều kiện khi dùng trong hook này sẽ phải viết dưới dạng phương thức của $query. Ví dụ: $query->is_home().


function thachpham_modify_archive_query( $query ) { // khai báo biến cần sử dụng trong callback

    if( $query->is_archive() && $query->is_main_query() ) : // is_main_query được sử dụng để tránh nó can thiệp vào truy vấn không phải mặc định
        $query->set(‘orderby’, ‘rand’); // orderby=rand => sắp xếp bài ngẫu nhiên
        $query->set(‘posts_per_page’, ‘1’); // posts_per_page=1 => hiển thị 1 bài mỗi trang
    endif;
    
}
add_action( ‘pre_get_posts’, ‘thachpham_modify_archive_query’ );

Như vậy chúng ta đã làm thành công việc tuỳ biến query ở mỗi trang mà không cần chạm vào mã nguồn, hay phải không nào?

wp_head

Hook này sẽ được sử dụng nếu như bạn muốn chèn một cái gì đó vào cặp thẻ <head> của theme mà không cần sửa template của theme.


function thachpham_author_tag(){
    echo "<link rel="author" href="https://thachpham.com" />n";
}
add_action( ‘wp_head’, ‘thachpham_author_tag’ );

Nếu bạn cần chèn vào footer thì có hook là wp_footer.

Lời kết

Trong bài viết này, có lẽ bạn đã nắm được khá nhiều các kiến thức về add_action trong WordPress rồi đó và mặc định nó cũng chỉ có như vậy thôi, nhưng về sau nếu bạn viết plugin thì tính năng này cực kỳ hữu ích. Hoặc khi bạn sử dụng các theme framework nó cũng sử dụng action hook rất nhiều.

Ở bài sau, chúng ta sẽ tìm hiểu thêm một loại hook nữa gọi là Filter Hook.

Xem tiếp bài trong serie

Phần trước: Sử dụng WP Query và Loop (vòng lặp) để lấy bài viếtPhần kế tiếp: Cách dùng Filter Hook trong WordPress