Phân tích các hàm và phương pháp cần thiết

Đọc trong 3 phút
2026-03-12
2026-06-04
1,934
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.

Trong quá trình phát triển WordPress, sự thành bại của các plugin thường phụ thuộc vào việc người phát triển có tận dụng tốt các hàm mạnh mẽ mà WordPress cung cấp hay không. Chương này sẽ tập trung vào một số API cốt lõi và được sử dụng phổ biến nhất của plugin, phân tích chi tiết các trường hợp sử dụng, tham số và phương thức của chúng, nhằm giúp các nhà phát triển xây dựng những plugin ổn định, hiệu quả và dễ bảo trì.

Core Actions and Filter Hook Functions

Cấu trúc plugin của WordPress dựa trên hệ thống “hook” (khớp nối), cho phép các nhà phát triển chèn các chức năng tùy chỉnh vào những thời điểm cụ thể trong quá trình thực thi mã nguồn chính của hệ thống. Việc hiểu rõ và sử dụng đúng các hàm hook là bước đầu tiên trong quá trình phát triển plugin.

Cài đặt các tính năng tùy chỉnh vào quy trình cốt lõi của WordPress

Các tính năng của plugin cần được kích hoạt vào đúng thời điểm thích hợp, và điều này thường được thực hiện thông qua cơ chế “Actions” (Các Thao tác) của WordPress.add_action Hàm là cầu nối giữa các plugin và vòng đời (lifecycle) của ứng dụng chính, cho phép các nhà phát triển thực thi mã tùy chỉnh khi những sự kiện nhất định xảy ra. remove_action Được sử dụng để gỡ bỏ các thao tác đã được thực hiện (đã được khởi tạo hoặc triển khai).

Đọc thêm Hướng dẫn cơ bản về phát triển plugin cho WordPress: Tạo plugin đầu tiên của bạn từ con số không

Cú pháp cơ bản như sau:

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%
add_action( string $hook_name, callable $callback, int $priority = 10, int $accepted_args = 1 )

Ví dụ, sau khi nội dung bài viết được đăng tải, hãy gửi một email thông báo đến người dùng:

function send_post_notification( $post_id ) {
    // 发送邮件的逻辑
}
add_action( 'publish_post', 'send_post_notification' );

add_action Tham số ưu tiên (priority parameter) quyết định thứ tự thực thi của nhiều hàm gọi lại (callback) trên cùng một hook; số càng nhỏ thì hàm đó sẽ được thực thi trước. Điều này cực kỳ quan trọng đối với các plugin phức tạp cần kiểm soát thứ tự thực thi các thao tác.

Thay đổi dữ liệu được truyền đến các hàm khác hoặc kết quả đầu ra.

Ngoài việc thực thi mã vào những thời điểm cụ thể, các nhà phát triển thường xuyên cần sửa đổi dữ liệu được tạo ra bởi các hàm khác; lúc này, họ sẽ cần sử dụng các hook (cơ chế kết nối) của bộ lọc (filter).add_filter Hàm này được sử dụng để thêm các phản hồi (callback) liên quan đến việc xử lý dữ liệu (filter callbacks). Nó nhận dữ liệu đầu vào, thực hiện các thao tác chỉnh sửa cần thiết, và sau đó phải trả về dữ liệu đã được xử lý.

Ví dụ, thay đổi ký tự cuối cùng trong tiêu đề của tất cả các bài viết:

Đọc thêm Nắm vững các Hook và Bộ lọc WooCommerce này để tùy chỉnh chức năng website thương mại điện tử của bạn

function modify_post_title( $title ) {
    return $title . ' - 我的网站';
}
add_filter( 'the_title', 'modify_post_title' );

add_action Tương tự…add_filter Các bộ lọc cũng hỗ trợ việc thiết lập thứ tự ưu tiên và số lượng tham số. Bộ lọc (filters) là nền tảng cơ bản giúp WordPress có thể được tùy chỉnh một cách sâu rộng.

Các hàm thao tác cơ sở dữ liệu và quản lý tùy chọn

Các plugin thường cần lưu trữ dữ liệu một cách lâu dài (bền vững). WordPress cung cấp một API quản lý dữ liệu có cấu trúc phức tạp, từ các tùy chọn đơn giản cho trang web đến các thao tác trên bảng cơ sở dữ liệu tùy chỉnh.

Lưu trữ và truy cập cài đặt của các tiện ích mở rộng một cách an toàn

