Uncategorized — May 30, 2016 at 4:03 am

Action Hook là gì?Cách sử dụng một Action Hook như thế nào?

by

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.

01
02
03
04
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à:

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

01
<?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().

01
02
03
04
05
06
07
08
09
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?

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.

01
02
03
04
function thachpham_author_tag(){
    echo "<link rel=\"author\" href=\"http://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.

Leave a Comment

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