Phát triển Plugin WordPress: Xây dựng plugin chức năng tùy chỉnh từ con số không

Đọc trong 3 phút
2026-03-14
2026-06-03
2,196
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 lại chọn phát triển plugin WordPress riêng của mình?

Trong hệ sinh thái WordPress, các plugin là yếu tố then chốt để mở rộng chức năng của trang web. Mặc dù danh mục plugin chính thức và các thị trường bên thứ ba cung cấp rất nhiều lựa chọn, việc tự phát triển plugin của riêng mình mang lại những lợi thế độc đáo. Khi các plugin hiện có không thể phù hợp hoàn hảo với logic kinh doanh của bạn, gặp phải hạn chế về hiệu năng, hoặc chứa quá nhiều tính năng không cần thiết, việc tự thiết kế và phát triển plugin trở thành giải pháp tốt nhất. Điều này cho phép bạn xây dựng một giải pháp nhẹ nhàng, tập trung cao, chỉ chứa những đoạn mã cần thiết, từ đó nâng cao hiệu suất của trang web.

Quan trọng hơn nữa, các plugin tùy chỉnh mang lại quyền kiểm soát hoàn toàn. Bạn có thể cập nhật tính năng theo nhu cầu của dự án, tích hợp trơn tru với các API nội bộ hoặc dịch vụ bên thứ ba, đồng thời đảm bảo rằng mã nguồn tuân thủ các tiêu chuẩn bảo mật và lập trình của bạn. Đối với các nhà phát triển, điều này cũng giúp họ hiểu sâu hơn về cấu trúc cốt lõi của WordPress – bao gồm cả các thành phần và cơ chế hoạt động bên trong nó.Hook(“Hook”): Những thực tiễn tuyệt vời trong việc vận hành hệ thống và cơ sở dữ liệu. Việc nắm vững kỹ năng phát triển plugin giúp bạn tạo ra những giải pháp thực sự được thiết kế riêng cho mọi dự án WordPress.

Xây dựng cấu trúc cơ bản cho plugin đầu tiên của bạn

Việc tạo một plugin cho WordPress bắt đầu với một thư mục đơn giản và một tệp chính (main file). Cấu trúc cơ bản của plugin chính là nền tảng cho việc phát triển tất cả các tính năng sau này.

Đọc thêm Nắm vững kỹ năng phát triển plugin cho WordPress: Xây dựng các mô-đun tùy chỉnh hiệu quả từ con số không

Tạo tệp chính cho plugin

Tất cả các plugin của WordPress đều phải có một tệp PHP chính, trong đó chứa các dòng chú thích đặc biệt (header comments) – những dòng này là yếu tố then chốt để WordPress nhận diện plugin đó. Bạn cần phải…wp-content/pluginsví dụmy-first-pluginSau đó, hãy tạo tập tin chính (main file) bên trong thư mục đó.my-first-plugin.php

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ác ghi chú ở đầu tệp phải chứa thông tin về tên plugin, mô tả, phiên bản, tác giả, và các chi tiết khác liên quan. Dưới đây là một ví dụ cơ bản:

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

Sau khi lưu file, bạn có thể tìm thấy và kích hoạt nó trên trang “Plugins” (Các tiện ích mở rộng) trong giao diện quản trị WordPress. Mặc dù hiện tại nó chưa có bất kỳ chức năng nào, nhưng cấu trúc của nó đã được thiết lập sẵn.

Tổ chức thư mục và tệp tin của các plugin

Khi số lượng chức năng tăng lên, một cấu trúc tệp tin hợp lý trở nên vô cùng quan trọng. Được khuyến nghị nên tách các loại mã nguồn khác nhau vào các thư mục con riêng biệt; điều này sẽ giúp việc bảo trì hệ thống trở nên dễ dàng hơn trong thời gian dài. Một thư mục plugin đơn giản điển hình có thể được tổ chức

my-first-plugin/
├── my-first-plugin.php      // 主文件,包含插件头和管理核心钩子
├── includes/                // 存放核心功能类或函数文件
│   └── class-core-functions.php
├── admin/                   // 后台相关的CSS、JS和PHP文件
│   ├── css/
│   ├── js/
│   └── admin-settings.php
├── public/                  // 前端相关的CSS、JS和PHP文件
│   ├── css/
│   ├── js/
│   └── class-public-handler.php
└── languages/               // 国际化翻译文件(.po/.mo)

