Hướng dẫn từ đầu: Tạo ra plugin WordPress đầu tiên của bạn

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

Các công việc chuẩn bị trước khi phát triển

Trước khi bắt đầu viết mã, chúng ta cần đảm bảo rằng môi trường phát triển đã được thiết lập đúng cách và hiểu rõ về cấu trúc cơ bản của các plugin WordPress. Một môi trường phát triển cục bộ phù hợp là nền tảng cho công việc hiệu quả.

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

Trước hết, bạn cần một môi trường máy chủ cục bộ để chạy WordPress. Các công cụ tích hợp như XAMPP, MAMP hoặc Local by Flywheel được khuyến nghị sử dụng. Sau khi cài đặt xong WordPress, bạn có thể… wp-content/plugins Hãy bắt đầu phát triển plugin của bạn từ thư mục này. Thư mục này chứa tất cả các plugin, dù là những plugin do bạn tự phát triển hay những plugin được cài đặt từ thư mục chính thức.

Hiểu rõ về các tệp tin cốt lõi của plugin

Mỗi plugin WordPress đều cần ít nhất một tệp chính (main file), đây chính là “tài liệu nhận dạng” và “bộ khởi động” của plugin đó. Tệp này thường được đặt tên theo chức năng của plugin. Ví dụ: my-first-plugin.phpKhối chú thích ở đầu tệp chính này rất quan trọng; nó mô tả những thông tin cơ bản về plugin cho hệ thống WordPress.

Đọc thêm 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

Tạo tệp plugin đầu tiên của bạn

Bây giờ, hãy bắt đầu từ những phần cơ bản nhất để tạo ra một plugin đơn giản nhưng có chức năng thực sự.

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%

Viết chú thích ở phần đầu của plugin.

wp-content/plugins Trong thư mục đó, hãy tạo một tệp có tên là… my-first-plugin Tạo một thư mục mới. Sau đó, hãy tạo tệp chính (main file) bên trong thư mục đó. my-first-plugin.phpỞ phần đầu tiên của tệp tin này, bạn cần thêm những dòng chú thích chứa thông tin về plugin, phải tuân thủ các tiêu chuẩn của WordPress.

<?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
 */

Đoạn mã này thông báo cho WordPress rằng đây là một plugin, đồng thời xác định các thông tin như tên, mô tả, phiên bản của plugin đó trong giao diện quản trị nền. Sau khi lưu tệp, bạn hãy đăng nhập vào WordPress Admin, truy cập trang “Plugins” (Các plugin), và plugin của bạn sẽ xuất hiện trong danh sách. Bây giờ bạn có thể kích hoạt nó; tuy nhiên, plugin này vẫn chưa có bất kỳ chức năng nào cả.

Thực hiện một chức năng cơ bản: Lọc nội dung bài viết.

Sau khi kích hoạt plugin, chúng ta cần cho nó thực hiện một số tác vụ cụ thể. Một tính năng phổ biến dành cho người mới bắt đầu là chỉnh sửa nội dung bài viết. Chúng ta sẽ sử dụng tính năng này. the_content Hook này của bộ lọc sẽ tự động thêm một đoạn văn bản tùy chỉnh vào cuối mỗi bài viết.

Trong tệp chính (main file) my-first-plugin.php Dưới phần chú thích ở đầu (header comments), chúng ta sẽ thêm đoạn mã chức năng (function code):

Đọc thêm Cách tạo một chủ đề WordPress chuyên nghiệp: Hướng dẫn đầy đủ từ con số 0 đến khi ra mắt

// 在文章内容末尾添加自定义文本
function myfp_add_custom_text_to_content( $content ) {
    // 确保只在主循环的单篇文章页面添加
    if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) {
        $custom_text = '<p><strong>Cảm ơn bạn đã đọc! Bài viết này được hỗ trợ bởi “My First Plugin”.</strong></p>';
        $content .= $custom_text;
    }
    return $content;
}
// 将我们的函数挂载到 ‘the_content’ 过滤器上
add_filter( 'the_content', 'myfp_add_custom_text_to_content' );

Đoạn mã này định nghĩa một biến có tên là… myfp_add_custom_text_to_content Đây là một hàm. Nó nhận vào nội dung của bài viết. $content Làm một tham số, thông qua các điều kiện để đảm bảo rằng văn bản chỉ được thêm vào trang hiển thị chi tiết của một bài viết trên trang web, tránh hiệu lực trên các trang khác (chẳng hạn như trang danh sách). Sau đó, nó sẽ thêm một đoạn HTML tùy chỉnh vào cuối nội dung gốc và trả về nội dung đã được sửa đổi. Cuối cùng, sử dụng… add_filter() Hàm này sẽ “gắn” (mount) hàm tùy chỉnh này vào lõi của WordPress. the_content Nó được đặt trên bộ lọc (filter). Nhờ vậy, mỗi khi WordPress chuẩn bị hiển thị nội dung bài viết, hàm của chúng ta sẽ được thực thi trước.

