Trong WordPress có một dạng là Filter Hook. Nó là gì và nó có quan trọng hay không?

Trước khi đi đến loạt bài về “Lập trình WordPress nâng cao”, mình khuyên các bạn nên có kiến thức vững chắc về Hook trong WordPress. Hook sẽ giúp chúng ta tùy chỉnh lại kết quả hoặc thêm bớt dữ liệu mà không cần phải can thiệp, chỉnh sửa mã nguồn của WordPress, Theme hoặc Plugin.

Hook trong WordPress được chia làm 2 loại là Action HookFilter Hook.

Trong nội dung của bài này mình sẽ trình bài về Filter Hook. Về Action Hook sẽ được trình bài trong một bài viết khác.

Vậy Filter Hook là gì?

Filter Hook được hiểu là một điểm neo trong mã nguồn WordPress, theme hoặc plugin nào đó được nhà phát triển (developer) tạo ra để giúp chúng ta có thể thay đổi kết quả trả về của một function nào đó.

Ở đây mình sẽ ví dụ về function lấy title (tiêu đề) của một bài viết (post) hoặc một trang (page).

Thông thường để lấy được tiêu đề của một post hoặc page chúng ta sẽ dùng hàm the_title().
Đây là một function được cung cấp bởi WordPress.
Các bạn có thể vào bộ tài liệu hướng dẫn của WordPress để tìm mã lệnh của function the_title() hoặc tìm trực tiếp trong mã nguồn của Website.

Nếu các bạn để ý trong function the_title() nó sẽ dùng một function để lấy được tiêu đề của post hoặc page hiện tại là get_the_title().

/**
 * Display or retrieve the current post title with optional markup.
 *
 * @since 0.71
 *
 * @param string $before Optional. Markup to prepend to the title. Default empty.
 * @param string $after  Optional. Markup to append to the title. Default empty.
 * @param bool   $echo   Optional. Whether to echo or return the title. Default true for echo.
 * @return void|string Void if `$echo` argument is true, current post title if `$echo` is false.
 */
function the_title( $before = '', $after = '', $echo = true ) {
        // tiêu đề được lấy ra ở đây.
	$title = get_the_title();

	if ( strlen( $title ) == 0 ) {
		return;
	}

	$title = $before . $title . $after;

	if ( $echo ) {
		echo $title;
	} else {
		return $title;
	}
}

Và các bạn tiếp tục tìm mã lệnh của function get_the_title(), các bạn sẽ thấy trong function này đoạn return sẽ trả về một filter_hook.

/**
 * Filters the post title.
 *
 * @since 0.71
 *
 * @param string $title The post title.
 * @param int    $id    The post ID.
 */
return apply_filters( 'the_title', $title, $id );

Để tạo ra một filter_hook các bạn sử dụng function là apply_filters.
Trong function này các bạn cần định nghĩa tên cho filter_hook cũng như các tham số truyền vào.
Ví dụ trong lệnh apply_filters( ‘the_title’, $title, $id ); này “the_title” sẽ là tên của filter_hook$title, $id sẽ là các params được truyền vào cho filter_hook “the_title”.

Vậy làm thế nào để sử dụng được filter_hook?

Để sử dụng một filter_hook nào đó, các bạn cần dùng function add_filter.
Mình sẽ dùng luôn hook “the_title” để làm ví dụ.

apply_filters( 'the_title', 'thay_doi_title', 10, 1 );
function thay_doi_title( $title ) {
    $title = 'Devfun Blog';
    return $title;
}

Như các bạn thấy, trong đoạn mã trên mình dùng filter để thay đổi nội dung của post hoặc page thành “Devfun Blog”.
Trong function add_filter mình truyền vào 4 tham số là

  • “the_title” => tên của filter_hook
  • “thay_doi_title” => function sẽ được gọi (callback function)
  • 10 => (priority) thứ tự thực thi của function “thay_doi_title” trong hook
  • 1 => số lượng tham số mà function “thay_doi_title” sẽ được nhận

Lưu ý: tùy thuộc vào số lượng tham số mà hook khai báo, các bạn có thể tăng hoặc giảm số lượng tham số nhận vào trong callback function, nhưng nó không được bé hơn 1 và lớn hơn số lượng tham số tối đa.

Ví dụ: hook “the_title” được khai báo có tối đa 2 tham số thì trong callback function của các bạn cũng chỉ được phép nhận tôi đa là 2 tham số.

Tiếp theo mình sẽ hướng dẫn các bạn tạo 1 filter_hook cho riêng mình.

Ví dụ mình sẽ mở file footer.php lên và thêm và đoạn mã sau vào cuối file

<?php 
    $copyright = 'Devfun Blog';
    echo apply_filters( 'change_copyright', $copyright );
?>

Khi mình chưa thêm callback function cho hook change_copyright thì kết quả sẽ là “Devfun Blog”.
Và sau khi mình thêm đoạn mã sau vào file functions.php

<?php 
    add_filter( 'change_copyright', 'func_change_copyright', 10, 1 );
    function func_change_copyright( $param ) {
        $param = 'Chào mừng bạn đến với ' . $param;
        return $param;
    }
?>

Thì kết quả lúc này là “Chào mừng bạn đến với Devfun Blog”.

Đã có function add_filter thì ắt hẳn sẽ có function remove_filter.

Mình sẽ thêm đoạn mã sau vào cuối file functions.php

<?php 
    remove_filter( 'change_copyright', 'func_change_copyright', 20);
?>

Thì kết quả lúc này lại là “Devfun Blog”.
Lý do là vì mình đã remove callback funtion “func_change_copyright” ra khỏi hook “change_copyright”.

Các bạn chú ý ở function add_filter và remove_filter mình đều truyền số 10 vào. Đây được gọi là priority và tham số này của remove_filter và apply_filter phải GIỐNG NHAU.

Kết: nhìn chung việc sử dụng filter_hook khá đơn giản. Nếu các bạn tìm hiểu các filter_hook có sẵn của WordPress core, theme hoặc plugin thì nó sẽ giúp ích cho các bạn rất nhiều trong việc chỉnh sửa theme hoặc tạo plugin cho riêng mình.

Nếu bạn thấy hay hoặc có ích vui lòng để lại một like hoặc một comment.
Nếu mình có gì sai sót vui lòng để lại góp ý của bạn để mình có thể hoàn thiện hơn.

1 BÌNH LUẬN

BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây