Phát triển plugin cho WordPress: Từ cơ bản đến nâng cao – Hướng dẫn chi tiết cách tạo plugin tùy chỉnh đầu tiên của bạn

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

Tại sao nên học cách phát triển plugin cho WordPress?

WordPress trở thành hệ thống quản lý nội dung (CMS) phổ biến nhất thế giới nhờ vào khả năng mở rộng mạnh mẽ của nó. Trọng tâm của khả năng mở rộng này chính là các plugin. Bằng cách phát triển các plugin tùy chỉnh, bạn có thể thêm bất kỳ tính năng nào bạn muốn vào trang web mà không cần phải sửa đổi mã nguồn gốc của WordPress. Điều này không chỉ đảm bảo an toàn cho các bản cập nhật của hệ thống mà còn giúp các tính năng được tổ chức theo từng mô-đun, dễ dàng quản lý và di chuyển.

Học cách phát triển plugin sẽ giúp bạn chuyển từ người sử dụng WordPress thành người tạo ra các công cụ phụ trợ cho nền tảng này. Dù là tùy chỉnh các tính năng độc đáo theo yêu cầu của khách hàng, giải quyết những vấn đề kinh doanh cụ thể, hay đóng gói ý tưởng của mình thành sản phẩm để bán trên thị trường, việc nắm vững kỹ năng này mở ra vô số cơ hội cho bạn. Quan trọng hơn nữa, việc hiểu rõ quy trình phát triển plugin sẽ giúp bạn dễ dàng hơn trong việc gỡ lỗi và phát triển các plugin khác một cách hiệu quả.

Một plugin chuẩn của WordPress về mặt cấu trúc là một thư mục chứa tệp PHP chính. Tệp này thông báo sự tồn tại của mình đến hệ thống WordPress thông qua các dòng chú thích đặc biệt ở đầu tệp. Toàn bộ logic nghiệp vụ, dù là thêm một tiện ích mới, tạo một loại bài viết tùy chỉnh, hay xử lý dữ liệu từ biểu mẫu, đều được thực hiện thông qua các “hook” (các điểm kết nối) mà WordPress cung cấp.

Đọc thêm Phát triển plugin cho WordPress: Từ cơ bản đến chuyên nghiệp – Hướng dẫn chi tiết cách tạo ra những tính năng độc đáo cho trang web của bạn

Xây dựng dự án plugin đầu tiên của bạn

Trước khi bắt đầu phát triển, bạn cần một môi trường phát triển trên máy tính cá nhân (môi trường local). Chúng tôi khuyến nghị sử dụng các công cụ như XAMPP, MAMP, Local by Flywheel hoặc Docker để thiết lập một máy chủ local chứa PHP, MySQL và Apache/Nginx. Việc phát triển trên phiên bản WordPress được cài đặt trên máy tính cá nhân sẽ giúp tránh gây ảnh hưởng đến trang web trên mạng.

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%

Cấu trúc tệp cơ bản để tạo một plugin

Một plugin đơn giản nhất có thể chỉ chứa một tệp duy nhất. Trong thư mục cài đặt WordPress của bạn, hãy vào… wp-content/plugins Thư mục: Hãy tạo một thư mục mới, ví dụ như… my-first-pluginSau đó, hãy tạo một tệp PHP chính bên trong thư mục này. Tên tệp thường giống với tên thư mục. my-first-plugin.php

Viết phần tiêu đề thông tin meta cho plugin

Trong tệp chính của plugin, khối chú thích ở phía trên cùng của tệp rất quan trọng. Nó cung cấp cho WordPress thông tin về tên plugin, mô tả, phiên bản, tác giả, và các thông tin khác. Một đầu trang tiêu chuẩn có thể được trình bày như sau:

<?php
/**
 * Plugin Name:       我的第一个插件
 * Plugin URI:        https://example.com/my-first-plugin
 * Description:       这是一个用于学习 WordPress 插件开发的自定义插件。
 * Version:           1.0.0
 * Author:            你的名字
 * License:           GPL v2 or later
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain:       my-first-plugin
 * Domain Path:       /languages
 */

