Tìm hiểu sâu về Hook và Bộ lọc trong WordPress Core: Từ Cơ bản đến Lập trình Thực tế

Đọc trong 2 phút
2026-03-20
2026-06-03
2,090
Tôi kiếm được hoa hồng khi bạn mua sắm thông qua các liên kết dưới đây, mà không phát sinh thêm chi phí nào cho bạn.

Sức mạnh và tính linh hoạt của WordPress phần lớn đến từ hệ thống “hook và filter” được thiết kế một cách tỉ mỉ của nó. Cơ chế này cho phép các nhà phát triển tùy chỉnh và mở rộng toàn bộ chức năng của WordPress một cách sâu rộng mà không cần phải thay đổi mã nguồn gốc. Dù bạn muốn thêm nội dung tùy chỉnh vào bài viết hay thay đổi logic mặc định của một tính năng nào đó, hook và filter đều là những công cụ cơ bản để thực hiện điều đó. Việc hiểu rõ cách thức hoạt động của chúng là bước then chốt giúp bạn từ một người sử dụng WordPress trở thành một nhà phát triển chuyên nghiệp.

Các khái niệm cơ bản về Hook và Filter

Trong WordPress, “hook” (khớp nối) là một thuật ngữ chung, được chia thành hai loại chính: Action Hooks (Hook hành động) và Filter Hooks (Hook lọc). Cả hai loại này cùng nhau tạo nên cấu trúc dựa trên các sự kiện (event-driven) của WordPress.

Các hook hành động (action hooks) cho phép bạn thực thi đoạn mã của riêng mình vào những thời điểm cụ thể hoặc khi một sự kiện xảy ra. Ví dụ, khi một bài viết được đăng lên hoặc khi người dùng đăng nhập, WordPress sẽ kích hoạt các hook hành động tương ứng. Bạn có thể sử dụng chúng để tự động thực hiện các tác vụ như gửi thông báo, cập nhật dữ liệu, hoặc thực hiện các thao tác khác theo nhu c add_action() Hàm sẽ “gắn” (mount) hàm tùy chỉnh của bạn vào những điểm kết nối (hooks) này, để thực hiện các nhiệm vụ cụ thể vào những thời điểm được định trước. Các điểm kết nối hành động (action hooks) không yêu cầu trả về giá trị; mục đích chính của chúng là thực hiện các thao tác cần thiết.

Đọc thêm Làm thế nào để sử dụng WooCommerce để xây dựng một trang web thương mại điện tử độc lập trên WordPress với tỷ lệ chuyển đổi cao?

Các hook (khớp nối) của bộ lọc cho phép bạn “thay đổi” dữ liệu trước khi nó được sử dụng hoặc lưu trữ. Ví dụ, tiêu đề của bài viết sẽ trải qua một loạt các bộ lọc trước khi được hiển thị trên trình duyệt, hoặc các bình luận của người dùng sẽ được xử lý bởi các bộ lọc trước khi được lưu vào cơ sở dữ liệu. Bạn có thể sử dụng những hook này để thực add_filter() Hàm này sẽ gắn các hàm tùy chỉnh của bạn vào những bộ lọc (filters) này, thực hiện việc sửa đổi dữ liệu được truyền vào, và trả về giá trị đã được xử lý. Các bộ lọc được coi là những “trạm kiểm soát” trong dòng dữ liệu, có thể thực hiện các thao tác xử lý trên dữ liệu đó.

UltaHost – Nhà cung cấp dịch vụ máy chủ WordPress chuyên nghiệp
Bảo đảm hoàn tiền trong 30 ngày, băng thông và cơ sở dữ liệu không giới hạn, bảo vệ DDoS miễn phí, mua 3 năm ưu đãi 50%

Một phương pháp ghi nhớ đơn giản là: “Hành động (Action) là việc thực hiện một điều gì đó; Bộ lọc (Filter) là công cụ dùng để thay đổi một thứ gì đó.”

Giải thích chi tiết và cách sử dụng các hàm cốt lõi

Để sử dụng các công cụ “hook” (khóa móc), bạn cần nắm vững một số hàm cốt lõi. Những hàm này chính là giao diện giúp bạn tương tác với hệ thống sự kiện (event system) của WordPress.

Hàm gắn kết (hook function) quan trọng nhất là… add_action()add_filter()Cú pháp cơ bản của chúng rất giống nhau. Tham số đầu tiên là tên của hook, tham số thứ hai là tên của hàm tùy chỉnh mà bạn muốn gọi, tham số thứ ba là mức độ ưu tiên (mặc định là 10), và tham số thứ tư là số lượng tham số có thể được truyền vào (mặc định là 1).