Sau khi lưu file, hãy truy cập trang web và xem bất kỳ bài viết nào; bạn sẽ thấy đoạn văn cảm ơn mà chúng ta đã thêm đã xuất hiện ở phía cuối trang.

Thêm tùy chọn quản lý cho plugin.

Một plugin có chức năng hoàn chỉnh thường cần một số tùy chọn cấu hình, cho phép người dùng thực hiện các thiết lập từ phía backend. Chúng tôi sẽ thêm một trang cấu hình cho tính năng “Văn bản tùy chỉnh” vừa rồi.

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ạo menu quản lý plugin

Trước hết, chúng ta cần thêm một mục menu mới vào thanh bên cạnh quản trị trong giao diện WordPress. Điều này yêu cầu sử dụng các công cụ tích hợp sẵn trong hệ thống WordPress. add_action() và hàm admin_menu Móc.

// 添加管理菜单
function myfp_add_admin_menu() {
    add_options_page(
        '我的第一个插件设置', // 页面标题
        '我的插件设置',       // 菜单标题
        'manage_options',    // 权限要求
        'my-first-plugin',   // 菜单 slug
        'myfp_options_page_html' // 显示设置页面的回调函数
    );
}
add_action( ‘admin_menu’, ‘myfp_add_admin_menu’ );

add_options_page() Hàm sẽ tạo một mục con trong menu chính “Cài đặt”. Nó yêu cầu một số tham số: tiêu đề trang, tiêu đề menu, quyền truy cập của người dùng, mã định danh duy nhất cho menu (slug), và tên hàm gọi lại được sử dụng để hiển thị nội dung HTML của trang cài đặt. myfp_options_page_html

Xây dựng trang cấu hình và lưu dữ liệu

Tiếp theo, chúng ta cần định nghĩa các hàm gọi lại (callback functions) để hiển thị trang cấu hình và xử lý dữ liệu mà người dùng đã gửi đi.

Đọc thêm Hướng dẫn phát triển plugin WordPress: Xây dựng plugin đầu tiên từ con số 0

// 渲染设置页面的HTML
function myfp_options_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( ‘myfp_settings’ );
            // 输出设置区域
            do_settings_sections( ‘my-first-plugin’ );
            // 输出提交按钮
            submit_button( ‘保存设置’ );
            ?>
        <input type="hidden" name="trp-form-language" value="vi"/></form>
    </div>
    ‘myfp_field_custom_text’ ]
    );
}
add_action( ‘admin_init’, ‘myfp_settings_init’ );

// 渲染文本框的HTML
function myfp_field_custom_text_html() {
    // 从数据库获取已保存的值
    $options = get_option( ‘myfp_options’ );
    $value = $options[‘myfp_field_custom_text’] ?? ‘’; // 使用空合并运算符,如果不存在则赋空值
    ?&gt;
    <input type="“text”"
           id="“myfp_field_custom_text”"
           name="“myfp_options[myfp_field_custom_text]”"
           value="“NO NUMERIC NOISE KEY" 1000”
 class="“regular-text”">
    &lt;?php
}

Đoạn mã này thông qua register_settingadd_settings_sectionadd_settings_field Một loạt các hàm được sử dụng để tạo một trang cài đặt theo chuẩn API của WordPress, bao gồm một ô nhập văn bản. Nội dung mà người dùng nhập vào sẽ được lưu trữ một cách an toàn. wp_options data table myfp_options Đã được ghi chép lại.

Cuối cùng, chúng ta cần sửa đổi hàm dùng để lọc nội dung bài viết trước đó, để nó sử dụng văn bản lấy từ cơ sở dữ liệu thay vì văn bản được khóa (hardcoded).

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 myfp_add_custom_text_to_content( $content ) {
    if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) {
        $options = get_option( ‘myfp_options’ );
        $custom_text = $options[‘myfp_field_custom_text’] ?? ‘’;
        if ( ! empty( $custom_text ) ) {
            $content .= ‘<p><strong>’ . esc_html( $custom_text ) . ‘</strong></p>’;
        }
    }
    return $content;
}

