Hướng dẫn nhập môn phát triển plugin WordPress: Tạo plugin tùy chỉnh đầu tiên của bạn từ con số 0

Đọc trong 3 phút
2026-03-15
2026-06-03
2,856
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 phải phát triển plugin WordPress của riêng bạn

Trong hệ sinh thái WordPress, các plugin (tiện ích mở rộng) là yếu tố then chốt để nâng cao chức năng của trang web. Mặc dù có hàng ngàn plugin khác nhau trên thị trường để lựa chọn, việc tự phát triển plugin mang lại nhiều lợi thế độc đáo. Đầu tiên, nó cho phép bạn tạo ra những tính năng được thiết kế theo đúng nhu cầu cụ thể của mình, tránh việc sử dụng những plugin chung gây ra mã nguồn phức tạp hoặc những tính năng không cần thiết. Thứ hai, plugin tự phát triển có thể được tích hợp sâu rộng với giao diện trang web (theme) hoặc các đoạn mã tùy chỉnh khác, giúp đảm bảo tính tương thích và hiệu suất tốt hơn. Ngoài ra, việc phát triển plugin còn giúp bạn tách biệt logic nghiệp vụ khỏi mã nguồn của giao diện trang web – đây là một thực hành tốt nhất trong phát triển WordPress. Nhờ đó, ngay cả khi bạn thay đổi giao diện trang web trong tương lai, các chức năng cốt lõi vẫn sẽ hoạt động bình thường, từ đó nâng cao khả năng bảo trì trang web.

Đối với các nhà phát triển, học cách phát triển plugin là một phương pháp tuyệt vời để hiểu sâu hơn về cấu trúc của WordPress. Bạn sẽ được tiếp xúc với các hook (khớp nối) trong hệ thống của WordPress.add_actionFilter Hooksadd_filter、Mã ngắnadd_shortcodeNhững khái niệm cốt lõi như vậy rất quan trọng. Việc nắm vững những kiến thức này không chỉ giúp bạn tạo ra các plugin mới, mà còn giúp bạn tùy chỉnh các chủ đề (themes) và plugin hiện có một cách hiệu quả hơn.

Cấu hình môi trường và các công việc chuẩn bị trước khi bắt đầu phát triển

Trước khi bắt đầu viết dòng mã đầu tiên, việc thiết lập một môi trường phát triển phù hợp là điều vô cùng quan trọng. Điều này không chỉ giúp nâng cao hiệu suất mà còn giúp tránh các lỗi phát sinh trong quá trình lập trình.

Đọc thêm Từ cơ bản đến nâng cao phát triển plugin WordPress: Chia sẻ kinh nghiệm thực tế và kỹ thuật cốt lõi

Xây dựng môi trường phát triển cục bộ

Chúng tôi khuyên bạn nên sử dụng các phần mềm máy chủ cục bộ như Local by Flywheel, XAMPP hoặc MAMP. Những công cụ này giúp bạn dễ dàng thiết lập môi trường hoạt động cho WordPress trên máy tính của mình, bao gồm các dịch vụ Apache, MySQL và PHP. So với các máy chủ trực tuyến, phát triển trên máy tính cục bộ cho phép bạn thực hiện các thử nghiệm và điều chỉnh nhanh chóng mà không lo ả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%

Sau khi cài đặt WordPress trên máy tính của bạn, bạn cần phải…wp-content/pluginsTrong thư mục đó, hãy tạo một thư mục riêng biệt dành cho plugin mới của bạn. Đề nghị sử dụng một tên tiếng Anh ngắn gọn, viết thường và không chứa khoảng trắng, ví dụ như:my-first-plugin

Tìm hiểu về cấu trúc cơ bản của các plugin