// 挂载一个动作到 'init' 钩子
add_action( 'init', 'my_custom_init_function' );
function my_custom_init_function() {
    // 当 WordPress 初始化时,执行这里的代码
    // 例如,注册一个自定义文章类型
}

// 挂载一个过滤器到 ‘the_title’ 钩子
add_filter( 'the_title', 'my_custom_title_filter' );
function my_custom_title_filter( $title ) {
    // 修改传入的标题
    $modified_title = '前缀:' . $title;
    // 必须返回修改后的值
    return $modified_title;
}

Tham số ưu tiên quyết định thứ tự thực thi của các hàm khi nhiều hàm được gắn (mount) vào cùng một “hook” (điểm kích hoạt trong mã nguồn). Số càng nhỏ, ưu tiên càng cao, hàm đó sẽ được thực thi sớm hơn. Số lượng tham số cho biết WordPress rằng hàm gọi lại (callback function) của bạn yêu cầu nhận bao nhiêu thông tin (dữ liệu) từ các nguồn khác nhau. do_action()apply_filters() Các tham số của nó.

Đọc thêm Hướng dẫn sử dụng WordPress từ cơ bản đến nâng cao: Cách xây dựng trang web cho người mới bắt đầu và tối ưu hóa hiệu suất

Tương ứng với đó, hàm được sử dụng để loại bỏ “câu chốt” (hook) là… remove_action()remove_filter()Chúng thường được sử dụng để vô hiệu hóa một số tính năng trong các chủ đề (theme) hoặc plugin. Khi sử dụng chúng, bạn cần đảm bảo rằng các hook (các thành phần liên kết chức năng) đã được thêm vào hệ thống, và các tham số (bao gồm cả mức độ ưu tiên) phải hoàn toàn trùng khớp với yêu

Phân tích các trường hợp ứng dụng thực tế

Chỉ khi kết hợp lý thuyết với thực hành, chúng ta mới có thể hiểu sâu sắc và vận dụng một cách thành thạo các kiến thức đó. Hãy cùng xem xét một vài tình huống phát triển phổ biến để tìm hiểu cách các “hook” (móc) và “filter” (bộ lọc) giúp giải quyết các vấn đề thực t

Một tình huống điển hình là tự động thêm nội dung tùy chỉnh vào đầu và cuối bài viết. Chúng ta có thể tận dụng điều này để… the_content “Este filtro… Este ‘gancho’ (hook) thực sự rất mạnh mẽ; tất cả những thứ đi qua nó đều được xử lý đúng cách.” the_content() Nội dung bài viết được xuất ra bởi hàm đều sẽ đi qua quá trình xử lý của nó.

Hosting.com - lưu trữ chia sẻ
Hiệu năng cao, được trang bị CPU AMD EPYC, lưu trữ SSD NVMe và LiteSpeed, hỗ trợ chuyên gia nội bộ 24 giờ/ngày, các biện pháp bảo mật tiên tiến bao gồm SSL, chống brute force, phần mềm độc hại và bảo vệ DDoS, tiết kiệm tới 73%.
add_filter( ‘the_content’, ‘add_signature_to_post’ );
function add_signature_to_post( $content ) {
    // 仅在单篇文章页面且非Feed输出时添加
    if ( is_single() && ! is_feed() ) {
        $signature = ‘<p><em>Bài viết này được đăng lần đầu trên blog của tôi; vui lòng ghi rõ nguồn khi sao chép.</em></p>’;
        $content = $content . $signature;
    }
    return $content;
}

Một trường hợp khác là việc tự định hướng trang web mà người dùng sẽ được chuyển đến sau khi đăng nhập. Theo mặc định, sau khi đăng nhập, người dùng sẽ được chuyển đến trang quản trị. Tuy nhiên, nếu đó là một trang web dành cho thành viên, chúng ta có thể muốn họ được chuyển đến trang chủ hoặc một trang cụ thể khác. Lúc này, chúng ta có thể sử dụng các công cụ ho login_redirect Bộ lọc.

add_filter( ‘login_redirect’, ‘custom_login_redirect’, 10, 3 );
function custom_login_redirect( $redirect_to, $request, $user ) {
    // 检查用户对象是否存在且不是WP_Error,并且有权限
    if ( isset( $user->roles ) && is_array( $user->roles ) ) {
        // 如果是管理员,跳转到后台;否则跳转到站点首页
        if ( in_array( ‘administrator’, $user->roles ) ) {
            return admin_url();
        } else {
            return home_url();
        }
    }
    // 默认情况返回原来的重定向地址
    return $redirect_to;
}