Đối với các plugin cần lưu trữ cài đặt của người dùng, các tùy chọn cấu hình phải được lưu vào cơ sở dữ liệu của WordPress.add_optionget_optionupdate_option Đây là nền tảng cho việc quản lý dữ liệu. Những hàm này thực hiện các thao tác trên dữ liệu. wp_options Bảng (table) thích hợp để lưu trữ dữ liệu dạng cặp khóa-giá trị (key-value pair) có cấu trúc tương đối đơn giả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%.

Trước hết, có thể sử dụng… add_option Hãy thêm một giá trị ban đầu vào… wp_options Bảng: Hàm này chỉ thực hiện thao tác chèn dữ liệu khi tùy chọn đó không tồn tại.

add_option( 'my_plugin_api_key', '', '', 'no' ); // ‘no’表示非自动加载

Cách để lấy giá trị của một tùy chọn (option) là… get_optionĐề nghị luôn cung cấp các giá trị mặc định:

$api_key = get_option( 'my_plugin_api_key', '' ); // 第二个参数为默认值

Để cập nhật giá trị của tùy chọn, hãy sử dụng phương thức tương ứng. update_optionNếu tùy chọn đó không tồn tại, nó sẽ được tạo tự động.

Đọc thêm Hướng dẫn tối thượng về phát triển plugin WordPress: Xây dựng tiện ích mở rộng chuyên nghiệp từ con số không

update_option( 'my_plugin_api_key', 'new_secret_key_123' );

Đối với dữ liệu phức tạp như mảng hoặc đối tượng cần lưu trữ, các hàm này sẽ tự động tuần tự hóa và giải tuần tự hóa.

Thực hiện truy vấn cơ sở dữ liệu tùy chỉnh

Khi một plugin cần lưu trữ dữ liệu quan hệ hoặc nhật ký (logs), việc tạo các bảng cơ sở dữ liệu tùy chỉnh thường là lựa chọn tốt nhất. Trong trường hợp này, bạn sẽ cần phải tương tác trực tiếp với các lớp trừu tượng cơ sở dữ liệu của WordPress. $wpdb Giao diện người dùng (UI) cung cấp một phương thức truy cập cơ sở dữ liệu an toàn và tiêu chuẩn hóa.

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.

Trước tiên, hãy tạo bảng trong hook kích hoạt plugin. Hãy đảm bảo rằng bạn đang sử dụng đúng công cụ hoặc phương thức cần thiết để thực hiện việc này. dbDelta Một hàm được sử dụng để tạo hoặc cập nhật cấu trúc bảng một cách an toàn. Hàm này so sánh sự khác biệt giữa cấu trúc bảng hiện tại và cấu trúc mong muốn, sau đó áp dụng những thay đổi một cách thông minh.

global $wpdb;
$table_name = $wpdb->prefix . 'my_plugin_orders';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
    id bigint(20) NOT NULL AUTO_INCREMENT,
    customer_email varchar(100) NOT NULL,
    amount decimal(10,2) NOT NULL,
    order_date datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
    PRIMARY KEY (id),
    KEY customer_email (customer_email)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );

Khi thực hiện truy vấn dữ liệu, bạn phải sử dụng các công cụ hoặc phương thức được thiết kế riêng cho mục đích đó. $wpdb->prepare Việc chuẩn bị các câu lệnh bằng phương pháp này là yếu tố then chốt trong việc ngăn chặn các cuộc tấn công từ phía SQL injection (xâm nhập qua cách chèn mã độc hại vào truy vấn SQL).

$results = $wpdb->get_results(
    $wpdb->prepare(
        "SELECT * FROM {$wpdb->prefix}my_plugin_orders WHERE order_date > %s AND amount > %f",
        '2026-01-01 00:00:00',
        100.00
    )
);

Content Generation and Output Function

Các plugin không chỉ có thể chạy ở phía sau hậu trường (nền), mà quan trọng hơn là chúng có thể tạo ra nội dung dành cho người truy cập. WordPress cung cấp nhiều hàm mạnh mẽ để xuất dữ liệu dưới dạng HTML một cách an toàn và linh hoạt, xử lý mã ngắn (shortcodes), và quản lý các tài nguyên tĩnh (static resources).

Nhúng nội dung động vào các bài viết và trang web

