Tìm hiểu về Action Hooks trong WordPress và ứng dụng của chúng

Khi làm việc với mã nguồn mở WordPress, ngoài việc nắm vững cấu trúc theme, cấu trúc truy vấn WP_Query thì việc nắm vững Action HooksFilter Hooks để có thể lập trình WordPress là một việc cực kỳ quan trọng bởi hầu hết chúng ta sẽ làm việc với Action Hooks khi phát triển Theme hay Plugin.

Action Hook là gì?

Trong tiếng anh thì Hook có nghĩa là “móc” – hiểu đơn giản thì nó là móc nối cái gì đó vào 1 cái có sẵn. Hành động này được thể hiện giống như chúng ta đã có sẵn một cái giá treo quần áo ở trên tường và việc móc chiếc áo của chúng ta lên cái giá treo đó tương tự với việc sử dụng Hooks trong WordPress. Các giá treo trên tường chính là các Action Hooks trong WordPress, những chiếc giá treo được gắn tại các vị trí khác nhau trong mã nguồn WordPress theo một thứ tự. Việc gắn các giá treo (Action Hooks) này được thể hiện qua hàm do_action().

/**
 * Fire the wp_head action.
 *
 * See {@see 'wp_head'}.
 *
 * @since 1.2.0
 */
function wp_head() {
    /**
     * Prints scripts or data in the head tag on the front end.
     *
     * @since 1.5.0
     */
    do_action( 'wp_head' );
}

Chắc ẳn nếu bạn nào đã từng làm việc với Theme của WordPress thì sẽ không lạ gì hàm wp_head() rồi phải không nào ? hàm này luôn luôn được gọi trong file header.php của bất kỳ theme nào. Và hàm này lại chạy hàm do_action(“wp_head”) thì điều này có nghĩa là khi WP load file header.php trong theme thì cũng là lúc cái giá móc áo “wp_head” được gắn lên tường.

Vậy còn hành động móc chiếc áo lên giá treo này được thể hiện như thế nào ? Yeah, trong mã nguồn WordPress thì việc này được thể hiện qua hàm add_action(). Dưới đây mình sẽ lấy một ví dụ về cách móc 1 chiếc áo lên cái giá treo wp_head kia nhé.

/**
*Chặn Google index nếu trang hiện tại là trang có phân trang và ở template coin-price-rate.php
*/

add_action('wp_head','block_index_paged');

function block_index_paged () {
    if( is_paged() && is_template('page-templates/coin-price-rate.php') ) {
       echo "<meta name='robots' content ='noindex,follow' />" . PHP_EOL;
    }
}

Ở vụ dụ này bài toán đặt ra là mình muốn có 1 đoạn thẻ meta để chặn index cho những trang có phân trang và nằm trong 1 tempate cụ thể của mình. Vậy để giải quyết yêu cầu bài toán, chúng ta không thể mở file header.php ra để sửa được vì như vậy code sẽ không có tính clean và rất rối cho việc nâng cấp về sau.

Vậy, Action Hooks chính là giải pháp tối ưu nhất lúc này. Trong file functions.php của theme đang sử dụng mình gọi hàm add_action(), mình truyền vào hàm này 2 tham số : tham số đầu tiên là tên action hooks (hay chính là tên của cái giá treo áo mà chúng ta muốn móc cái áo vào), tham số thứ 2 là 1 function. Trong function callback này, mình kiểm tra xem có thỏa mãn điều kiện là đang ở phân trang hay không và có phải template mình muốn chặn index hay không, sau đó mình in ra thẻ meta.

Và đây là kết quả của ứng dụng Action Hooks

Và đây là kết quả của ứng dụng Action Hooks

Đến đây thì các bạn chắc cũng phần nào hiểu được sâu hơn về bản chất của Action Hooks trong WordPress rồi chứ ? tiếp theo chúng ta sẽ cùng tìm hiểu sâu hơn về cách sử dụng Action Hook nhé.

Có thể bạn quan tâm

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

Trong bộ mã nguồn của WordPress chúng ta có rất nhiều các Action Hooks khác nhau, mỗi cái đóng một vai trò riêng và được đính tại 1 thời điểm nhất định khi WordPress được chạy (nhận được request từ phía client). Ở đây mình chỉ ví dụ một số Action Hooks quan trọng và luôn được sử dụng nhiều khi phát triển Theme hay Plugin.

  • init: hook này được đính vào mã nguồn WordPress khi theme đã được load xong hết và chuẩn bị render các template trong theme. Nếu chúng ta muốn chạy một hàm nào đó để thay đổi giá trị của biến hay bất kỳ một hành động nào đó ở đoạn này thì chúng ta chỉ cần gọi đoạn code add_action(“init”, FUNCTION_NAME)
  • plugins_loaded: chạy khi tất cả các plugin đã được hệ thống load xong
  • theme_setup : chạy khi chuẩn bị set theme, hook này được chạy trước khi load file functions.php trong theme
  • after_theme_setup: chạy sau khi đã load xong file functions.php của theme

Các bạn có thể tham khảo thêm danh sách các hooks này tại đây.

Ngoài các Hook được định nghĩa sẵn thì chúng ta hoàn toàn có thể định nghĩa thêm các Action Hook riêng của mình khi phát triển theme và plugin. Việc sử dụng Hook giúp code chúng ta sẽ clear hơn và không phải mất công tìm một file nào nó để bổ sung code.

Mình ví dụ trong file footer.php của theme chúng ta gọi do_action(“my_footer_action_hook”). Giả sử sau này chúng ta muốn chèm thêm cái gì đó vào footer thì chúng ta chỉ cần gọi add_action(“my_footer_action_hook”, FUNCTION_NAME). Dĩ nhiên rằng những đoạn code add_action này chúng ta cần gọi ở 1 file nào đó có tên là hook_function.php và load file nào trong file functions.php của theme thì các hàm hook của chúng ta mới có thể hoạt động được.

Tóm lại việc sử dụng các Action Hooks trong lập trình WordPress là hết sức quan trọng, nếu chúng ta muốn đi sâu vào phát triển WordPress và muốn can thiệp sâu vào phần core thì chúng ta chắc chắn sẽ phải master được kiến trúc này của WordPress.

Trả lời

Chấm điểm bài viết