Kỹ thuật nâng cao và thực hành phát triển

Khi bạn đã quen với cách sử dụng cơ bản, bạn có thể khám phá một số mô hình phát triển hiệu quả và an toàn hơn.

Trước hết, là về việc sử dụng hàm ẩn danh (closure). Đối với những hàm gọi lại (callback) đơn giản, chỉ được sử dụng một lần và không cần được tái sử dụng, việc sử dụng hàm ẩn danh sẽ giúp mã nguồn trở nên gọn gàng hơn, đồng thời tránh tình trạng “nhiễm bẩn” không gian tên toàn

Đọc thêm Hướng dẫn toàn diện phát triển chủ đề WordPress: Xây dựng chủ đề website chuyên nghiệp từ con số 0

add_action( ‘wp_footer’, function() {
    echo ‘<!-- 页面加载完成于:’ . current_time( ‘mysql’ ) . ‘ -->’;
});

Thứ hai, các lớp và phương thức được sử dụng như các hàm gọi lại (callbacks). Trong các plugin hoặc chủ đề (themes) của lập trình hướng đối tượng, việc sử dụng các phương thức của lớp như các hàm gọi lại là cách tổ chức dữ liệu tốt hơn. Bạn cần sử dụng một mảng để chỉ định các đối tượng lớp và tên của các phương thức c

class My_Plugin_Core {
    public function __construct() {
        add_action( ‘admin_init’, array( $this, ‘register_admin_settings’ ) );
        add_filter( ‘pre_get_posts’, array( $this, ‘modify_main_query’ ) );
    }

public function register_admin_settings() {
        // 注册设置
    }

public function modify_main_query( $query ) {
        // 修改主查询
        if ( ! is_admin() && $query->is_main_query() ) {
            // 你的逻辑
        }
        return $query;
    }
}
new My_Plugin_Core();

Cuối cùng, hãy kiểm tra và tìm hiểu về các “hook” (các thành phần được sử dụng để xử lý sự kiện trong ứng dụng). Trong quá trình phát triển, việc biết được những hook nào đang được thực thi trên trang hiện tại và thứ tự thực thi của chúng là rất quan trọng. Bạn có thể sử dụng các công cụ hoặ Debug Bar Plugin hoặc những thứ được mở rộng dựa trên nó. Debug Bar Actions and Filters Addon Có những plugin giúp hiển thị trực quan tất cả các hook (hàm được gọi tự động trong quá trình thực thi chương trình) đã được kích hoạt. Ngoài ra, việc lắng nghe trực tiếp các hook cụ thể trong mã nguồn cũng là một phương pháp nhanh chóng để gỡ lỗi.

Máy chủ chia sẻ của InterServer
Lưu trữ chia sẻ với mức phí $2,50 USD mỗi tháng, giảm giá $0,1 USD trong tháng đầu tiên, mã giảm giá tryinterserver, với 461 ứng dụng đám mây và cài đặt chỉ bằng một cú nhấp chuột.
add_action( ‘all’, function( $hook_name ) {
    if ( strpos( $hook_name, ‘save_post’ ) !== false ) {
        error_log( ‘当前触发钩子:’ . $hook_name );
    }
});

Tóm lại

Hệ thống hook và filter của WordPress chính là linh hồn của tính mở rộng (extensibility) của nó; hệ thống này giúp tách biệt phần cốt lõi của ứng dụng (core) với mã nguồn tùy chỉnh một cách gọn gàng thông qua kiến trúc dựa trên các sự kiện (event-driven architecture). Từ những khái niệm cơ bản về các hành động (actions) và filter, cho đến… add_actionadd_filter Từ việc sử dụng các hàm cốt lõi, cho đến việc giải quyết những nhu cầu thực tế như việc sửa đổi nội dung bài viết hoặc thực hiện các thao tác chuyển hướng khi người dùng đăng nhập, các nhà phát triển có thể dần dần nắm vững công cụ mạnh mẽ này. Ở giai đoạn nâng cao, việc sử dụng các hàm ẩn danh, lập trình hướng đối tượng cùng các phương pháp gỡ lỗi hiệu quả sẽ giúp mã nguồn trở nên chuyên nghiệp và dễ bảo trì hơn. Việc thành thạo các công cụ như “hook” (khóa móc) và “filter” (bộ lọc) đồng nghĩa với việc bạn thực sự có khả năng điều chỉnh hành vi của WordPress theo nhu cầu của mình – đây chính là chìa khóa để phát triển các plugin và theme một cách hiệu quả và an toàn.