Một plugin WordPress đơn giản nhất có thể chỉ bao gồm một tệp chính duy nhất. Tệp này phải chứa các chú thích đặc biệt ở đầu (header comments), và WordPress sẽ sử dụng chúng để nhận diện thông tin về plugin. Bạn cũng cần áp dụng các biện pháp bảo mật, chẳng hạn như bảo vệ truy cập trực tiếp, thường thông qua việc kiểm tra các yêu cầu truy cập từ người dùng.ABSPATHLiệu các hằng số (constants) có được định nghĩa nhằm mục đích thực hiện (tức là được sử dụng trong các chương trình hoặc quá trình xử lý dữ liệu) hay không?

Dưới đây là một ví dụ về tệp chính của một plugin được tối ưu hóa (minimized), tệp này có thể được đặt tên là…my-first-plugin.phpVà hãy đặt nó vào thư mục vừa được tạo.

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

// 防止直接访问此文件
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

Hãy đặt thư mục chứa tệp này vào…wp-content/pluginsSau khi thêm mục đó vào danh mục, bạn sẽ thấy nó trên trang “Các tiện ích mở rộng” (Plugins) trong giao diện quản trị WordPress, và có thể kích hoạt nó.

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

Tạo ra chức năng cốt lõi đầu tiên

Bây giờ, hãy cùng thêm một số chức năng thực tế cho plugin này. Chúng ta sẽ tạo một chức năng đơn giản: tự động thêm một đoạn văn bản tùy chỉnh vào cuối nội dung bài viết.

Sử dụng bộ lọc để chỉnh sửa nội dung bài viết

WordPress cung cấp rất nhiều hook liên quan đến việc xử lý dữ liệu (Filter Hooks), cho phép bạn thay đổi dữ liệu trước khi nó được lưu vào cơ sở dữ liệu hoặc hiển thị trên trình duyệt. Để thay đổi nội dung của một bài viết, chúng ta có thể sử dụng các hook này.the_contentBộ lọc.

Trong tệp plugin chính của bạn, sau khi kích hoạt các hook (điểm gắn kết lập trình), hãy thêm các hàm và lệnh gọi hook sau đây:

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_first_plugin_add_text_to_content( $content ) {
    // 确保只在主循环的单篇文章页面执行
    if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) {
        $additional_text = '<p><em>Cảm ơn bạn đã đọc bài viết này! Bài viết này được hỗ trợ bởi “My First Plugin”.</em></p>';
        $content .= $additional_text;
    }
    return $content;
}
// 将函数挂载到‘the_content’过滤器上
add_filter( 'the_content', 'my_first_plugin_add_text_to_content' );

Hàm này trước tiên thực hiện một loạt các điều kiện kiểm tra để đảm bảo rằng văn bản bổ sung chỉ xuất hiện trên các trang bài viết riêng lẻ, và không ảnh hưởng đến trang chủ, trang lưu trữ hoặc các trang khác. Sau đó, nó thêm một đoạn HTML tùy chỉnh vào nội dung gốc.$contentThay đổi giá trị của biến, sau đó trả về nội dung đã được sửa đổi.

Tạo trang cài đặt quản lý đơn giản

Để người dùng có thể tự định nghĩa văn bản muốn thêm vào, chúng ta cần tạo một tùy chọn cấu hình cho họ. Điều này đòi hỏi phải thêm một mục menu và trang cấu hình trong giao diện quản trị WordPress.

Trước hết, hãy sử dụng…add_action“Hook” chức năng được sử dụng để thêm một trang menu con vào menu quản trị viên.

Đọc thêm Nắm vững phát triển plugin WordPress: Xây dựng plugin tùy chỉnh đầu tiên của bạn từ con số không

// 创建管理菜单
function my_first_plugin_add_admin_menu() {
    add_options_page(
        '我的第一个插件设置', // 页面标题
        '我的插件设置',       // 菜单标题
        'manage_options',     // 所需权限
        'my-first-plugin',    // 菜单slug
        'my_first_plugin_settings_page' // 显示页面的回调函数
    );
}
add_action( 'admin_menu', 'my_first_plugin_add_admin_menu' );