Các mã ngắn (short codes) cho phép người dùng nhúng nội dung động vào các bài viết và trang web thông qua những thẻ đơn giản, đây là một tính năng quan trọng giúp nâng cao mức độ dễ sử dụng của các plugin. add_shortcode Bạn có thể dễ dàng tạo ra những đoạn mã ngắn (short codes) của riêng mình.

add_shortcode Hàm này nhận hai tham số: một thẻ mã ngắn và một hàm xử lý. Hàm xử lý cần trả về nội dung HTML thay vì hiển thị trực tiếp nội dung đó; điều này phù hợp với nguyên tắc “trước tiên thu thập dữ liệu, sau đó hiển thị” của WordPress.

add_shortcode( 'recent_posts', 'my_plugin_render_recent_posts' );
function my_plugin_render_recent_posts( $atts ) {
    // 解析属性,设置默认值
    $attributes = shortcode_atts( array(
        'count' => 5,
        'category' => ''
    ), $atts );

// 根据属性查询文章逻辑...
    $output = '<ul class="recent-posts">';
    // ... 生成列表项
    $output .= '</ul>';
    return $output;
}

Người dùng chỉ cần nhập nội dung vào trình soạn thảo. [recent_posts count="3"] Chỉ cần nhấp vào đó, bạn sẽ thấy danh sách các bài viết gần đây nhất.

Inh định giá trị của biến một cách an toàn vào HTML

Khi một plugin cần hiển thị các biến trên trang web (chẳng hạn như văn bản lấy từ cơ sở dữ liệu hoặc các thiết lập đã được đặt), bạn có thể sử dụng chúng một cách trực tiếp. echo Việc nối các chuỗi ký tự hoặc dữ liệu có thể gây ra nguy cơ xâm nhập từ xa (cross-site scripting – XSS). WordPress cung cấp các hàm đặc biệt để giúp mã hóa dữ liệu, nhằm đảm bảo tính an toàn của nội dung được hiển thị trên trang web.

Đối với việc hiển thị nội dung bên trong thuộc tính của thẻ HTML, hãy sử dụng cách sau: esc_attr Hàm:

echo '<input type="text" value="' . esc_attr( get_option( 'site_title' ) ) . '">';

Đối với phần nội dung bên trong các thẻ HTML, hãy sử dụng… esc_html

echo '<h1>'`. esc_html($post_title)`.'</h1>';

Đối với nội dung HTML đã được xác nhận là an toàn (ví dụ: đã được kiểm tra và đảm bảo không chứa mã độc hại, lỗ hổng bảo mật, v.v.), wp_kses_post Để lọc nội dung, nhưng vẫn cần hiển thị toàn bộ URL, bạn có thể sử dụng công cụ phù hợp. esc_url

echo '<a href="/vi/' . esc_url( $external_link ) . '/">Liên kết</a>';

Trong các đoạn mã JavaScript, để in ra giá trị của một biến PHP, bạn cần sử dụng hàm `eval()`. Tuy nhiên, việc sử dụng `eval()` có thể gây ra những rủi ro về bảo mật do nó cho phép thực thi mã từ bên ngoài vào chương trình. Do đó, chỉ nên sử dụng `eval()` trong những trường hợp thực sự c wp_json_encode Và phối hợp cùng esc_js

<script>
var pluginSettings = <?php echo wp_json_encode( $settings_array ); ?>;
var message = '<?php echo esc_js( $user_message ); ?>';
</script>

Các hàm xử lý tệp tin và phương tiện truyền thông

Nhiều plugin liên quan đến việc tải lên tệp tin, xử lý hình ảnh, hoặc truy cập vào các tệp bên trong chủ đề (theme) hoặc plugin. WordPress đã ẩn đi sự phức tạp của các đường dẫn máy chủ (server paths) và logic URL, đồng thời cung cấp một bộ API (Application Programming Interface) đơn giản để các nhà phát triển có thể sử dụng.

Lấy đường dẫn tuyệt đối đến các tài nguyên bên trong plugin hoặc theme

Trong quá trình phát triển plugin, thường xuyên cần tham chiếu đến các tệp CSS, JavaScript hoặc hình ảnh nằm trong thư mục chứa plugin đó. Việc sử dụng các đường dẫn tuyệt đối được khai báo cứng (hard-coded absolute paths) là rất không an toàn, vì trang web có thể bị di chuyển (migrate) đến một địa chỉ mới. WordPress cung cấp các công cụ và cơ chế để giúp bạn thực hiện điều này một cách an toàn và dễ dàng. plugin_dir_pathplugins_url Một hàm được sử dụng để tạo ra đường dẫn một cách động.