FAQ 常见问题

动作钩子和过滤器钩子最根本的区别是什么

Các hook hành động (action hooks) được sử dụng để thực thi một đoạn mã vào một thời điểm cụ thể; chúng không trả về bất kỳ giá trị nào cho người gọi. Mục đích chính của chúng là “thực hiện một thao tác hoặc nhiệm vụ” nào đó. Một ví dụ điển hình về hàm loại này là… do_action()add_action()

Các hook của bộ lọc (filter hooks) được sử dụng để thay đổi dữ liệu trước khi nó đến đích cuối cùng (chẳng hạn như cơ sở dữ liệu, trình duyệt), và chúng phải trả về một giá trị (thường là giá trị đầu vào sau khi đã được sửa đổi). Mục đích chính của chúng là “thay đổi một phần nào đó của dữ liệu”. Một ví dụ điển hình về hàm như vậy là… apply_filters()add_filter()

Làm thế nào để biết một hook cụ thể là một hành động (action) hay một bộ lọc (filter)?

Phương pháp đáng tin cậy nhất là tham khảo các tài liệu chính thức của WordPress (WordPress Codex/Developer Resources). Trong thực tế, bạn cũng có thể xác định bằng cách xem các hàm được sử dụng trong mã nguồn: nếu chúng được gọi, thì có nghĩa là tính năng đó tồn tại. do_action Khi được gọi, nó đóng vai trò là một “khớp nối hành động” (action hook); nếu được sử dụng… apply_filters Khi được gọi, đó chính là các hook (khớp nối) của bộ lọc. Ngoài ra, nhiều tiện ích mở rộng cho công cụ phát triển (chẳng hạn như Query Monitor) cũng sẽ phân biệt rõ giữa các hành động (actions) và bộ lọc (filters) khi hiển thị thông tin.

Tại sao các bộ lọc mà tôi thêm vào không hoạt động?

Có một vài lý do có thể xảy ra tình trạng này: Đầu tiên, hãy kiểm tra xem tên của hook có được viết đúng chính tả hay không. Thứ hai, hãy đảm bảo rằng hàm gọi lại (callback function) của bạn đã được định nghĩa đúng cách và được sử dụng một cách chính xác. add_filter Thành công trong việc thêm nội dung (hãy đảm bảo rằng đoạn mã được thực thi trước khi các hook được kích hoạt). Thứ ba, hãy kiểm tra xem hàm gọi lại (callback function) của bạn có trả về giá trị đúng cách hay không; hàm lọc (filter function) phải có một giá trị được trả về. Thứ tư, có thể tồn tại vấn đề về thứ tự ưu tiên: các hàm lọc có thứ tự ưu tiên cao hơn có thể ghi đè những thay đổi mà bạn đã thực hiện. Bạn có thể thử điều chỉnh các tham số liên quan đến thứ tự ưu tiên. Cuối cùng, hãy sử dụng các thẻ điều kiện ( is_single()Hãy đảm bảo rằng mã của bạn hoạt động đúng như mong đợi trong bối cảnh cụ thể được chỉ định.

Trong quá trình phát triển plugin hoặc theme, bạn nên tạo các hook tùy chỉnh vào những thời điểm cụ thể sau:

Khi các chức năng bạn phát triển trở nên đủ phức tạp và bạn muốn cung cấp những điểm mở rộng (extension points) hoặc điểm chỉnh sửa (modification points) cho các nhà phát triển khác (hoặc cho chính bản thân bạn trong tương lai), bạn nên tạo ra các “hook” tùy chỉnh. Ví dụ, sau khi plugin của bạn thực hiện xong logic chính, bạn có thể kích hoạt một hook hành động tùy chỉnh để cho phép các đoạn mã khác thực hiện thêm các thao tác cần thiết; hoặc trước khi hiển thị dữ liệu phức tạp, bạn có thể áp dụng một bộ lọc tùy chỉnh để cho phép các đoạn mã khác sửa đổi dữ liệu đó. Việc này tuân theo nguyên tắc Mở-Rộng (Open-Closed Principle), giúp nâng cao đáng kể tính mở rộng và tính dễ sử dụng của mã nguồn. do_action Tạo hành động tùy chỉnh, sử dụng apply_filters Tạo bộ lọc tùy chỉnh.