Tiếp theo, hãy định nghĩa hàm gọi lại (callback function) dùng để hiển thị trang cấu hình (configuration settings page).my_first_plugin_settings_pageVà xử lý logic lưu trữ biểu mẫu:

// 设置页面的HTML内容
function my_first_plugin_settings_page() {
    ?&gt;
    <div class="wrap">
        <h2>Cài đặt plugin đầu tiên của tôi</h2>
        <form method="post" action="/vi/options.php/" data-trp-original-action="options.php">
            <?php
            settings_fields( 'my_first_plugin_settings_group' );
            do_settings_sections( 'my-first-plugin' );
            submit_button();
            ?>
        <input type="hidden" name="trp-form-language" value="vi"/></form>
    </div>
    &lt;?php
}

// 注册设置、区域和字段
function my_first_plugin_settings_init() {
    register_setting( &#039;my_first_plugin_settings_group&#039;, &#039;my_first_plugin_custom_text&#039; );

add_settings_section(
        &#039;my_first_plugin_section&#039;,
        &#039;自定义文本设置&#039;,
        null,
        &#039;my-first-plugin&#039;
    );

add_settings_field(
        &#039;my_first_plugin_text_field&#039;,
        &#039;要在文末添加的文本&#039;,
        &#039;my_first_plugin_text_field_render&#039;,
        &#039;my-first-plugin&#039;,
        &#039;my_first_plugin_section&#039;
    );
}
add_action( &#039;admin_init&#039;, &#039;my_first_plugin_settings_init&#039; );

// 渲染文本输入字段
function my_first_plugin_text_field_render() {
    $option = get_option( &#039;my_first_plugin_custom_text&#039;, &#039;感谢您阅读这篇文章!本文由“我的第一个插件”提供支持。&#039; );
    echo &#039;<textarea name="my_first_plugin_custom_text" rows="3" cols="50">' . esc_textarea( $option ) . '</textarea>';
}

Cuối cùng, hãy sửa đổi hàm được sử dụng để thêm văn bản trước đó sao cho nó có thể lấy dữ liệu từ các tùy chọn (options).my_first_plugin_custom_textĐọc nội dung từ:

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_first_plugin_add_text_to_content( $content ) {
    if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) {
        $custom_text = get_option( 'my_first_plugin_custom_text', '' );
        if ( ! empty( $custom_text ) ) {
            $additional_text = '<p><em>'`. wp_kses_post($custom_text)`.'</em></p>';
            $content .= $additional_text;
        }
    }
    return $content;
}

Chuẩn bị về bảo mật, tối ưu hóa và phân phối các tiện ích mở rộng (plugins).

Một plugin đáp ứng các tiêu chuẩn không chỉ cần hoạt động hiệu quả, mà còn phải đảm bảo an toàn, hiệu năng cao và dễ dàng trong việc bảo trì.

Xác thực dữ liệu, thoát ký tự và bảo mật

An toàn là yếu tố then chốt trong quá trình phát triển các tiện ích mở rộng (plugin). Đừng bao giờ tin tưởng vào dữ liệu do người dùng nhập vào hoặc dữ liệu trực tiếp lấy từ cơ sở dữ liệu. Khi truyền dữ liệu ra trang web, bạn phải thực hiện thao tác “đánh dấu ký tự đặc biệt” (escape) để đảm bảo an toàn. Trong đoạn mã trước đesc_textarea()Trên trang quản lý, hãy thực hiện việc thoát ký tự (escape) trước khi hiển thị dữ liệu, và sau đó sử dụng phương thức phù hợp để xử lý và trình bày nó.wp_kses_post()Trên trang bài viết, việc lọc HTML chỉ cho phép các thẻ nội dung bài đăng an toàn được thông qua. Đối với việc xử lý biểu mẫu, bạn nên sử dụng các công cụ do WordPress cung cấp, như các chức năng kiểm tra không hợp lệ, kiểm tra quyền truy cập, và các biện pháp bảo mật khác.sanitize_text_field()Sử dụng các hàm như vậy để làm sạch dữ liệu.

Tổ chức mã nguồn và tối ưu hóa hiệu năng

Khi số lượng chức năng của các tiện ích mở rộng (plugin) tăng lên, việc viết toàn bộ mã nguồn trong một tệp chính sẽ trở nên khó quản lý. Cách làm tốt nhất là chia mã nguồn thành các phần tương ứng với từng chức năng và lưu chúng trong các tệp riêng biệt. Ví dụ, bạn có thể tạo…includes/admin/Thư mục chứa toàn bộ mã nguồn liên quan đến giao diện quản trị (backend).includes/public/Thư mục chứa mã nguồn các chức năng phía trước (front-end).includes/class-*.phpNơi lưu trữ các định nghĩa lớp (class definitions).

Về mặt hiệu năng, bạn nên sử dụng các “hook” một cách thận trọng. Hãy đảm bảo rằng các hàm bên trong hook chỉ được thực thi khi thực sự cần thiết (ví dụ: thông qua các điều kiện được kiểm tra). Đối với các giá trị tùy chọn cần được lấy từ cơ sở dữ liệu, đặc biệt là khi chúng được sử dụng nhiều lần ở phía trước (frontend), bạn có thể lưu chúng trong biến toàn cục hoặc sử dụng cơ chế đệm (cache) để tránh việc thực hiện các truy vấn cơ sở dữ liệu nhiều lần.

Bạn đang chuẩn bị phát hành plugin của mình.

Nếu bạn dự định phát hành plugin của mình vào danh mục plugin chính thức của WordPress hoặc cung cấp nó cho nhiều người sử dụng hơn, bạn cần hoàn thiện một số khía cạnh. Đầu tiên, hãy đảm bảo rằng thông tin trong phần chú thích ở đầu plugin (header comments) là đầy đủ và chính xác. Thứ hai, hãy viết một tài liệu hướng dẫn sử dụng rõ ràng, dễ hiểu.readme.txtTệp tin này cần tuân thủ định dạng chính thức của WordPress, bao gồm mô tả chức năng của plugin, hướng dẫn cài đặt, các câu hỏi thường gặp, v.v. Cuối cùng, cần tiến hành kiểm thử kỹ lưỡng, đặc biệt là kiểm tra tính tương thích với các phiên bản PHP khác nhau, các phiên bản WordPress khác nhau, cũng như khi sử dụng kèm với các chủ đề và plugin phổ biến khác.

Tóm lại

Thông qua hướng dẫn này, chúng ta đã hoàn thành toàn bộ quá trình tạo ra một plugin WordPress có chức năng đầy đủ và bao gồm giao diện quản trị từ con số không. Chúng ta đã tìm hiểu về cấu trúc cơ bản của plugin, cách sử dụng các hook (hàm được gọi tự động trong quá trình thực thi plugin) để tương tác với phần cốt lõi của WordPress, cách tạo các trang quản trị, và cũng nhận thức được tầm quan trọng của việc bảo mật và tổ chức nội dung trong plugin. Trọng tâm của việc phát triển plugin nằm ở việc hiểu rõ cấu trúc dựa trên các sự kiện (event-driven architecture) của WordPress, và học cách chèn đoạn mã tùy chỉnh vào những thời điểm thích hợp. Từ đây, bạn có thể tiếp tục khám phá các chủ đề nâng cao hơn như việc tùy chỉnh loại bài viết (article types), dữ liệu meta (metadata), các điểm cuối API (API endpoints), và việc tạo bảng trong cơ sở dữ liệu (database tables), từ đó xây dựng những plugin chuyên nghiệp với nhiều tính năng mạnh mẽ.

FAQ 常见问题

Để phát triển một plugin cho WordPress, bạn cần nắm vững một số kiến thức cơ bản sau:

Bạn cần nắm vững ngữ pháp cơ bản của ngôn ngữ lập trình PHP, các khái niệm về lập trình hướng đối tượng, đồng thời có hiểu biết cơ bản về HTML, CSS và JavaScript. Việc quen thuộc với các thao tác cơ bản của WordPress và các khái niệm cốt lõi như bài viết, trang web, hệ thống phân loại (categories) sẽ rất hữu ích. Điều quan trọng nhất là bạn cần hiểu rõ cơ chế “Hook” (Actions và Filters) trong WordPress – đây là cách chính mà các plugin tương tác với hệ thống WordPress.

Sự khác biệt giữa chức năng của plugin và theme, nên chọn như thế nào

Chủ đề chủ yếu kiểm soát giao diện và bố cục của trang web, trong khi các plugin được sử dụng để thêm các tính năng mới. Một nguyên tắc tốt là: nếu một tính năng có mối liên hệ chặt chẽ với cách trang web được hiển thị (về mặt thị giác), thì nó nên được đưa vào chủ đề; ngược lại, những tính năng độc lập (như biểu mẫu liên hệ, tối ưu hóa SEO, thương mại điện tử) nên được tạo thành plugin. Việc triển khai các tính năng dưới dạng plugin giúp đảm bảo rằng chúng sẽ không bị mất đi khi bạn thay đổi chủ đề – đây là thực hành tốt nhất trong phát triển WordPress.

Tôi có thể tạo nhiều tệp PHP trong một plugin không?

Hoàn toàn có thể, và đây thực sự là cách làm được khuyến nghị đối với các plugin phức tạp. Bạn có thể tách các mô-đun chức năng khác nhau ra thành các tệp riêng biệt, sau đó sử dụng chúng thông qua tệp plugin chính để kết hợp chúng lại với nhau.require_onceinclude_onceHãy sử dụng các câu lệnh thích hợp để đưa chúng vào trong mã nguồn. Một cấu trúc tệp tin tốt sẽ giúp tổ chức mã nguồn một cách hiệu quả và nâng cao hiệu suất làm việc cùng nhóm.

Làm thế nào để gỡ lỗi (debug) plugin mà tôi đã phát triển?

Một phương pháp gỡ lỗi thường được sử dụng trong quá trình phát triển WordPress là bật tính năng gỡ lỗi (debugging).WP_DEBUGBạn có thể thực hiện điều đó trên trang web của mình.wp-config.phptệp, đặt giá trị của hằng sốdefine( 'WP_DEBUG', true );Điều này sẽ hiển thị các lỗi, cảnh báo và thông báo của PHP trên màn hình. Một cách an toàn hơn là thiết lập cả hai tùy chọn đó cùng lúc.WP_DEBUG_LOGtrue, ghi lỗi vàowp-content/debug.logNó nằm trong tệp tin. Ngoài ra, việc sử dụng các công cụ phát triển trình duyệt (browser developer tools) và các tiện ích ghi lại lệnh truy vấn (query monitors) cũng có thể giúp tăng hiệu quả công việc đáng kể.

Plugin của tôi cần phải tương thích với nhiều phiên bản WordPress khác nhau.

Điều này phụ thuộc vào đối tượng người dùng mà bạn nhắm đến. Thông thường, bạn nên đảm bảo rằng sản phẩm của mình tương thích ít nhất với hai phiên bản trước của phiên bản chính hiện hành. Bạn có thể tham khảo các số liệu thống kê chính thức từ WordPress để biết được sự phân bố các phiên bản. Trong mã nguồn, bạn có thể sử dụng các câu lệnh điều kiện để xử lý tình huống này một cách linh hofunction_exists()Để kiểm tra xem một hàm hoặc lớp có khả dụng hay không, nhằm đảm bảo tính tương thích ngược (backward compatibility), trong các plugin…readme.txtTrong tệp tin, cần phải nêu rõ phiên bản WordPress mà các bài kiểm thử được coi là thành công (đã vượt qua các tiêu chí yêu cầu).