plugin_dir_path Đây là đường dẫn tới hệ thống tập tin của máy chủ chứa thư mục các tiện ích mở rộng (plugin), kết thúc bằng dấu gạch chéo (/). Đường dẫn này phù hợp để sử dụng trong các ứng dụng hoặc quy trình yêu cầu truy cập vào các tiện ích mở rộng trên máy chủ. includerequire tệp:

$config_path = plugin_dir_path( __FILE__ ) . 'config/config.php';
if ( file_exists( $config_path ) ) {
    require_once $config_path;
}

plugins_url Được sử dụng để tạo ra các địa chỉ URL có thể truy cập thông qua trình duyệt, phù hợp với việc sử dụng trong … (The tool is used to generate URLs accessible via browsers, suitable for use in …)

Tổng quan về các hàm và phương thức cần thiết – LikaCloud

Tài nguyên được trích dẫn trong đoạn này:

$css_url = plugins_url( 'assets/css/admin-style.css', __FILE__ );
wp_enqueue_style( 'my-admin-style', $css_url );

Đối với các nhà phát triển chủ đề (theme developers), hàm tương ứng là… get_template_directory_uriget_stylesheet_directory_uri

Xử lý các tệp media được người dùng tải lên

Nếu plugin cho phép người dùng tải lên tệp tin, thì tuyệt đối không được sử dụng chúng trực tiếp. $_FILES Toàn cục mảng (Global Array) và… move_uploaded_file Hàm: Các hàm xử lý media trong WordPress wp_handle_upload Cung cấp tính năng kiểm tra bảo mật toàn diện và tích hợp quản lý tệp tin.

Hàm này sẽ tự động thực hiện các thao tác kiểm tra loại tệp, đổi tên tệp (nhằm tránh việc ghi đè dữ liệu), xử lý lỗi, và di chuyển tệp vào cấu trúc thư mục của thư viện media trong WordPress.

$uploadedfile = $_FILES['my_plugin_upload'];
$upload_overrides = array( 'test_form' => false );
$movefile = wp_handle_upload( $uploadedfile, $upload_overrides );

if ( $movefile && ! isset( $movefile['error'] ) ) {
    // 文件上传成功
    $file_url = $movefile['url'];
    $file_path = $movefile['file'];
    // 可以将 $file_url 存入数据库
} else {
    // 上传失败,输出错误信息
    echo $movefile['error'];
}

Để tích hợp các tệp được tải lên vào thư viện phương tiện của WordPress một cách hiệu quả hơn, bạn cũng có thể sử dụng các công cụ hoặc phương pháp bổ sung. wp_insert_attachment Hàm này được sử dụng để tạo các bài đăng kèm theo tệp đính kèm, nhờ đó có thể tận dụng các tính năng xử lý hình ảnh tích hợp sẵn trong WordPress (chẳng hạn như tạo ảnh thu nhỏ).

Tóm lại

