Học cách phát triển plugin cho WordPress từ đầu: Xây dựng chức năng tùy chỉnh đầu tiên của bạn

Đọc trong 3 phút
2026-03-14
2026-06-03
2,908
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.

Việc nắm vững kỹ năng phát triển plugin cho WordPress là một trong những kỹ năng cốt lõi để mở rộng chức năng của trang web và đáp ứng các nhu cầu cá nhân hóa. Điều này quan trọng hơn nhiều so với việc chỉ đơn thuần chỉnh sửa giao diện (theme) của trang web. functions.php So với việc sử dụng các tệp tin thông thường, việc sử dụng các plugin giúp đảm bảo rằng các chức năng của bạn được tách biệt khỏi giao diện (theme) của trang web, từ đó dễ dàng hơn trong việc di chuyển, quản lý và bảo trì. Bài viết này sẽ hướng dẫn bạn từ đầu cách tạo một plugin có cấu trúc hoàn chỉnh và tuân thủ các tiêu chuẩn lập trình của WordPress.

Công tác chuẩn bị và thiết lập môi trường

Trước khi bắt đầu viết dòng mã đầu tiên, bạn cần một môi trường phát triển phù hợp và có kiến thức cơ bản về cấu trúc của WordPress.

Cấu hình môi trường phát triển

Một môi trường phát triển địa phương chuẩn là nền tảng cơ bản cho việc phát triển hiệu quả. Chúng tôi khuyến nghị sử dụng các công cụ như XAMPP, MAMP hoặc Local by Flywheel – những công cụ này cho phép cài đặt sẵn Apache, MySQL/Nginx, PHP và WordPress chỉ với một cú nhấp chuột. Ngoài ra, hãy đảm bảo rằng trình soạn thảo văn bản hoặc môi trường phát triển tích hợp (IDE) của bạn (chẳng hạn như VS Code, PhpStorm) hỗ trợ hiển thị định dạng mã PHP một cách rõ ràng và cung cấp các gợi ý về mã nguồn; điều này sẽ giúp nâng cao đáng kể hiệu quả trong quá trình phát triển.

Đọc thêm Phân Tích Chuyên Sâu Phát Triển Plugin WordPress: Từ Nhập Môn Đến Tùy Chỉnh Hiệu Quả

Hiểu kiến trúc plugin WordPress

Về bản chất, một plugin của WordPress là một hoặc nhiều tệp PHP, được lưu trữ trong thư mục cụ thể của hệ thống WordPress. wp-content/plugins/ Nó nằm trong thư mục tương ứng. Nguyên lý cốt lõi của nó là cơ chế “hook” (khớp nối). Các tiện ích mở rộng (plugin) có thể thực thi mã lệnh vào những thời điểm nhất định thông qua “action hook”, hoặc sửa đổi dữ liệu được trả về bởi các hàm khác thông qua “filter hook”. Hãy cố gắng hiểu rõ điều này. add_actionadd_filter Hai hàm này chính là chìa khóa để bắt đầu phát triển các plugin.

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%

Tạo plugin đầu tiên của bạn: Tiện ích chào hỏi

Chúng ta sẽ tạo một plugin đơn giản có tên là “Lời chào hàng ngày” (Daily Greeting). Plugin này sẽ hiển thị một tiện ích chào mừng tùy chỉnh trên bảng điều khiển (dashboard) của giao diện quản trị trang web.

Tạo tệp chính cho plugin

Đầu tiên, trong wp-content/plugins/ Hãy tạo một thư mục mới trong thư mục hiện tại và đặt tên cho nó là… my-first-greeting-pluginTrong thư mục đó, hãy tạo tập tin plugin chính. my-first-greeting-plugin.php

Mọi plugin đều phải bắt đầu bằng phần chú thích ở đầu theo tiêu chuẩn; đây là yếu tố giúp WordPress nhận diện thông tin về plugin đó. Hãy mở tệp chính và nhập đoạn mã sau:

