Hướng dẫn phát triển plugin WordPress: Từng bước hướng dẫn bạn tạo plugin của riêng mình từ con số không

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

Hiểu rõ về cơ sở của các plugin và cách thiết lập môi trường phát triển là điều rất quan trọng.

Trước khi bắt đầu viết mã, việc nắm vững các khái niệm cơ bản về plugin của WordPress và chuẩn bị một môi trường phát triển địa phương phù hợp là rất quan trọng. Về bản chất, một plugin là một thư mục chứa một hoặc nhiều tệp PHP, và nó mở rộng hoặc thay đổi các chức năng cốt lõi của WordPress thông qua hệ thống Hook được cung cấp bởi WordPress. Plugin khác với theme (giao diện website): plugin tập trung vào việc thêm chức năng mới, chứ không thay đổi giao diện của trang web; ngay cả khi bạn thay đổi theme, các chức năng của plugin thường vẫn được giữ nguyên.

Để bắt đầu quá trình phát triển, trước tiên bạn cần một môi trường WordPress cục bộ. Điều này có thể được thực hiện một cách dễ dàng bằng các công cụ như Local by Flywheel, MAMP, XAMPP, hoặc trực tiếp sử dụng các container Docker. Sau khi cài đặt WordPress trên máy cục bộ xong, bạn cần truy cập vào…wp-content/pluginsMục lục. Đây là nơi lưu trữ tất cả các tiện ích mở rộng (plugin). Hãy tạo một thư mục mới, ví dụ như…my-first-pluginTrong thư mục này, bạn phải tạo một tệp PHP chính, tên của tệp này thường giống với tên của thư mục đó. Ví dụ:my-first-plugin.phpTệp chính này là điểm vào (entry point) của plugin, và nó chứa một nhóm các tiêu đề chú thích (comment headers) đặc biệt, được sử dụng để thông báo cho WordPress về tên plugin, mô tả, phiên bản, tác giả, và các thông tin khác liên quan đến plugin đó.

Đề nghị bật tính năng này trong môi trường phát triển.WP_DEBUGMô hình này được tìm thấy trong thư mục gốc của WordPress.wp-config.phpTrong tệp tin, hãy tìm hoặc thêm dòng sau:

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

define( ‘WP_DEBUG’, true );
define( ‘WP_DEBUG_LOG’, true );
define( ‘WP_DEBUG_DISPLAY’, false );

Điều này sẽ ghi lại các lỗi và cảnh báo vào…wp-content/debug.logTrong tệp tin này, có những thông tin hữu ích giúp bạn nhanh chóng xác định vấn đề trong quá trình phát triển. Đồng thời, việc sử dụng một trình soạn thảo mã mạnh mẽ hoặc môi trường phát triển tích hợp (IDE) như VS Code, PhpStorm có thể nâng cao đáng kể hiệu quả phát triển. Những công cụ này thường cung cấp sự hỗ trợ ngữ pháp tốt và các tính năng gợi ý khi làm việc với PHP và WordPress.

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 tệp plugin đầu tiên của bạn

Chúng ta sẽ thực hiện toàn bộ quy trình từ việc tạo ra một tệp tin đến việc kích hoạt plugin bằng cách tạo một plugin đơn giản có tên “Hello World”. Plugin này sẽ hiển thị một thông điệp chào mừng ở phía trên góc trái của giao diện quản trị trang web.

Trong thư mục plugin của bạn…my-first-pluginTrong quá trình này, bạn cần tạo tệp chính (main file).my-first-plugin.phpCấu trúc cơ bản của nội dung tệp phải bắt đầu từ các ghi chú ở phần đầu của plugin.

<?php
/**
 * Plugin Name:       我的第一个插件
 * Plugin URI:        https://yourwebsite.com/my-first-plugin
 * Description:       这是一个用于学习插件开发的示例插件,它将在后台显示欢迎信息。
 * Version:           1.0.0
 * Author:            开发者姓名
 * Author URI:        https://yourwebsite.com
 * License:           GPL v2 or later
 * Text Domain:       my-first-plugin
 * Domain Path:       /languages
 */

