Cách sử dụng Action Hook 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ì.

2. Action Hook là gì?

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.

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.

3. 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 manhphuc_theme_setup(){
    // PHP Script here
}
add_action( 'init', 'manhphuc_theme_setup' )

Đâ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

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

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

Action Hook được tạo ra bởi hàm do_action. Nó là một hàm để đặt điểm gọi Action trong template. Ví dụ bạn đã add một action với tên test_action. Khi bạn muốn thực thi action này ở template chỉ cần đặt

<?php
    do_action( 'test_action' );
?>

Lấy một ví dụ đơn giản là khi chúng ta là web với một shop bán hàng, chúng ta hay sử dụng plugin WooCommerce để show sản phẩm.

Function Callback:

<?php
    if ( ! function_exists( 'woocommerce_template_loop_add_to_cart' ) ) {

	/**
	 * Get the add to cart template for the loop.
	 *
	 * @subpackage	Loop
	 */
	function woocommerce_template_loop_add_to_cart( $args = array() ) {
		global $product;

		if ( $product ) {
			$defaults = array(
				'quantity' => 1,
				'class'    => implode( ' ', array_filter( array(
						'button',
						'product_type_' . $product->product_type,
						$product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '',
						$product->supports( 'ajax_add_to_cart' ) ? 'ajax_add_to_cart' : ''
				) ) )
			);

			$args = apply_filters( 'woocommerce_loop_add_to_cart_args', wp_parse_args( $args, $defaults ), $product );

			wc_get_template( 'loop/add-to-cart.php', $args );
		}
	}
}
?>

Add Action Hook:

<?php
    add_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
?>

Do Action

<?php
do_action( 'woocommerce_after_shop_loop_item' );
?>

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

Lời kết:

Với các bạn đã code WordPress thì chắc không lạ gì với Action Hook. Nhưng với các bạn mới sử dụng và làm quen với WordPress thì mình mong các bạn sẽ nắm được và sử dụng thành thạo vì trong các framework rất nhiều phần sử dụng Action này.

Chúng ta còn một loại hook nữa, ở bài tới mình và các bạn cùng nhau tìm hiểu về filter hook nhé!

Leave a Reply

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

arrow