Trong tệp chính (main file)my-first-plugin.phpbạn có thể sử dụngrequire_onceinclude_onceHãy thêm các tệp tin được tạo theo mô-đun này vào hệ thống tùy theo nhu cầu sử dụng. Cấu trúc này giúp phân tách rõ ràng giữa logic nền tảng, giao diện người dùng (front-end) và các chức năng cốt lõi của ứng dụng.

Đọc thêm Dễ hiểu và sâu sắc: Hướng dẫn toàn diện từ đầu để thành thạo phát triển plugin WordPress

Sử dụng các hook (móc) và filter (bộ lọc) để triển khai chức năng.

Cấu trúc plugin của WordPress được xây dựng dựa trên hệ thống hook dựa trên sự kiện (event-driven hook system), bao gồm chủ yếu các thành phần sau:Action(Động tác) vàFilter(Các bộ lọc – Filters). Việc hiểu rõ và sử dụng chúng là yếu tố cốt lõi trong quá trình phát triển các plugin.

Thực hiện nhiệm vụ thông qua các hook hành động (action hooks).

Các hook hành động (action hooks) cho phép bạn chèn mã của riêng mình vào những thời điểm cụ thể trong vòng đời của WordPress (ví dụ: khi khởi tạo, khi tải phần đầu trang (front-end header), khi lưu bài viết). Bạn có thể sử dụng chúng để thực hiện các tác vụ như hiển thị thông tin bổ sung, thay đổi cách hiển thadd_action()Hàm sẽ “gắn” các hàm tùy chỉnh vào những điểm kết nối (hook) này.

Ví dụ, nếu bạn muốn thêm một thông báo dành cho quản trị viên ở phía trên giao diện quản trị của trang web, bạn có thể sử dụng công cụ phù hợp để thực hiện điều đó.admin_noticesHãy bắt đầu với “action hook” này. Trước tiên, hãy định nghĩa một hàm trong tệp plugin chính.my_custom_admin_noticeSau đó, hãy gắn nó vào chiếc móc đó.

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%.
// 定义显示通知的函数
function my_custom_admin_notice() {
    echo '<div class="notice notice-success is-dismissible"><p>Plugin tùy chỉnh của tôi đã được kích hoạt thành công!</p></div>';
}
// 将函数挂载到 admin_notices 动作钩子
add_action( 'admin_notices', 'my_custom_admin_notice' );

Khi WordPress thực thi đếnadmin_noticesKhi đến thời điểm này, hàm mà bạn đã gắn (mount) sẽ được tự động gọi, từ đó hiển thị thông báo. Hàm hook (action hook) được sử dụng để thực hiện một hành động cụ thể, và nó không yêu cầu có giá trị trả về.

Sử dụng hook bộ lọc để sửa đổi dữ liệu

Khác với các hook hành động (action hooks), các hook lọc (filter hooks) được sử dụng để “thay đổi một số nội dung”. Chúng cho phép bạn thay đổi dữ liệu được truyền từ phần cốt lõi của WordPress, các plugin khác, hoặc các giao diện (themes). Bạn có thể sử dụng chúng để thực hiện các thao tác như xử lý dữ liệu trước khi nó được hiển thadd_filter()Hàm này được sử dụng để áp dụng một bộ lọc (filter) cho dữ liệu.

Một ví dụ điển hình là việc thay đổi nội dung cuối của bài viết. WordPress cung cấp công cụ để thực hiện điều này.the_contentBộ lọc này cho phép bạn thay đổi nội dung của các bài viết sắp được hiển thị.

Đọc thêm Hướng dẫn toàn diện phát triển plugin WordPress: Từ cơ bản đến nâng cao

// 定义修改内容的函数
function append_custom_text_to_content( $content ) {
    if ( is_single() ) { // 仅对单篇文章页面生效
        $custom_text = '<p><em>Cảm ơn bạn đã đọc! Bài viết này được hỗ trợ bởi plugin của tôi.</em></p>';
        $content .= $custom_text;
    }
    return $content; // 必须返回修改后的内容
}
// 将函数挂载到 the_content 过滤器钩子
add_filter( 'the_content', 'append_custom_text_to_content' );

Hàm lọc nhận một giá trị đầu vào (ở đây là…)$contentSau khi được xử lý, phải trả về một giá trị. Bằng cách này, bạn có thể thay đổi một cách linh hoạt hầu hết mọi dữ liệu được xử lý bởi WordPress.

Tạo trang cấu hình quản lý cho plugin

Đối với các plugin yêu cầu người dùng tự cấu hình, việc cung cấp một trang thiết lập trực tuyến (backend) thân thiện là điều cực kỳ cần thiết. WordPress cung cấp một loạt API để đơn giản hóa quá trình tạo các trang menu và trang tùy chọn (option pages).

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.