Hiện nay, người dùng có thể nhập bất kỳ văn bản nào vào trang “Cài đặt” -> “Cài đặt plugin của tôi”. Sau khi lưu, văn bản đó sẽ được hiển thị ở cuối mỗi bài viết trên trang web.

Những thực hành nâng cao trong việc phát triển plugin và chuẩn bị cho việc phát hành chúng

Sau khi các chức năng cơ bản được hoàn thành, chúng ta cần xem xét đến độ ổn định (robustness) và khả năng bảo trì (maintainability) của plugin, cũng như cách để chia sẻ nó cho người khác sử dụng.

Thêm hỗ trợ bảo mật và quốc tế hóa

An ninh là yếu tố quan trọng nhất trong quá trình phát triển các tiện ích mở rộng (plugin). Trong ví dụ trên, chúng ta đã sử dụng các biện pháp bảo mật cần thiết để đảm bảo an toàn cho hệ thống. esc_html()esc_attr() Hãy sử dụng các hàm được cung cấp bởi WordPress để tiến hành “đánh dấu ký tự đặc biệt” (escape) đối với dữ liệu đầu ra, nhằm ngăn chặn các cuộc tấn công XSS. Khi xử lý dữ liệu do người dùng nhập vào, thực hiện truy vấn cơ sở dữ liệu hoặc tải các tệp từ bên ngoài, bạn luôn phải áp dụng các hàm bảo mật mà WordPress cung cấp. wpdb->prepare()sanitize_text_field()check_admin_referer() v.v.

Ngoài ra, để plugin có thể được sử dụng bởi người dùng trên toàn thế giới, việc hỗ trợ đa ngôn ngữ (internationalization – i18n) là rất cần thiết. Chúng ta cần bao bọc tất cả các chuỗi văn bản dành cho người dùng trong plugin bằng các hàm dịch của WordPress. Điều này đòi hỏi chúng ta phải sửa đổi đoạn mã đã viết trước đó.

1. Đã được chỉ định trong phần ghi chú ở đầu plugin. Text Domain: my-first-plugin
2. Tải dữ liệu từ trường văn bản (text field). Thông thường, bạn sẽ thêm đoạn mã này ở cuối tệp chính (main file):add_action( ‘plugins_loaded’, function() { load_plugin_textdomain( ‘my-first-plugin’, false, dirname( plugin_basename( FILE ) ) . ‘/languages/’ ); } );
3. Chuỗi ký tự được sử dụng để đóng gói các thông tin. Ví dụ, để thay đổi tiêu đề của khu vực cài đặt… ( ‘自定义文本设置’, ‘my-first-plugin’ )Hãy thay đổi tiêu đề menu thành… ( ‘我的插件设置’, ‘my-first-plugin’ )Nhờ vào cách này, những người dịch thuật có thể thực hiện công việc của mình một cách hiệu quả hơn. .po/.mo Tệp tin cung cấp các phiên bản ngôn ngữ khác cho những chuỗi ký tự này.

Chuẩn bị để phát hành plugin vào danh mục chính thức.

Nếu bạn muốn gửi plugin của mình đến danh mục plugin chính thức của WordPress.org, bạn cần tuân theo một loạt quy định nhất định:
1. Quy tắc lập trình: Tuân thủ các tiêu chuẩn mã hóa của WordPress.
2. Cấu trúc tệp tin: Ngoài tệp tin chính, thường còn cần các tệp tin khác nữa. README.txt(Mô tả plugin, được sử dụng trên trang danh mục)uninstall.php(Xử lý các công việc dọn dẹp khi gỡ cài đặt plugin), v.v.
3. SVN 仓库:官方目录使用 Subversion (SVN) 进行版本管理,你需要将你的插件代码提交到指定的 SVN 仓库。
4. Dữ liệu metatag (Metadata):README.txt Cần phải biên soạn theo một định dạng cụ thể, bao gồm tên plugin, mô tả, cách cài đặt, câu hỏi thường gặp, nhật ký cập nhật, v.v.

Tóm lại