<?php
/**
 * Plugin Name: 每日问候
 * Plugin URI:  https://www.yourwebsite.com/my-first-greeting-plugin
 * Description: 这是一个示例插件,用于在仪表盘显示个性化问候。
 * Version:     1.0.0
 * Author:      Your Name
 * Author URI:  https://www.yourwebsite.com
 * License:     GPL v2 or later
 * Text Domain: my-first-greeting
 */

Sau khi lưu tệp, hãy truy cập trang “Plugins” (Các tiện ích mở rộng) trong giao diện quản trị WordPress. Bạn sẽ thấy tiện ích “Daily Greetings” xuất hiện trong danh sách và có thể kích hoạt nó. Hiện tại, tiện ích này vẫn chưa có bất kỳ chức năng nào.

Đọc thêm Hướng dẫn Tối thượng để Phát triển Plugin WordPress: Xây dựng Plugin Đầu tiên của Bạn từ Con số 0

Thêm các tiện ích (widgets) vào bảng điều khiển (dashboard).

Tiếp theo, chúng ta sẽ sử dụng công cụ WordPress để… wp_dashboard_setup Bạn có thể sử dụng các “action hook” để thêm các công cụ bổ sung (gọi là “dashboard widgets”) vào bảng điều khiển (dashboard) của ứng dụng. Dưới dòng chú thích ở đầu tệp chính (main file), hãy tiếp tục thêm đoạn mã sau:

// 添加仪表盘小工具
function mfgp_add_dashboard_widget() {
    wp_add_dashboard_widget(
        'mfgp_dashboard_widget',          // 小工具唯一ID
        '每日问候',                       // 小工具标题
        'mfgp_dashboard_widget_content'  // 显示内容的回调函数
    );
}
add_action( 'wp_dashboard_setup', 'mfgp_add_dashboard_widget' );

// 定义小工具内容
function mfgp_dashboard_widget_content() {
    $user = wp_get_current_user();
    $hour = date('G'); // 获取当前小时(24小时制)

if ( $hour &gt;= 5 &amp;&amp; $hour < 12 ) {
        $greeting = '早上好';
    } elseif ( $hour >= 12 &amp;&amp; $giờ &lt; 18 ) {
        $greeting = &#039;下午好&#039;;
    } else {
        $greeting = &#039;晚上好&#039;;
    }

echo &#039;<p>' . sprintf( esc_html__( '%s,%s!欢迎回来。', 'my-first-greeting' ), $greeting, esc_html( $user-&gt;display_name ) ) . '</p>';
    echo '<p>' . esc_html__( '这是你的第一个插件创建的问候小工具。', 'my-first-greeting' ) . '</p>';
}

Đoạn mã này thực hiện hai việc: Đầu tiên, nó định nghĩa một hàm. mfgp_add_dashboard_widgetSử dụng wp_add_dashboard_widget Chức năng này được sử dụng để đăng ký một công cụ nhỏ (một tiện ích nhỏ trong chương trình). Sau đó, các định nghĩa liên quan đến công cụ đó được thực hiện. mfgp_dashboard_widget_content Chức năng này được thiết kế để tạo ra nội dung cho các tiện ích nhỏ (widgets), và nó sẽ hiển thị những lời chào hỏi khác nhau tùy theo thời điểm trong ngày, đồng thời ghi nhận tên người dùng đang đăng nhập. Lưu ý rằng chúng tôi đã sử dụng công nghệ/tiện ích này để thực hiện đi esc_html__()esc_html() Việc chuẩn bị cho quá trình dịch thuật các hàm và đảm bảo rằng các ký tự được xuất ra đã được mã hóa (được “escape”) là một thực hành quan trọng nhằm bảo vệ an ninh và hỗ trợ tính quốc tế hóa (internationalization).

Sau khi kích hoạt tiện ích mở rộng, hãy làm mới trang bảng điều khiển (dashboard) và bạn sẽ thấy tiện ích “Lời chào hàng ngày” (Daily Greetings).

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%.

Tăng cường chức năng của các tiện ích mở rộng (plugin) và thực hành bảo mật