Thêm menu cấp cao hoặc menu con

Bạn có thể sử dụngadd_menu_page()The function creates an independent top-level background menu for the plugin, or alternatively…add_submenu_page()Hãy đặt nó như một mục con của một menu hiện có (chẳng hạn như “Cài đặt”). Thông thường, thao tác này yêu cầu việc gắn (mount) nó vào hệ thống.admin_menuTrên những “khúc móc hành động” (action hooks) đó.

Đoạn mã dưới đây minh họa cách thêm một trang cài đặt cấp cao (top-level settings page) đơn giản:

function my_plugin_add_admin_menu() {
    add_menu_page(
        '我的插件设置',           // 页面标题
        '我的插件',              // 菜单标题
        'manage_options',        // 所需权限(管理员)
        'my-plugin-settings',    // 菜单slug(URL标识)
        'my_plugin_settings_page', // 用于输出页面内容的回调函数
        'dashicons-admin-generic', // 图标(Dashicons)
        80                       // 菜单位置
    );
}
add_action( 'admin_menu', 'my_plugin_add_admin_menu' );

Tiếp theo, bạn cần định nghĩa hàm gọi lại (callback function).my_plugin_settings_pageĐây là đoạn mã được sử dụng để render nội dung HTML của trang web.

Xây dựng biểu mẫu cấu hình và tùy chọn lưu trữ

WordPressSettings APINó cung cấp những phương pháp tiêu chuẩn hóa để đăng ký, xác thực và lưu trữ các thiết lập một cách an toàn. Điều này giúp tránh được việc xử lý dữ liệu một cách trực tiếp.$_POSTDữ liệu đã được bảo vệ tốt hơn, giúp nâng cao mức độ an ninh.

Trước hết, hãy sử dụng…register_setting()Đăng ký một nhóm cài đặt và sử dụng nó.add_settings_section()Thêm khu vực và sử dụng nó.add_settings_field()Hãy thêm các trường cụ thể vào dữ liệu. Sau đó, trong hàm gọi lại (callback function) đã được định nghĩa trước đó, hãy sử dụng những trường này.settings_fields()do_settings_sections()Hàm này được sử dụng để hiển thị nội dung của biểu mẫu (form).

function my_plugin_settings_page() {
    // 检查用户权限
    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_options_group' );
            // 输出设置区域和字段
            do_settings_sections( 'my-plugin-settings' );
            // 输出提交按钮
            submit_button( '保存设置' );
            ?>
        <input type="hidden" name="trp-form-language" value="vi"/></form>
    </div>
    &lt;?php
}

Thông quaSettings APIBạn có thể dễ dàng tạo ra các trang thiết lập chứa nhiều loại trường dữ liệu như ô văn bản, menu thả xuống, ô chọn (checkbox), v.v. Tất cả dữ liệu đều sẽ được lưu trữ một cách an toàn.wp_optionsTrong bảng này, bạn có thể thực hiện các thao tác cần thiết thông qua các công cụ hoặc phương thức được cung cấp.get_option()Hàm có thể được gọi ở phía trước (frontend) hoặc phía sau (backend) của ứng dụng.

Đảm bảo tính bảo mật và khả năng bảo trì của plugin.

Việc viết một plugin mạnh mẽ không chỉ đòi hỏi việc triển khai đúng chức năng mong muốn, mà còn phải chú trọng đến các yếu tố an ninh, hiệu năng và khả năng bảo trì trong tương lai. Việc tuân theo các thực hành tốt nhất (best practices) là điều vô cùng quan trọng.

Xác thực, chuyển đổi và xử lý dữ liệu không an toàn

Đây là tuyến phòng thủ đầu tiên trong việc bảo vệ an ninh các plugin. Mọi dữ liệu đến từ người dùng hoặc các nguồn bên ngoài (chẳng hạn như…)$_GET$_POST$_COOKIETrước khi được truy cập vào cơ sở dữ liệu hoặc hiển thị trên trang web, dữ liệu phải trải qua quá trình xác thực nghiêm ngặt và xử lý (như việc “đánh dấu đặc biệt” – escape) để đảm bảo an toàn.