Việc nắm vững các hàm và phương thức cốt lõi của WordPress là nền tảng quan trọng để phát triển các plugin và theme một cách hiệu quả và an toàn. Bắt đầu với hệ thống hook (hàm gắn kết – hook system)…add_action, add_filterThực hiện việc phân mô-đun hóa các chức năng, đặc biệt là các thao tác truy cập và thao tác dữ liệu trong cơ sở dữ liệu.$wpdb, get_optionĐảm bảo tính bền vững của dữ liệu, sau đó mới thực hiện việc xuất ra nội dung.add_shortcode, esc_html) và xử lý an toàn (wp_handle_uploadMỗi nhóm hàm đều cung cấp những giải pháp đã được kiểm chứng kỹ lưỡng, phù hợp với các tình huống cụ thể. Các nhà phát triển nên hiểu rõ về các tham số, giá trị trả về và các phương pháp sử dụng tối ưu của chúng, nhằm tránh việc lặp lại công việc hoặc gây ra các lỗ hổng bảo mật, từ đó xây dựng những tiện ích mở rộng (extensions) cho WordPress vừa mạnh mẽ vừa đáng tin cậy.

FAQ 常见问题

add_action 和 add_filter 的根本区别是什么?

Sự khác biệt cốt lõi giữa hai cái này nằm ở mục đích sử dụng và hành vi mong đợi của hàm gọi lại (callback function).add_action Được sử dụng để “thực hiện một thao tác nào đó” khi một sự kiện xảy ra; hàm gọi lại (callback function) thường không trả về giá trị, mà chỉ thực hiện một đoạn mã lệnh nhất định (chẳng hạn như gửi email, ghi nhật ký). add_filter Dùng để “thay đổi một giá trị nào đó”; hàm gọi lại (callback function) phải nhận một giá trị đầu vào và trả về giá trị đã được sửa đổi. Xét về mặt triển khai kỹ thuật, chúng về cơ bản giống nhau, nhưng sự khác biệt về mặt ngữ nghĩa giúp mã nguồn trở nên dễ đọc hơn.

Khi sử dụng lớp $wpdb, tại sao lại bắt buộc phải sử dụng phương thức prepare?

$wpdb->prepare Phương pháp xử lý dữ liệu là tuyến phòng thủ then chốt để chống lại các cuộc tấn công SQL injection. Nó sử dụng các ký hiệu thay thế (%s cho chuỗi ký tự, %d cho số nguyên, %f cho số thực) để nhận các biến, và đảm bảo rằng những biến này được định dạng và mã hóa đúng cách trước khi được chèn vào câu lệnh SQL. Ngay cả khi bạn chắc chắn rằng nguồn gốc của các biến là an toàn (ví dụ: từ nguồn dữ liệu đáng tin cậy), việc sử dụng các ký hiệu thay thế vẫn rất cần thiết để tránh các lỗ hổng bảo mật. get_option(Xin lỗi, tôi đang bận, tôi sẽ trả lời sau.), Sử dụng prepare Đây cũng là một thói quen tốt mà chúng ta cần tuân theo; nó giúp đảm bảo rằng mã nguồn vẫn ổn định khi đối mặt với những thay đổi trong tương lai hoặc những tình huống phức tạp.

Có thể sử dụng chức năng `esc_html` và `esc_attr` thay thế cho nhau không?

Mặc dù trong một số trường hợp đơn giản, việc thay đổi vị trí sử dụng hai hàm này có thể không gây ra lỗi ngay lập tức, nhưng chúng tôi khuyên bạn không nên làm như vậy. Hai hàm này được tối ưu hóa cho các bối cảnh HTML khác nhau.esc_html Dùng để đánh dấu cách thức hiển thị nội dung bên trong các thẻ HTML một cách chính xác; nó sẽ xử lý nội dung đó theo quy tắc đặc biệt. <>&"' Các ký tự như “&”, “”, “<”, “>”, “"”, “'”, “&”, “%”, “#”, “<br>”, “<span>”, “<img>”, “<ul>”, “<li>”, “<ol>”, “<h1>”, “<h2>”, “<h3>”, “<h esc_attr Đây là công cụ được thiết kế riêng để thực hiện việc thoát (escape) các giá trị bên trong thuộc tính của thẻ HTML. Nó xử lý đặc biệt trường hợp mà giá trị của thuộc tính có thể được bao quanh bởi dấu ngoặc kép. Việc sử dụng hàm phù hợp sẽ đảm bảo rằng quá trình thoát giá trị diễn ra một cách an toàn

Hằng số `FILE` trong `plugin_dir_path(FILE)` có nghĩa là tên tệp tin chứa thông tin về đường dẫn thư mục chứa các plugin. Từ `FILE` được sử dụng để truy cập nội dung của tệp tin đó và lấy thông tin cần thiết.

FILE Đây là một hằng số “ma thuật” trong PHP, nó biểu thị đường dẫn đầy đủ và tên tệp của tập lệnh đang được thực thi trong hệ thống tập tin. Hằng số này nên được sử dụng trong tập tin chính của plugin. plugin_dir_path(FILE)Bạn có thể thu được đường dẫn tuyệt đối của thư mục plugin một cách động và chính xác, bất kể plugin được cài đặt ở đâu. Điều này đáng tin cậy hơn nhiều so với việc sử dụng đường dẫn được khai báo cứng (hard-coded), và giúp đảm bảo tính di động (portability) của plugin trong các môi trường máy chủ khác nhau. Trong quá trình phát triển giao diện người dùng (theme development), những hằng số tương tự cũng rất hữu ích DIR hoặc hàm get_template_directory() Đang đóng vai trò giống nhau.