Một plugin cơ bản đã được hoàn thành, nhưng để nó trở nên mạnh mẽ và chuyên nghiệp hơn, chúng ta cần chú trọng đến các khía cạnh bảo mật, khả năng bảo trì và tính linh hoạt trong cấu hình của người dùng.

Thêm trang cài đặt plugin

Việc cho phép người dùng tự định hình lời chào sẽ rất hữu ích. Chúng tôi sẽ tạo một trang cấu hình đơn giản cho plugin này.

Trước hết, hãy sử dụng… admin_menu Hãy thêm một trang menu con vào hook hành động (action hook).

Đọc thêm Hướng dẫn nhập môn phát triển plugin cho WordPress: Xây dựng plugin tùy chỉnh đầu tiên của bạn từ con số không

// 添加设置菜单
function mfgp_add_admin_menu() {
    add_options_page(
        '每日问候设置',                // 页面标题
        '每日问候',                    // 菜单标题
        'manage_options',             // 所需权限
        'my-first-greeting-plugin',   // 菜单slug
        'mfgp_settings_page_content' // 回调函数
    );
}
add_action( 'admin_menu', 'mfgp_add_admin_menu' );

Sau đó, hãy tạo nội dung cho trang cài đặt, các tùy chọn liên quan đến quá trình đăng ký, và xử lý việc lưu thông tin từ biểu mẫu.

// 设置页面内容
function mfgp_settings_page_content() {
    ?&gt;
    <div class="wrap">
        <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
        <form action="/vi/options.php/" method="post" data-trp-original-action="options.php">
            <?php
            settings_fields( 'mfgp_settings_group' ); // 输出安全字段
            do_settings_sections( 'my-first-greeting-plugin' ); // 输出设置区块
            submit_button(); // 输出提交按钮
            ?>
        <input type="hidden" name="trp-form-language" value="vi"/></form>
    </div>
    <?php
}

// 初始化设置
function mfgp_settings_init() {
    register_setting(
        'mfgp_settings_group', // 选项组名
        'mfgp_custom_message', // 选项名
        array( 'sanitize_callback' => 'sanitize_text_field' ) // 清理回调
    );

add_settings_section(
        'mfgp_section', // 区块ID
        '自定义问候设置', // 区块标题
        null, // 区块描述回调(无)
        'my-first-greeting-plugin' // 所属页面
    );

add_settings_field(
        'mfgp_field',
        '自定义问候语前缀',
        'mfgp_field_callback', // 输出字段HTML的回调
        'my-first-greeting-plugin',
        'mfgp_section'
    );
}
add_action( 'admin_init', 'mfgp_settings_init' );

// 设置字段的回调函数
function mfgp_field_callback() {
    $value = get_option( 'mfgp_custom_message', '祝您有愉快的一天,' );
    echo '<input type="text" name="mfgp_custom_message" value="' . esc_attr( $value ) . '" class="regular-text" />';
    echo '<p class="description">Đoạn văn này sẽ được thêm vào trước lời chào hỏi.</p>';
}

Cuối cùng, hãy sửa đổi hàm nội dung của tiện ích nhỏ để các thiết lập tùy chỉnh của người dùng có thể được áp dụng.

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.
// 更新小工具内容函数,使用自定义消息
function mfgp_dashboard_widget_content() {
    $user = wp_get_current_user();
    $hour = date('G');
    $custom_msg = get_option( 'mfgp_custom_message', '祝您有愉快的一天,' );

if ( $hour &gt;= 5 &amp;&amp; $hour < 12 ) {
        $greeting = '早上好';
    } elseif ( $hour >= 12 &amp;&amp; $giờ &lt; 18 ) {
        $greeting = &#039;下午好&#039;;
    } else {
        $greeting = &#039;晚上好&#039;;
    }

echo &#039;<p>' . esc_html( $custom_msg ) . sprintf( esc_html__( '%s,%s!', 'my-first-greeting' ), $greeting, esc_html( $user-&gt;display_name ) ) . '</p>';
}