Những tiêu đề chú thích này là bắt buộc; WordPress sử dụng chúng để nhận diện và hiển thị plugin của bạn trên trang quản lý plugin. Trong số đó,Text DomainDùng cho việc hỗ trợ đa ngôn ngữ (internationalization – i18n).Domain PathChỉ định thư mục chứa tệp ngôn ngữ (nếu cần).

Tiếp theo, chúng ta sẽ thêm các tính năng cốt lõi. Trong ví dụ này, chúng ta sẽ sử dụng…admin_notices“Hook.” Hãy thêm đoạn mã sau vào phần chú thích ở đầu:

Đọ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 qua bài tập thực tế

// 使用 admin_notices 钩子在管理后台输出提示信息
add_action( ‘admin_notices’, ‘my_first_plugin_display_admin_greeting’ );

/**
 * 在管理后台显示欢迎信息的函数
 * @return void
 */
function my_first_plugin_display_admin_greeting() {
    // 检查当前用户是否有权限,确保只在后台显示
    if ( ! current_user_can( ‘manage_options’ ) ) {
        return;
    }
    ?&gt;
    <div class="notice notice-success is-dismissible">
        <p><?php _e( ‘欢迎使用我的第一个插件!插件开发之旅正式开始!’, ‘my-first-plugin’ ); ?></p>
    </div>
    &lt;?php
}

Sau khi lưu file, hãy đăng nhập vào trang quản trị WordPress của bạn và truy cập trang “Plugins” (Các tiện ích mở rộng). Bạn sẽ thấy tiện ích có tên “My First Plugin” xuất hiện trong danh sách các tiện ích. Nhấp vào nút “Enable” (Kích hoạt). Sau khi kích hoạt, hãy làm mới bất kỳ trang quản trị nào (chẳng hạn như bảng điều khiển – Dashboard). Bạn sẽ thấy một thông báo thành công màu xanh lá, nội dung của thông báo chính là lời chào mừng mà chúng ta đã định nghĩa trong đoạn mã của mình. Đây là một ví dụ minh họa cho một tính năng đơn giản nhưng hoàn chỉnh; nó giúp xác nhận rằng môi trường phát triển và cấu trúc của tiện ích là đúng.

Các công nghệ cốt lõi của WordPress: Hook và Filter

Việc hiểu rõ và sử dụng thành thạo các Hook (Câu khóa) là yếu tố cốt lõi trong quá trình phát triển plugin cho WordPress. Có hai loại Hook chính: Actions (Hành động) và Filters (Bộ lọc). Hook loại Action cho phép bạn chèn và thực thi mã tùy chỉnh vào những thời điểm nhất định, chẳng hạn như sau khi bài viết được đăng hoặc trước khi nội dung trang được hiển thị. Chúng ta đã sử dụng loại Hook này trong ví dụ trên.admin_noticesĐó chỉ đơn giản là một “khớp nối hành động” (action hook). Trong khi đó, “khớp nối bộ lọc” (filter hook) cho phép bạn thay đổi dữ liệu được tạo ra hoặc truyền qua trong quá trình xử lý, chẳng hạn như thay đổi nội dung tiêu đề của bài viết hoặc kết quả truy vấn từ một plugin.

Làm thế nào để thêm một hành động tùy chỉnh?

Hành động đã được thực hiện thành công.add_action()Thêm hàm. Cú pháp là:add_action( ‘hook_name’, ‘your_function_name’, priority, accepted_args )“Ưu tiên (priority)” là một số nguyên; số càng nhỏ thì việc thực hiện (hoặc xử lý) càng sớm. Giá trị mặc định là 10. Ví dụ, nếu bạn muốn thêm một đoạn HTML tùy chỉnh sau nội dung bài viết:

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%.
add_action( ‘the_content’, ‘my_custom_content_append’ );
function my_custom_content_append( $content ) {
    // 只在单篇文章主循环内生效
    if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) {
        $extra_content = ‘<div class="“my-custom-box”"><p>Đây là nội dung tùy chỉnh được thêm vào thông qua plugin.</p></div>’;
        $content .= $extra_content;
    }
    return $content;
}