Sau khi lưu file, hãy đăng nhập vào backend của WordPress và truy cập trang “Plugins”. Bạn sẽ thấy “My First Plugin” xuất hiện trong danh sách các plugin, và có thể kích hoạt nó. Như vậy, một plugin “trống” nhưng hợp lệ đã được tạo ra. Hiện tại, plugin này chưa có bất kỳ chức năng nào, nhưng cấu trúc của nó là đúng đắn.

Khám phá các cơ chế cốt lõi của WordPress: Hook và Filter

Trọng tâm của việc phát triển plugin cho WordPress nằm ở việc hiểu rõ và sử dụng hệ thống “hook” của nó. Có hai loại hook: hook hành động (action hooks) và hook bộ lọc (filter hooks). Đây là những cơ chế mà WordPress cung cấp để bạn có thể “chèn” mã tùy chỉnh hoặc thay đổi dữ liệu vào những thời điểm nhất định trong quá trình hoạt động của trang web.

Đọc thêm Hướng dẫn cơ bản về phát triển plugin cho WordPress: Xây dựng bản mở rộng chức năng đầu tiên của bạn từ con số không

Hiểu cách thức hoạt động của các hook hành động (action hooks)

Các “action hook” (khớp nối hành động) cho phép bạn thực thi các hàm của mình vào những thời điểm cụ thể trong quá trình thực hiện của WordPress. Ví dụ, khi trang web được tải xong, hoặc khi một bài viết được đăng. add_action() Bạn có thể sử dụng các hàm để gắn (mount) các hàm tùy chỉnh của mình vào một “hook” (điểm kết nối trong hệ thống). Cú pháp cơ bản là:add_action( ‘hook_name’, ‘your_function_name’ );

Hãy cùng thực hiện một tính năng: hiển thị một thông điệp tùy chỉnh ở phía dưới trang của giao diện người dùng (frontend) trang web. Chúng ta sẽ sử dụng công cụ này để đạt được mục đích đó. wp_footer action hook này.

function my_custom_footer_message() {
    echo '<p style="text-align: center; color: #666;">Cảm ơn bạn đã truy cập trang web của chúng tôi! Đây là thông tin phần chân trang (footer) được thêm vào nhờ sử dụng một tiện ích (plugin) tùy chỉnh.</p>';
}
add_action( 'wp_footer’, 'my_custom_footer_message’ );

Hãy thêm đoạn mã này vào tệp chính của plugin của bạn. my-first-plugin.php Trong quá trình lưu và làm mới trang web (front-end page), bạn sẽ thấy dòng chữ này ở phần chân trang (footer).

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

Sử dụng bộ lọc để thay đổi nội dung mặc định.

Các hook của bộ lọc (filter hooks) được sử dụng để thay đổi dữ liệu được tạo ra trong quá trình xử lý của WordPress. Khác với các hook hành động (action hooks), các hàm bộ lọc (filter functions) phải trả về một giá trị. add_filter() Có những hàm được sử dụng để gắn (mount) các bộ lọc (filters) vào hệ thống. Ví dụ, để thay đổi nội dung mặc định của tiêu đề bài viết:

function modify_post_title( $title ) {
    if ( is_single() ) {
        return '【精选】’ . $title;
    }
    return $title;
}
add_filter( ‘the_title’, 'modify_post_title’ );

Hàm này sẽ thêm tiền tố “【Đặc biệt】” trước tiêu đề của các trang bài viết riêng lẻ, trong khi tiêu đề của các trang khác (như trang chủ, trang danh sách) sẽ không bị thay đổi. Bằng cách kết hợp sử dụng các hành động (actions) và bộ lọc (filters), bạn có thể kiểm soát hầu như mọi khía cạnh của WordPress.

Xây dựng một trang quản trị nền tảng (backend management page) hữu ích

Để người dùng plugin có thể cấu hình các tùy chọn, chúng ta thường cần tạo một trang quản trị nền tảng cho họ. Việc này liên quan đến API của menu quản trị trong WordPress.

Đọc thêm Phát triển plugin cho WordPress: Hướng dẫn toàn diện từ cơ bản đến nâng cao – Xây dựng các mô-đun chức năng có tính tùy chỉnh cao

Thêm một mục mới vào menu quản trị.

Sử dụng add_menu_page()add_options_page() Các hàm như vậy cho phép thêm một trang mới vào menu bên trái của giao diện quản trị WordPress. Chúng ta hãy lấy ví dụ về việc thêm một trang dưới menu con “Cài đặt” (Settings).

Trước tiên, hãy tạo một hàm để render nội dung HTML của trang quản lý.

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 my_plugin_settings_page_html() {
    // 检查用户权限
    if ( ! current_user_can( ‘manage_options’ ) ) {
        return;
    }
    ?&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( ‘my_plugin_settings’ );
            do_settings_sections( ‘my_plugin_settings’ );
            submit_button( ‘保存设置’ );
            ?>
        <input type="hidden" name="trp-form-language" value="vi"/></form>
    </div>
    &lt;?php
}

Cài đặt đăng ký, khối và trường

WordPress cung cấp thuộc tính register_setting(), add_settings_section()add_settings_field() Bộ API này được thiết kế để xử lý các thiết lập một cách chuẩn hóa. Nó có thể tự động thực hiện các thao tác xác thực bảo mật (Nonce) cũng như lưu/truy xuất các tùy chọn.

Tiếp theo, chúng ta cần một hàm để khởi tạo các thiết lập này. Hàm này cần được gắn (mount) vào hệ thống. admin_init hook.

function my_plugin_settings_init() {
    // 注册一个新的设置选项组
    register_setting( ‘my_plugin_settings’, ‘my_plugin_options’ );

// 在页面中添加一个新的区块
    add_settings_section(
        ‘my_plugin_section_1’,
        ‘基础设置’,
        null, // 回调函数,用于输出区块描述,可为空
        ‘my_plugin_settings’
    );

// 在区块内添加一个字段
    add_settings_field(
        ‘my_plugin_field_text’,
        ‘欢迎语’,
        ‘my_plugin_field_text_cb’,
        ‘my_plugin_settings’,
        ‘my_plugin_section_1’,
        [
            ‘label_for’ =&gt; ‘my_plugin_field_text’,
            ‘class’ =&gt; ‘my_plugin_row’,
        ]
    );
}
add_action( ‘admin_init’, ‘my_plugin_settings_init’ );

// 字段的回调函数,用于输出字段的 HTML
function my_plugin_field_text_cb( $args ) {
    $options = get_option( ‘my_plugin_options’ );
    ?&gt;
    <input type="text" id="<?php echo esc_attr( $args[‘label_for’] ); ?>"
           name="my_plugin_options[<?php echo esc_attr( $args[‘label_for’] ); ?>]"
           value="<?php echo esc_attr( $options[ $args[‘label_for’] ] ?? ‘’ ); ?>">
    <p class="“description”">Đoạn văn này sẽ được hiển thị trên trang chủ của trang web.</p>
    &lt;?php
}

Thêm liên kết trang web vào menu.

Cuối cùng, hãy sử dụng… add_options_page() Hãy thêm trang mà chúng ta vừa tạo vào menu “Cài đặt”.

function my_plugin_add_settings_page() {
    add_options_page(
        ‘我的插件设置’, // 页面标题
        ‘我的插件’, // 菜单标题
        ‘manage_options’, // 所需能力
        ‘my-plugin-settings’, // 菜单别名
        ‘my_plugin_settings_page_html’ // 渲染页面的回调函数
    );
}
add_action( ‘admin_menu’, ‘my_plugin_add_settings_page’ );

Bây giờ, sau khi kích hoạt tiện ích mở rộng, bạn có thể tìm thấy tùy chọn “Các tiện ích của tôi” trong menu “Cài đặt” của WordPress. Nhấp vào đó để truy cập trang cài đặt, nơi có một trường văn bản để bạn nhập và lưu thông điệp chào mừng. Sau đó, bạn có thể sử dụng thông điệp đó… get_option( ‘my_plugin_options’ ) Truy xuất và sử dụng giá trị này ở phía trước (frontend).

Thực hiện chức năng giao diện người dùng và cân nhắc bảo mật cho plugin

Khi triển khai các tính năng trên giao diện người dùng (frontend) trong một plugin, bảo mật là yếu tố cần được xem xét hàng đầu. Đừng bao giờ tin tưởng vào dữ liệu do người dùng nhập vào; bạn phải kiểm tra, làm sạch và xử lý chúng một cách thích hợp (như việc “đánh dấu ký tự đặc biệt

Giả sử chúng ta muốn sử dụng lời chào mừng (welcome message) đã được lưu trữ trong cấu hình nền (backend settings) và hiển thị nó ở phía trên trang chủ của trang web. Đầu tiên, chúng ta cần lấy thông tin này từ cơ sở dữ liệu, sau đó hiển thị nó một cách an toàn.

function display_frontend_greeting() {
    // 1. 获取数据
    $options = get_option( ‘my_plugin_options’ );
    $greeting = $options[‘my_plugin_field_text’] ?? ‘’;

// 2. 如果内容为空,则不输出任何东西
    if ( empty( $greeting ) ) {
        return;
    }

// 3. 在输出前进行清理和转义
    $safe_greeting = esc_html( $greeting );

// 4. 输出到前端(这里假设只在首页显示)
    if ( is_front_page() ) {
        echo ‘<div class="“my-plugin-greeting”"><p>’. $safe_greeting . ‘</p></div>’;
    }
}
add_action( ‘wp_body_open’, ‘display_frontend_greeting’ );

Ở đây, chúng ta đã sử dụng… esc_html() Chúng tôi sử dụng các hàm để mã hóa (định dạng lại) các ký tự HTML nhằm ngăn chặn các cuộc tấn công từ chương trình khác (XSS – Cross-Site Scripting). Chúng tôi cũng kiểm tra xem dữ liệu có trống không và sử dụng các thẻ điều kiện (conditional tags) để xử lý các trường hợp đặc biệt. is_front_page() Để kiểm soát vị trí hiển thị kết quả, hãy gắn (mount) hàm đó vào đúng nơi cần thiết. wp_body_open Hook, có thể đảm bảo nội dung hiển thị ngay sau khi thẻ body của trang bắt đầu.

Ngoài ra, trong phát triển plugin, quốc tế hóa cũng là một thực hành quan trọng. Bằng cách sử dụng __()_e() Các hàm dịch thuật và việc thiết lập đúng lĩnh vực văn bản (Text Domain) của plugin sẽ giúp plugin của bạn có thể được dịch sang bất kỳ ngôn ngữ nào. Trong phần thông tin meta ở đầu plugin, chúng ta đã định nghĩa những thứ cần thiết rồi. Text Domain: my-first-pluginTrong mã nguồn, bạn nên sử dụng nó như sau:

echo esc_html__( ‘Hello, World!’, ‘my-first-plugin’ );

Tóm lại

Thông qua các bước thực hành trong bài viết này, chúng ta đã hoàn thành một quy trình phát triển plugin WordPress đơn giản nhưng đầy đủ. Chúng ta bắt đầu với việc tạo cấu trúc tệp cơ bản và thông tin meta của plugin, sau đó dần đi sâu vào các cơ chế cốt lõi của WordPress – hệ thống hook (hook system), sử dụng các hàm action và filter để kiểm soát luồng thực thi chương trình và thay đổi dữ liệu. Tiếp theo, chúng ta xây dựng một trang quản trị nền (backend management page) với các trường tùy chỉnh, cho phép người dùng cấu hình các tùy chọn của plugin, và cuối cùng hiển thị những tùy chọn này một cách an toàn trên giao diện người dùng (frontend) của trang web.

Quá trình này bao gồm một số khía cạnh quan trọng trong việc phát triển plugin: tổ chức các tệp tin, sử dụng các công cụ hỗ trợ (hooks), tạo giao diện nền (backend interfaces), quản lý các tùy chọn (options), và xử lý an toàn dữ liệu ở phía trước (frontend data security). Hãy nhớ rằng một plugin tốt không chỉ cần có chức năng mạnh mẽ mà còn phải đảm bảo an toàn, hiệu quả và dễ bảo trì. Tiếp theo, bạn có thể thử bổ sung thêm các tính năng mới cho plugin của mình, chẳng hạn như khả năng tùy chỉnh loại bài viết (custom article types), các mã ngắn (shortcodes), các công cụ hỗ trợ (tools), hoặc các điểm cuối API (API endpoints) theo chuẩn REST, để ngày càng nâng cao kiến thức của mình về việc phát triển plugin cho WordPress.

FAQ 常见问题

Một plugin có thể chỉ chứa một tệp PHP không?

Đúng vậy, một plugin WordPress đơn giản nhất có thể chỉ gồm một tệp PHP duy nhất, miễn là tệp đó chứa đầy đủ các chú thích cần thiết (header comments) để xác định đó là một plugin. Tuy nhiên, đối với những plugin có chức năng phức tạp, bạn nên tổ chức mã nguồn thành nhiều tệp khác nhau – chẳng hạn, chia mã nguồn thành các phần dành cho giao diện người dùng (frontend), các chức năng nền (backend), và các hàm chung (common functions) – nhằm nâng cao độ đọc hiểu và khả năng bảo trì mã nguồn.

Làm thế nào để gỡ lỗi (debug) các plugin mà bạn tự phát triển?

Khuyến nghị bật chế độ gỡ lỗi của WordPress. Trong thư mục gốc của trang web wp-config.php tệp, đặt giá trị của hằng số WP_DEBUG Hằng số được thiết lập trueNhư vậy, các lỗi, cảnh báo và thông báo của PHP sẽ được hiển thị ra. Bạn cũng có thể kết hợp sử dụng chúng với nhau một cách linh hoạt. error_log() Hàm sẽ ghi thông tin gỡ lỗi vào nhật ký lỗi của máy chủ, hoặc sử dụng console trong công cụ phát triển trình duyệt để gỡ lỗi JavaScript.

Khi phát triển các tiện ích mở rộng (plugins), có những quy định bảo mật nào mà chúng ta phải tuân thủ?

Nguyên tắc quan trọng nhất là: Đừng bao giờ tin tưởng bất kỳ dữ liệu nào được người dùng nhập vào. Đối với mọi dữ liệu đến từ người dùng, hãy xem xét nó một cách thận trọng và kiểm chứng nó một cách kỹ lưỡng. $_GET$_POST$_COOKIE Cần kiểm tra và làm sạch dữ liệu đã thu thập được. Khi xuất dữ liệu ra định dạng HTML, hãy sử dụng các quy trình phù hợp để đảm bảo tính chính xác và độ tin cậy của dữ liệu. esc_html()esc_attr()esc_url() Các hàm như này cần được sử dụng để thực hiện việc “đánh dấu ký tự đặc biệt” (escape). Khi xây dựng truy vấn cơ sở dữ liệu, nhất định phải sử dụng chúng một cách chính xác. $wpdb->prepare() Các phương pháp để ngăn chặn các cuộc tấn công SQL injection. Ngoài ra, cần kiểm tra quyền hạn của người dùng hiện tại (ví dụ: current_user_can()Đây cũng là một bước không thể thiếu.

Làm thế nào để tôi gửi plugin của mình lên danh mục plugin chính thức của WordPress?

Trước hết, hãy đảm bảo rằng plugin của bạn hoàn toàn tuân thủ các tiêu chuẩn mã hóa của WordPress và giấy phép GPL. Bạn cần truy cập trang web WordPress.org, tạo một tài khoản, sau đó nộp bộ mã đã được nén của plugin lên trang dành cho việc gửi plugin. Đội ngũ chính thức sẽ tiến hành kiểm tra thủ công để đánh giá chất lượng mã nguồn, mức độ bảo mật, tài liệu hướng dẫn sử dụng và sự tuân thủ các quy định của WordPress. Sau khi được phê duyệt, plugin của bạn sẽ được đưa vào danh mục chính thức, nhận được hỗ trợ cập nhật tự động, và có thể được người dùng trên toàn thế giới tìm kiếm và cài đặt.