Hiện nay, trong menu “Cài đặt” của WordPress, một trang tùy chọn có tên “Lời chào hàng ngày” (Daily Greetings) đã được thêm vào. Quản trị viên có thể lưu lại một đoạn văn bản được tùy chỉnh để sử dụng làm phần đầu tiên của lời chào hàng ngày.

Tuân thủ các tiêu chuẩn bảo mật và lập trình.

Trong quá trình phát triển, cần tuân thủ các thực hành bảo mật của WordPress: sử dụng các hàm thoát dữ liệu phù hợp cho tất cả các dữ liệu đến từ người dùng hoặc cơ sở dữ liệu, những dữ liệu sẽ được hiển thị trên trang web. esc_html, esc_attr, esc_urlVà thực hiện việc xác thực (validation) và làm sạch (cleaning) tất cả dữ liệu do người dùng nhập vào (ví dụ: bằng cách sử dụng các công cụ hoặc quy trình phù hợp). sanitize_text_field);Sử dụng wp_kses_postwp_kses Điều này cho phép sử dụng HTML một cách an toàn. Đồng thời, khuyến nghị nên tuân theo các quy định liên quan. Tiêu chuẩn mã hóa PHP chính thức của WordPressĐiều này nhằm đảm bảo rằng mã nguồn được viết một cách rõ ràng và nhất quán.

Chuẩn bị Quốc tế hóa và Phát hành Plugin

Để plugin của bạn có thể được người dùng trên toàn thế giới sử dụng, việc hỗ trợ nhiều ngôn ngữ (internationalization) là một bước không thể thiếu. Đồng thời, việc chuẩn bị để đăng plugin lên danh mục chính thức cũng đòi hỏi phải tuân theo một số quy định nhất định.

Thực hiện quốc tế hóa cho plugin

Chúng ta đã sử dụng nó trong mã nguồn rồi. esc_html__() Để thực hiện việc đóng gói chuỗi cần được dịch, bạn cần tạo một tệp tin trong thư mục plugin. Điều này là bước cần thiết để hỗ trợ quá trình quốc tế hóa (internationalization). languages Thư mục. Sau đó, thêm đoạn mã sau vào phần chú thích ở đầu tệp chính để tải dữ liệu từ trường văn bản:

// 加载文本域以实现国际化
function mfgp_load_textdomain() {
    load_plugin_textdomain( 'my-first-greeting', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
}
add_action( 'plugins_loaded', 'mfgp_load_textdomain' );

Sau đó, bạn có thể sử dụng các công cụ như Poedit để quét các chuỗi dịch trong mã nguồn của plugin và tạo ra tài liệu cần thiết. .pot Các tệp mẫu (template files) được thiết kế để hỗ trợ việc tạo nội dung cho các ngôn ngữ khác nhau, chẳng hạn như tiếng Trung. zh_CNTạo .po và đã biên dịch .mo Đặt tệp vào đó. languages Thư mục.

Chuẩn bị phát hành lên thư mục chính thức

Nếu bạn dự định nộp plugin của mình vào danh mục plugin của WordPress.org, bạn cần đảm bảo chất lượng mã nguồn và bao gồm các tệp meta-data cần thiết. Ví dụ, bạn có thể tạo một tệp `info.php` để cung cấp thông tin chi tiết về plugin của mình, như tên plugin, phiên bản, nhà phát triển, mô tả, và các tính năng chính. readme.txt Tệp tin phải tuân thủ định dạng được yêu cầu. Các quy định cụ thể của WordPressNội dung cần bao gồm tên plugin, mô tả, hướng dẫn cài đặt, câu hỏi thường gặp, nhật ký cập nhật, v.v. Ngoài ra, hãy xem xét thêm một chức năng gỡ cài đặt (uninstallation hook) để dọn dẹp các dữ liệu liên quan đến plugin khỏi cơ sở dữ liệu khi người dùng xóa nó.

// 插件卸载时清理选项
function mfgp_uninstall_hook() {
    delete_option( 'mfgp_custom_message' );
}
register_uninstall_hook( __FILE__, 'mfgp_uninstall_hook' );

Tóm lại

Bằng cách xây dựng plugin “Lời chào hàng ngày” này, chúng ta đã hoàn thành toàn bộ quy trình phát triển plugin trên WordPress: từ việc thiết lập cấu trúc tệp cơ bản, sử dụng các hook để thêm chức năng mới, đến việc tạo giao diện quản trị, thực hiện các quy định về bảo mật và chuẩn bị hỗ trợ đa ngôn ngữ. Điều quan trọng nhất là phải hiểu rõ và vận dụng thành thạo hệ thống hook của WordPress, đồng thời luôn đặt yếu tố bảo mật và tiêu chuẩn mã nguồn lên hàng đầu. Ví dụ đơn giản này chính là điểm khởi đầu cho hành trình phát triển plugin của bạn; từ đây, bạn có thể tiếp tục khám phá những công cụ như các đoạn mã ngắn (shortcodes), các loại bài viết tùy chỉnh, các endpoint REST API, và nhiều tính năng khác nữa, để tạo ra những plugin chuyên nghiệp với chức năng mạnh mẽ.

FAQ 常见问题

Plugin phải được đặt trong thư mục nào?

Các plugin của WordPress phải được đặt tại đúng vị trí trên trang web. wp-content/plugins/ Các plugin thường nằm trong thư mục tương ứng. Mỗi plugin có thể là một tệp PHP độc lập, nhưng phổ biến hơn là một thư mục mang tên của plugin đó, bên trong chứa tệp chính và các tài nguyên khác.

Tại sao plugin của tôi không hiển thị trong danh sách các plugin ở phía sau (background list)?

Vui lòng kiểm tra xem định dạng của các ghi chú ở phần đầu tệp plugin chính (như Plugin Name, Description, v.v.) có đúng và đầy đủ không. Hãy đảm bảo rằng tệp tin nằm ở thư mục đúng, và WordPress có quyền truy cập vào tệp đó. Ngoài ra, hãy kiểm tra xem phần đầu của mã PHP không chứa bất kỳ khoảng trắng hoặc ký tự thừa nào.

Làm thế nào để gỡ lỗi PHP trong các plugin?

wp-config.php tệp, đặt giá trị của hằng số WP_DEBUG Hằng số được thiết lập trueĐiều này sẽ cho phép WordPress hiển thị các lỗi PHP, cảnh báo và thông báo trên trang web. Lưu ý rằng chỉ nên bật tính năng này trong môi trường phát triển; nhớ tắt nó trước khi đưa trang web lên trang web chính thức.

Sự khác biệt giữa các tệp functions.php của plugin và theme là gì?

Trong tập tin functions.php Các tính năng được thêm vào sẽ được liên kết với chủ đề hiện tại. Khi bạn thay đổi chủ đề, những tính năng đó có thể sẽ không còn hoạt động. Ngược lại, các tính năng do plugin cung cấp hoạt động độc lập với chủ đề; bạn có thể sử dụng chúng mọi lúc miễn là plugin đó được kích hoạt. Đối với những tính năng có tính chất phổ dụng (có thể được sử dụng trên nhiều chủ đề khác nhau), việc phát triển plugin là lựa

Làm thế nào để các nhà phát triển khác có thể mở rộng plugin của tôi?

Bạn có thể cho phép các nhà phát triển khác mở rộng plugin của mình bằng cách cung cấp các “khớp hành động” (action hooks) và “khớp lọc” (filter hooks) tùy chỉnh. Hãy sử dụng chúng một cách hiệu quả để tạo tính linh hoạt và khả năng tương tác cao hơn cho plugin của bạn. do_action() Tạo các “hook” cho các hành động (action hooks), và thực hiện những hành động cần thiết ở những nơi mà mã cần được chèn vào (where code needs to be injected). apply_filters() Tạo các “hook” (khớp nối) cho bộ lọc để cho phép chúng thay đổi một số giá trị dữ liệu trong plugin của bạn. Đây là mô hình phổ biến trong việc hợp tác giữa các plugin trong hệ sinh thái WordPress.