Lưu ý, mặc dù…the_contentĐó là một bộ lọc (nó cần trả về dữ liệu sau khi đã được sửa đổi).$contentWordPress cũng sử dụng điều này như một điểm kích hoạt hành động (action trigger point). Cách tiếp cận chính xác hơn là sử dụng (using…).add_filter

Làm thế nào để thêm một bộ lọc tùy chỉnh?

Filter has been successfully applied.add_filter()Thêm hàm. Cú pháp như sau:add_action()Tương tự. Một ví dụ phổ biến là việc thay đổi độ dài của đoạn trích bài viết.

add_filter( ‘excerpt_length’, ‘my_custom_excerpt_length’, 999 );
function my_custom_excerpt_length( $length ) {
    // 将默认的55个词改为20个词
    return 20;
}

Bạn có thể tạo ra những “hook” (các điểm kết nối trong mã nguồn) riêng của mình, để cho phép plugin của bạn cũng có thể được mở rộng bởi các nhà phát triển khác hoặc các giao diện người dùng (theme). Hãy sử dụng những công cụ và phương pháp phù hợp để thực hiện điều này.do_action()Hãy định nghĩa một hook hành động (action hook) bằng cách sử dụng…apply_filters()Hãy định nghĩa một hook (khớp nối) cho bộ lọc. Đây là yếu tố then chốt trong việc xây dựng các plugin có tính chất mô-đun hóa và có thể mở rộng.

Đọ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

Nâng cao chức năng của các tiện ích mở rộng (plugins) và các thực tiễn tốt nhất (best practices)

Khi các tính năng của plugin trở nên ngày càng phức tạp, việc tổ chức mã nguồn một cách tốt, đảm bảo an ninh, khả năng bảo trì và hiệu suất trở nên vô cùng quan trọng. Một phương pháp phổ biến là sử dụng lập trình hướng đối tượng (Object-Oriented Programming – OOP) để tổ chức cấu trúc mã nguồn, bằng cách đóng gói các chức năng và dữ liệu liên quan vào một lớp chính.

Sử dụng lập trình hướng đối tượng để đóng gói mã nguồn.

Việc tạo một lớp chính (main class) sẽ giúp quản lý tốt hơn trạng thái và các phương thức của các plugin, đồng thời tránh được xung đột tên hàm. Dưới đây là một ví dụ đơn giản về cấu trúc lập trình hướng đối tượng (OOP):

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.
<?php
/**
 * Plugin Name:       进阶示例插件
 */
if ( ! class_exists( ‘My_Advanced_Plugin’ ) ) {
    class My_Advanced_Plugin {
        /**
         * 构造方法,用于初始化钩子
         */
        public function __construct() {
            add_action( ‘init’, array( $this, ‘register_custom_post_type’ ) );
            add_action( ‘admin_menu’, array( $this, ‘add_admin_menu_page’ ) );
            add_filter( ‘the_title’, array( $this, ‘filter_post_title_prefix’ ), 10, 2 );
        }

/**
         * 注册一个自定义文章类型
         */
        public function register_custom_post_type() {
            $args = array(
                ‘public’ => true,
                ‘label’  => ‘我的产品’,
                ‘supports’ => array( ‘title’, ‘editor’, ‘thumbnail’ ),
                ‘has_archive’ => true,
            );
            register_post_type( ‘my_product’, $args );
        }

/**
         * 在文章标题前添加前缀的过滤器
         * @param string $title 原标题
         * @param int    $id    文章ID
         * @return string 修改后的标题
         */
        public function filter_post_title_prefix( $title, $id = null ) {
            if ( ! is_admin() && in_the_loop() ) {
                $title = ‘[精品] ’ . $title;
            }
            return $title;
        }

// ... 其他方法
    }
    // 实例化插件类
    new My_Advanced_Plugin();
}

Cấu trúc này tổ chức các chức năng liên quan lại với nhau, giúp mã nguồn trở nên rõ ràng và dễ quản lý hơn.