Đối với dữ liệu đầu vào (trước khi được lưu vào cơ sở dữ liệu), hãy sử dụng các hàm xác thực (validation functions) để kiểm tra tính hợp lệ của dữ liệu.sanitize_text_field()absint()Đến đây để làm sạch dữ liệu. Đối với dữ liệu được trả về (từ cơ sở dữ liệu và hiển thị trên trình duyệt), hãy sử dụng các hàm thoát (escape functions) như…esc_html()esc_attr()esc_url()Để ngăn chặn các cuộc tấn công XSS.

// Xử lý việc gửi biểu mẫu (mẫu minh họa; thường được thực hiện trong file options.php bằng API Settings)
$$user_input = isset($$_POST['my_field']) ? sanitize_text_field($$_POST['my_field']) : '';

// Hiển thị dữ liệu lấy từ cơ sở dữ liệu ở phía trước (frontend)
echo '<div class="info">'`. esc_html( get_option( 'my_saved_option' ) ) `.'</div>';

Ngoài ra, khi thực hiện truy vấn cơ sở dữ liệu, bạn phải sử dụng…$wpdbCác phương thức được cung cấp bởi lớp (như…)$wpdb->prepare()Để ngăn chặn việc xâm nhập dữ liệu qua SQL (SQL injection), cần sử dụng các biện pháp bảo mật phù hợp.

Implementing internationalization and localization support

Để plugin của bạn có thể được sử dụng bởi người dùng trên toàn thế giới, việc hỗ trợ quốc tế hóa (i18n) là điều bắt buộc. Điều này có nghĩa là tất cả các chuỗi dữ liệu dành cho người dùng đều phải được bao bọc bằng các hàm dịch của WordPress.

Sử dụng__()Hàm được sử dụng để dịch và trả về một chuỗi ký tự._e()Hàm được sử dụng để dịch và trực tiếp hiển thị chuỗi ký tự. Hàm này được định nghĩa trong phần đầu của plugin (plugin header).Text Domain(Lĩnh vực văn bản) Phải trùng khớp với lĩnh vực văn bản được sử dụng ở đây.

// 错误示例:直接输出英文字符串
echo “Hello World”;

// 正确示例:可翻译的字符串
echo esc_html__( ‘Hello World’, ‘my-first-plugin’ );
// 或者
_e( ‘Hello World’, ‘my-first-plugin’ );

Sau đó, bạn có thể sử dụng các công cụ như Poedit để trích xuất tất cả các chuỗi chứa các thẻ (tags) và tạo ra sản phẩm cần thiết..potTệp tin này được dùng để giúp người dịch tạo ra các phiên bản tài liệu bằng các ngôn ngữ khác nhau..po.moFile. Hãy đặt nó vào plugin.languagesTrong thư mục đó, WordPress sẽ tự động tải các bản dịch tương ứng dựa trên ngôn ngữ của trang web.

Tóm lại

Việc phát triển plugin cho WordPress là một quá trình có hệ thống, nhằm biến những ý tưởng sáng tạo thành các chức năng thực tế. Bạn đã bắt đầu bằng cách tạo tập tin chính chứa các ghi chú đầu tiêu chuẩn (standard header comments). Việc hiểu sâu và sử dụng các hook (điểm kết nối) như actions và filters là yếu tố then chốt để mang lại khả năng linh hoạt cho plugin, cho phép bạn can thiệp một cách trơn tru vào mọi khía cạnh của hệ thống WordPress. Giao diện quản lý được xây dựng thông qua API Settings API mang lại trải nghiệm cấu hình thân thiện với người dùng, từ đó nâng cao mức độ chuyên nghiệp của plugin.

Trong suốt quá trình phát triển, các nguyên tắc bảo mật phải được áp dụng một cách nhất quán, bao gồm việc kiểm tra dữ liệu một cách nghiêm ngặt, xử lý các ký tự đặc biệt (như ký tự “&”, “”) một cách chính xác, và thực hiện các thao tác trên cơ sở dữ liệu theo các tiêu chuẩn đã định. Đồng thời, việc hỗ trợ đa ngôn ngữ (internationalization) sẽ giúp plugin của bạn phục vụ được nhiều người dùng trên toàn thế giới hơn. Việc tuân theo một cấu trúc tệp tin rõ ràng (chẳng hạn như phân tách mã phía máy chủ, mã phía trình duyệt và mã cốt lõi) cùng các tiêu chuẩn lập trình sẽ tạo nền tảng vững chắc cho việc bảo trì lâu dài và mở rộng chức năng của plugin. Hãy nhớ rằng, một plugin tốt không chỉ là đoạn mã có thể chạy được, mà còn phải là giải pháp an toàn, hi

FAQ 常见问题

Để phát triển các plugin cho WordPress, bạn cần nắm vững một số công nghệ cốt lõi sau:

Bạn cần làm quen với những kiến thức cơ bản về ngôn ngữ PHP, vì các plugin chủ yếu được viết bằng PHP. Đồng thời, bạn cần hiểu rõ về HTML, CSS và JavaScript để xây dựng giao diện và tương tác giữa phía máy chủ (back-end) và phía người dùng (front-end). Điều quan trọng nhất là bạn phải nắm vững hệ thống kiến thức đặc trưng của WordPress, bao gồm hệ thống các hook (Actions và Filters) cũng như các lớp thao tác cơ sở dữ liệu (database operations).$wpdbNgoài ra, việc hiểu biết về các API như Settings API và REST API cũng rất hữu ích. Việc nắm rõ thứ tự ưu tiên trong quá trình thực thi các chức năng của các API này đối với các chủ đề (themes) và tiện ích mở rộng (plugins) của WordPress sẽ giúp bạn sử dụng chúng một cách hiệu quả hơn.

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

Trước hết, hãy đảm bảo rằng…wp-config.phptrong tệpWP_DEBUGChế độ này sẽ hiển thị trực tiếp các lỗi, cảnh báo và thông báo PHP trên trang web. Hãy sử dụng nó.error_log()Các hàm có thể ghi thông tin vào các tệp nhật ký tùy chỉnh nhằm theo dõi các biến và quá trình thực thi chương trình. Đối với các lệnh gọi Ajax hoặc REST API phức tạp, bạn có thể sử dụng panel “Mạng” (Network) trong công cụ phát triển trình duyệt để xem thông tin chi tiết về hoạt động của chúng. Ngoài ra, còn có nhiều plugin tuyệt vời như “Query Monitor” giúp phân tích sâu rộng các truy vấn cơ sở dữ liệu, quá trình thực thi các hàm (hooks) và các điểm nghẽn về hiệu năng, đây là những công cụ hữu ích trong quá trình phát triển và gỡ lỗi.

Cách phát hành plugin lên thư mục chính thức của WordPress sau khi hoàn thành phát triển

Trước hết, bạn cần đảm bảo rằng mã nguồn của plugin tuân thủ các tiêu chuẩn mã hóa và yêu cầu về cấu trúc thư mục do WordPress quy định. Ví dụ, plugin phải chứa một tệp có tên nhất định theo quy ước của WordPress, chứa các tệp cần thiết cho chức năng của nó, và được sắp xếpreadme.txtTrước tiên, hãy tạo một tệp tin (file) chứa mã nguồn của plugin của bạn. Sau đó, đăng ký một tài khoản nhà phát triển trên trang web WordPress.org và nộp plugin của bạn để được xem xét. Quá trình xem xét sẽ kiểm tra chất lượng mã nguồn, tính bảo mật, điều khoản cấp phép (phải tương thích với GPL), cũng như mô tả chức năng của plugin. Nếu được chấp thuận, bạn có thể sử dụng công cụ SVN để gửi mã nguồn plugin lên kho lưu trữ SVN chính thức của WordPress. Sau đó, bạn có thể cập nhật các phiên bản của plugin thông qua giao diện quản trị nội bộ của WordPress.

Sự khác biệt giữa việc thêm mã vào tệp functions.php của plugin tùy chỉnh và chủ đề là gì

Hãy thêm đoạn mã vào chủ đề hiện tại.functions.phpTệp tin (file) là một phương pháp đơn giản để thực hiện các bài kiểm thử nhanh chóng hoặc thêm các tính năng đặc thù cho một trang web. Tuy nhiên, phương pháp này có những nhược điểm rõ rệt: Các tính năng được liên kết chặt chẽ với chủ đề (theme) của trang web, vì vậy khi thay đổi chủ đề, các tính năng đó sẽ không còn hoạt động nữa. Ngoài ra, mã nguồn thiếu sự đóng gói (encapsulation) tốt và không có cấu trú

Việc tạo ra một plugin độc lập giúp tách biệt các chức năng khỏi giao diện chính (theme), giúp chúng hoạt động bình thường bất kể bạn sử dụng chủ đề nào. Plugin có cấu trúc rõ ràng, cho phép tổ chức mã nguồn một cách hiệu quả, quản lý các phụ thuộc (dependencies) một cách dễ dàng, cung cấp trang cấu hình và có thể được cập nhật một cách độc lập. Đối với những chức năng cần được tái sử dụng, có tính phức tạp cao hoặc cần được chia sẻ với người khác, plugin chính là lựa chọn phù hợp nhất.