Thông qua hướng dẫn này, bạn đã hoàn thành một vòng đời phát triển plugin WordPress hoàn chỉnh: từ việc tạo ra tệp đầu tiên, viết chú thích trong phần đầu của tệp (header comments), sử dụng các hook hành động (action hooks) và hook lọc (filter hooks) để triển khai các chức năng cốt lõi, đến việc thêm trang cấu hình cho plugin, và cuối cùng là tìm hiểu về các kiến thức nâng cao như bảo mật, hóa đa ngôn ngữ (internationalization) và chuẩn bị cho việc phát hành plugin. Mặc dù plugin này chỉ đơn giản (dùng để thêm văn bản tùy chỉnh ở cuối bài viết), nhưng nó đã bao gồm tất cả các khái niệm và quy trình cơ bản nhất trong việc phát triển plugin. Sau khi nắm vững những kiến thức cơ bản này, bạn có thể tiếp tục khám phá hệ thống hook phong phú của WordPress, các mã ngắn (shortcodes), các loại bài viết tùy chỉnh (custom post types – CPT), và REST API để xây dựng những plugin có chức năng mạnh mẽ và phức tạp hơn. Hãy nhớ rằng thực hành là cách học tốt nhất; hãy thử sửa đổi mã nguồn và thêm các chức năng mới để củng cố kiến thức của mình.

FAQ 常见问题

Tên tệp chính của plugin phải là gì?

Tên tệp chính của plugin không bị yêu cầu phải theo một quy tắc cụ thể nào, nhưng nó phải bắt đầu bằng chữ “plugin”. .php Kết thúc. Thông thường, để đảm bảo tính rõ ràng và độ duy nhất, chúng ta sử dụng tên giống với tên thư mục chứa plugin hoặc tên có thể mô tả chức năng của plugin đó. Ví dụ: my-awesome-plugin.phpWordPress nhận diện các plugin bằng cách đọc một khối chú thích cụ thể ở phần đầu của tệp đó.

Tại sao plugin của tôi không hiển thị trong menu nền?

Điều này thường xảy ra do một số lý do. Trước hết, hãy kiểm tra xem plugin có được kích hoạt thành công hay không. Tiếp theo, hãy kiểm tra lại… add_menu_page() Hoặc các tham số liên quan đến quyền hạn người dùng (capability) trong các hàm tương tự; hãy đảm bảo rằng người dùng đang đăng nhập có đủ quyền cần thiết (ví dụ: manage_optionsCuối cùng, hãy kiểm tra xem hàm của bạn có thực sự hoạt động đúng như mong đợi hay không. add_action(‘admin_menu’, …) Mounting the plugin. Any PHP syntax error may cause the entire plugin to fail during initialization.

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

Trong giai đoạn phát triển, bạn nên bật chế độ gỡ lỗi (debug mode) của WordPress. Hãy mở tập tin cấu hình `wp-config.php` tại thư mục gốc của trang web và tìm đoạn mã sau: wp-config.php Đối với tệp tin này, hãy đảm bảo rằng các thiết lập sau đã được kích hoạt:
define( ‘WP_DEBUG’, true );
define( ‘WP_DEBUG_LOG’, true ); // 将错误记录到 /wp-content/debug.log
define( ‘WP_DEBUG_DISPLAY’, false ); // 不建议在页面上显示,以免破坏布局
Như vậy, thông báo lỗi sẽ được ghi vào tệp nhật ký, giúp việc tìm kiếm nguyên nhân sự cố trở nên dễ dàng hơn. Trước khi phát hành plugin, hãy nhớ tắt chế độ gỡ lỗi (debug mode).

Dữ liệu tùy chọn của plugin được lưu trữ ở đâu?

Sử dụng plugin add_option()update_option() Dữ liệu được lưu trữ bởi các hàm được đặt trước sẽ được lưu trong cơ sở dữ liệu của WordPress mặc định. wp_options Trong bảng (tiền tố của bảng có thể khác nhau). Hãy sử dụng nó. get_option() Các hàm có thể đọc dữ liệu này. Đối với những cấu trúc dữ liệu phức tạp hơn, đôi khi người ta cũng sẽ tạo ra các bảng cơ sở dữ liệu tùy chỉnh, nhưng điều này đòi hỏi phải xử lý một cách thận trọng hơn.

Làm thế nào để plugin của tôi hỗ trợ nhiều ngôn ngữ (hóa đa 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 dữ liệu nhắm đến người dùng. Hàm được sử dụng phổ biến nhất là… __(‘字符串’, ‘text-domain’)_e(‘字符串’, ‘text-domain’)Sau đó, sử dụng các công cụ như Poedit để trích xuất những chuỗi này và tạo ra kết quả cần thiết. .pot Tệp mẫu, và tạo phiên bản dịch sang ngôn ngữ tương ứng (ví dụ: zh_CN.po.moCuối cùng, hãy đặt tệp ngôn ngữ vào thư mục của plugin. /languages/ Nằm trong thư mục đó, và được sử dụng khi plugin được khởi tạo. load_plugin_textdomain() Các hàm được sử dụng để tải chúng (load them).