Bảo vệ an ninh và hiệu suất của các tiện ích mở rộng (plugins)

An ninh là ưu tiên hàng đầu trong việc 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. Đối với tất cả các dữ liệu đến từ người dùng…$_GET$_POST$_REQUESTDữ liệu thu được cần được xác thực (Validation), làm sạch (Sanitization) và xử lý các ký tự đặc biệt (Escaping). WordPress cung cấp một loạt hàm hỗ trợ cho các công việc này:
* 验证:check_ajax_referer()wp_verify_nonce()
* 清理:sanitize_text_field()sanitize_email()absint()
* 转义:esc_html()esc_url()wp_kses_post()

Trước khi xuất bất kỳ dữ liệu nào vào HTML, thuộc tính (attributes) hoặc URL, hãy đảm bảo sử dụng các hàm thoát (escape functions) phù hợp. Đối với vấn đề hiệu năng, hãy sử dụng các công cụ hỗ trợ (hooks) một cách thông minh để tránh việc thực hiện các truy vấn tốn nhiều tài nguyên mỗi khi trang được tải. Hãy xem xét việc sử dụng API Lưu trữ Tạm thời (Transients API) của WordPress để lưu trữ các kết quả truy vấn không quan trọng và có thể được lặp lại trong một thời gian nhất định.

Thực hiện trang cấu hình cho plugin

Hầu hết các plugin đều yêu cầu một trang cấu hình để người dùng có thể thực hiện các thay đổi cần thiết. Điều này thường được thực hiện thông qua…add_options_page()add_menu_page()Các hàm như vậy, hãy gắn chúng vào…admin_menuCác tính năng liên quan đến “hook” (các hàm được gọi tự động trong quá trình xử lý nội dung) nên được triển khai một cách thận trọng để đảm bảo an toàn. Việc thiết lập các tùy chọn nên được thực hiện thông qua API Settings của WordPress để đảm bảo quá trình đăng ký, lưu trữ và xác thực dữ liệu diregister_setting()add_settings_section()add_settings_field()Các hàm như vậy không chỉ giúp đảm bảo an ninh (ví dụ: xác thực nonce), mà còn mang lại một giao diện nhất quán cho phần quản trị WordPress.

Tóm lại

Việc phát triển plugin cho WordPress là quá trình biến những ý tưởng sáng tạo thành những chức năng thực tế, bắt đầu bằng việc hiểu rõ cấu trúc cơ bản của plugin và cách thiết lập môi trường phát triển. Bằng cách tạo ra plugin đơn giản nhất (loại “Hello World”), chúng ta đã thực hành toàn bộ quy trình từ việc tạo tệp tin đến việc kích hoạt chức năng của plugin đó. Trọng tâm của quá trình phát triển nằm ở việc hiểu sâu và sử dụng một cách linh hoạt hệ thống hook mạnh mẽ của WordPress – các hàm action và filter – những công cụ giúp plugin tương tác với phần cốt lõi của WordPress cũng như các thành phần khác trong hệ thống. Khi chức năng của plugin ngày càng phong phú hơn, việc áp dụng lập trình hướng đối tượng, tuân thủ các quy tắc lập trình an toàn (kiểm tra dữ liệu, xử lý dữ liệu đầu vào, sử dụng các phương thức mã hóa), và sử dụng API Settings để xây dựng trang cấu hình trở thành những bước then chốt để đảm bảo plugin hoạt động ổn định, an toàn, dễ bảo trì và có khả năng mở rộng. Bằng cách tuân theo những hướng dẫn và thực hành tốt nhất này, bạn sẽ có thể tự tin xây dựng được các plugin WordPress chất lượng cao, từ những công cụ đơn giản đến những ứng dụng phức tạp.

FAQ 常见问题

Để phát triển một plugin cho WordPress với tên ###, bạn cần có những kiến thức cơ bản sau:
Bạn cần nắm vững những kiến thức cơ bản về ngôn ngữ lập trình PHP, vì các plugin chủ yếu được viết bằng PHP. Việc hiểu biết cơ bản về HTML, CSS và JavaScript sẽ giúp bạn tạo ra những plugin có khả năng tương tác với người dùng ở phía trước (frontend). Điều quan trọng nhất là bạn cần làm quen với các khái niệm cơ bản của WordPress, như bài viết (articles), trang (pages), hệ thống phân loại (categories), vai trò người dùng (user roles), và đặc biệt là hệ thống hook (hook system) – công cụ quan trọng trong việc mở rộng chức năng của WordPress.

Làm thế nào để gỡ lỗi (debug) một plugin WordPress đang trong quá trình phát triển?

Được khuyến nghị mạnh mẽ nên bật tính năng này trong môi trường phát triển.WP_DEBUGCác chế độ và thiết lập liên quan đã được giải thích trong phần thiết lập môi trường nội dung chính. Cách này sẽ ghi lại các lỗi, cảnh báo và thông báo của PHP vào tệp nhật ký. Ngoài ra, bạn cũng có thể sử dụng…error_log()Các hàm hoặc hàm trợ giúp (helper functions) như…var_dump()kết hợp vớiwp_die()Hãy truy xuất giá trị của các biến để kiểm tra. Tab “Console” (Ghi chú) và “Network” (Mạng) trong công cụ phát triển trình duyệt (Browser Developer Tools) cũng rất cần thiết để gỡ lỗi JavaScript và các yêu cầu AJAX.

Làm thế nào để plugin của tôi tương thích với các phiên bản WordPress khác nhau?

Trong mã nguồn của plugin, bạn nên kiểm tra xem các hàm hoặc lớp đó có tồn tại trong phiên bản WordPress hiện tại hay không trước khi sử dụng chúng. Bạn có thể sử dụng các công cụ hoặc phương thức phù hợp để thực hiện việc này.function_exists()is_admin()Để thực hiện các điều kiện kiểm tra như vậy, bạn có thể sử dụng các ghi chú trong phần tiêu đề của plugin (plugin header comments).Requires at least:Bạn cần sử dụng các trường (fields) để chỉ định phiên bản WordPress tối thiểu được yêu cầu. Việc thường xuyên kiểm tra tính tương thích giữa plugin của bạn với phiên bản mới nhất của WordPress là một thói quen tốt.

Làm thế nào để triển khai tính quốc tế hóa cho plugin của tôi, giúp nó hỗ trợ nhiều ngôn ngữ?

Bạn cần sử dụng hàm dịch của WordPress để bao bọc tất cả các chuỗi văn bản cần được dịch. Ví dụ, hãy sử dụng…__( ‘文本’, ‘your-plugin-text-domain’ )Để xuất văn bản đã dịch, sử dụng_e( ‘文本’, ‘your-plugin-text-domain’ )Hãy để nó phản hồi trực tiếp. Bạn cần thiết lập đúng cách trong phần ghi chú ở đầu plugin.Text DomainDomain PathSau đó, hãy sử dụng các công cụ như Poedit để tạo ra nó..potĐây là tệp mẫu; những người dịch có thể sử dụng nó để tạo ra các tài liệu mới..po.moTệp ngôn ngữ.

Sau khi hoàn thành việc phát triển, làm thế nào để gửi plugin của bạn lên danh mục plugin chính thức?

Trước tiên, bạn cần đăng ký một tài khoản trên trang web chính thức của WordPress và nộp plugin của mình để được xem xét. Mã nguồn của bạn phải tuân thủ các tiêu chuẩn và hướng dẫn lập trình chính thức của WordPress, bao gồm yêu cầu về bảo mật, không chứa mã độc hại, và phải tương thích với giấy phép GPL (GNU General Public License). Cấu trúc thư mục của plugin bạn cần bao gồm tệp PHP chính, một…readme.txtCác tệp tin (có định dạng phù hợp với các tiêu chuẩn cụ thể), cùng với các hình ảnh chụp màn hình (screenshot) và biểu tượng (icon) (nếu có). Quá trình xem xét có thể mất một khoảng thời gian; nhóm chuyên gia sẽ kiểm tra mã nguồn của bạn để đảm bảo rằng nó đáp