Phát triển plugin cho WordPress: Từ cơ bản đến chuyên nghiệp – Hướng dẫn từng bước cách tạo các tính năng tùy chỉnh

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

Chuẩn bị môi trường phát triển plugin WordPress

Trước khi bắt đầu viết dòng mã đầu tiên, một môi trường phát triển phù hợp chính là nền tảng cơ bản cho công việc hiệu quả. Điều này không chỉ đảm bảo rằng plugin của bạn hoạt động ổn định trên nhiều môi trường WordPress khác nhau, mà còn giúp tăng đáng kể hiệu quả trong quá trình gỡ lỗi và kiểm thử.

Thiết lập môi trường phát triển cục bộ

Chúng tôi khuyên bạn nên thực hiện quá trình phát triển ứng dụng trên máy tính cá nhân (máy cục bộ) thay vì trực tiếp trên máy chủ trực tuyến. Bạn có thể sử dụng các công cụ như XAMPP, MAMP, Local by Flywheel hoặc Docker để nhanh chóng thiết lập một môi trường máy chủ cục bộ chứa PHP, MySQL, và các phần mềm máy chủ như Apache/Nginx. Hãy đảm bảo rằng phiên bản PHP bạn sử dụng tương thích với phiên bản WordPress mà bạn muốn triển khai; thông thường, WordPress sẽ đề xuất một phạm vi cụ thể về phiên bản PHP phù hợp.

Lựa chọn Trình soạn thảo và Công cụ Code

Việc lựa chọn một trình soạn thảo mã mạnh mẽ là rất quan trọng; bạn có thể chọn các công cụ như VS Code, PhpStorm hoặc Sublime Text. Những công cụ này thường cung cấp các tính năng như tô sáng cú pháp, gợi ý mã nguồn, và tích hợp với hệ thống quản lý phiên bản (version control). Ngoài ra, việc cài đặt các đoạn mã (Snippets) hoặc tiện ích mở rộng (plugins) liên quan đến WordPress sẽ giúp bạn làm việc nhanh chóng và hiệu quả hơn.add_actionadd_filterViệc viết các hàm thông dụng như vậy…

Đọc thêm Làm chủ phát triển plugin WordPress từ con số 0: Xây dựng chức năng tùy chỉnh và các phương pháp tốt nhất

Tạo tệp chính cho plugin

Mọi plugin WordPress đều phải có một tệp PHP chính, và ở đầu tệp đó phải chứa các ghi chú thông tin tiêu chuẩn về plugin. Tệp này chính là điểm khởi đầu (entry point) của plugin. Ví dụ, nếu chúng ta dự định tạo một plugin có tên “My Custom Greeting”, thì tệp PHP chính có thể được đặt tên là…my-custom-greeting.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%
<?php
/**
 * Plugin Name: My Custom Greeting
 * Plugin URI:  https://yourwebsite.com/my-custom-greeting
 * Description: 一个简单的插件,用于在网站前台显示自定义问候语。
 * Version:     1.0.0
 * Author:      Your Name
 * License:     GPL v2 or later
 * Text Domain: my-custom-greeting
 */

Đoạn chú thích này là cần thiết; WordPress sử dụng nó để nhận diện các plugin và hiển thị chúng trên giao diện quản trị nền.

Cấu trúc cơ bản của plugin và các quy định bảo mật

Một plugin có cấu trúc rõ ràng và tuân thủ các tiêu chuẩn bảo mật là nền tảng cho việc bảo trì lâu dài và giành được sự tin tưởng của người dùng. Việc tuân theo các tiêu chuẩn lập trình và thực hành bảo mật chính thức của WordPress có thể giúp tránh được các lỗ hổng phổ biến một cách hiệu quả.

Sử dụng các lớp (classes) để tổ chức mã nguồn.

Mặc dù bạn có thể sử dụng lập trình hàm thuần túy, nhưng việc sử dụng các lớp theo hướng đối tượng (OOP) để đóng gói chức năng của các tiện ích mở rộng (plugin) là cách tiếp cận hiện đại và được khuyến nghị hơn. Điều này giúp tránh xung đột tên hàm và làm cho cấu trúc mã trở nên rõ ràng hơn. Chúng ta hãy tạo một lớp chính (main class) để quảnMy_Custom_Greeting

if ( ! class_exists( 'My_Custom_Greeting' ) ) {
    class My_Custom_Greeting {
        public function __construct() {
            // 构造函数,在这里挂载钩子
        }
    }
    // 初始化插件
    new My_Custom_Greeting();
}

! class_exists()Việc kiểm tra này nhằm mục đích ngăn chặn tình trạng các lớp (class) bị định nghĩa trùng lặp.

Đọc thêm Hướng dẫn nhập môn phát triển plugin 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

Thực hiện các biện pháp kiểm tra bảo mật và quyền truy cập

Tất cả các hàm có thể xử lý yêu cầu từ người dùng ở phía trước (frontend) hoặc phía sau (backend) đều phải thực hiện các kiểm tra về quyền truy cập và các yếu tố liên quan đến bảo mật. WordPress đã cung cấp các công cụ cần thiết để thực hiện những điều này.wp_verify_nonce()current_user_can()Các hàm như vậy được sử dụng để hỗ trợ việc thực hiện các chức năng cần thiết. Điều này là bắt buộc trong mọi trang cấu hình plugin hoặc logic xử lý biểu mẫu.

Cấu trúc thư mục và tệp tin plugin

Một cấu trúc thư mục hợp lý giúp việc quản lý trở nên dễ dàng hơn. Một thư mục plugin điển hình có thể bao gồm:
– Tệp chính (Main File) my-custom-greeting.php (Nằm trong thư mục gốc của plugin)
- includes/ Mục lục: Chứa các tệp liên quan đến các lớp chức năng cốt lõi.
- admin/ Mục lục: Chứa các đoạn mã liên quan đến phần backend (phần lập trình phía máy chủ).
- public/ Mục lục: Chứa các đoạn mã liên quan đến giao diện người dùng (frontend).
- assets/ Mục lục: Chứa các tệp CSS, JavaScript và hình ảnh.
- languages/ Mục lục: Nơi lưu trữ các tệp dịch thuật quốc tế (.po/.mo)

Chức năng cốt lõi: Thực hành Hook và Bộ lọc

Cơ chế plugin của WordPress dựa trên các “hook” (khớp nối), bao gồm Action (hành động) và Filter (bộ lọc). Việc hiểu rõ và sử dụng thành thạo các hook là yếu tố then chốt trong quá trình phát triển plugin.

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 action hook để thêm tính năng

Các “hook hành động” (action hooks) cho phép bạn thực thi mã tùy chỉnh vào những thời điểm cụ thể, chẳng hạn như khi ứng dụng được khởi tạo, trang được tải, hoặc bài viết được đăng lên. Chúng tôi sử dụng chúng để tự động thực hiện các tác vụ cần thiết một cách hiệu quả.add_action()Chúng ta sử dụng các hàm để thực hiện việc gắn (mounting) các tài nguyên. Ví dụ, trong…wp_footerHãy thêm lời chào của chúng ta vào vị trí có dấu “hook”.

My_Custom_GreetingMounting in the class constructor:

public function __construct() {
    add_action( 'wp_footer', array( $this, 'display_greeting' ) );
}

Sau đó, hãy định nghĩa các phương thức gọi lại (callback methods) tương ứng.display_greeting

Đọc thêm Hướng dẫn hoàn chỉnh phát triển plugin WordPress: Xây dựng tiện ích mở rộng chuyên nghiệp từ đầu

public function display_greeting() {
    $name = get_option( 'my_greeting_name', '访客' );
    echo '<p id="custom-greeting">Chào bạn, '. esc_html($name)'. ‘! Chào mừng bạn đến với trang web của chúng tôi.</p>';
}

Sử dụng hook bộ lọc để sửa đổi nội dung

Các hook của bộ lọc (filter hooks) cho phép bạn thay đổi dữ liệu được tạo ra bởi WordPress hoặc các plugin khác. Chúng tôi sử dụng chúng để tùy chỉnh quá trình xử lý dữ liệu trong hệ thống.add_filter()Hàm. Ví dụ, hàm dùng để thay đổi phần mở rộng mặc định của tiêu đề bài viết.

add_filter( 'the_title', array( $this, 'modify_post_title' ), 10, 2 );

public function modify_post_title( $title, $id ) {
    if ( ! is_admin() && in_the_loop() ) {
        $title .= ' [推荐阅读]';
    }
    return $title;
}

Tham số ở đây10Đó là vấn đề về thứ tự ưu tiên (priority).2Điều này có nghĩa là hàm gọi lại (callback function) nhận hai tham số.$title$id)。

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.

Tạo các hook tùy chỉnh

Một plugin chuyên nghiệp cũng nên cung cấp các “hook” (điểm kết nối) riêng, để các nhà phát triển khác có thể mở rộng chức năng của nó.do_action()Tạo một hook hành động (action hook) và sử dụng nó.apply_filters()Tạo các hook (điểm kết nối) cho bộ lọc (filter).

// 在插件某处执行一个自定义动作
do_action( 'my_custom_greeting_before_display', $name );

// 提供一个可过滤的问候语文本
$greeting_text = apply_filters( 'my_custom_greeting_text', '你好,' . $name . '!', $name );

Tạo giao diện quản lý cho plugin

Hầu hết các plugin đều cần một trang cấu hình nền để người dùng có thể điều chỉnh hoạt động của plugin đó. WordPress cung cấp một API phong phú để tạo các trang menu và trang tùy chọn (option pages).

Thêm menu quản lý

Sử dụngadd_action( ‘admin_menu’, … )Chúng ta sử dụng các “hook” (các công cụ tích hợp sẵn trong hệ thống) để thêm các mục menu vào ứng dụng. Chúng tôi đã tạo một trang menu con nằm trong mục “Cài đặt” (Settings) cho plugin của mình.

add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );

public function add_admin_menu() {
    add_options_page(
        '自定义问候语设置', // 页面标题
        '问候语设置',       // 菜单标题
        'manage_options',   // 所需权限
        'my-custom-greeting', // 菜单slug
        array( $this, 'render_settings_page' ) // 回调函数,用于输出页面内容
    );
}

Xây dựng trang cấu hình và biểu mẫu

Trong hàm gọi lại (callback function)render_settings_pageTrong trường hợp này, chúng ta cần tạo một biểu mẫu và sử dụng API cấu hình của WordPress để lưu trữ dữ liệu một cách an toàn. Đầu tiên, hãy đăng ký một cấu hình (setting) mới.

add_action( 'admin_init', array( $this, 'register_settings' ) );

public function register_settings() {
    register_setting(
        'my_custom_greeting_options_group', // 选项组名
        'my_greeting_name',                 // 选项名
        array( 'sanitize_callback' => 'sanitize_text_field' ) // 清理回调
    );
}

Sau đó, hiển thị biểu mẫu trong hàm hiển thị trang (page rendering function):

public function render_settings_page() {
    ?&gt;
    <div class="wrap">
        <h2>Cài đặt lời chào tùy chỉnh</h2>
        <form method="post" action="/vi/options.php/" data-trp-original-action="options.php">
            <?php settings_fields( 'my_custom_greeting_options_group' ); ?>
            <table class="form-table">
                <tr>
                    <th scope="row"><label for="greeting_name">Tên đối tượng được chào hỏi</label></th>
                    <td>
                        <input type="text" id="greeting_name" name="my_greeting_name" value="<?php echo esc_attr( get_option( 'my_greeting_name', '访客' ) ); ?>" class="regular-text" />
                        <p class="description">Tên được nhập vào ở đây sẽ được hiển thị trong lời chào hỏi trên giao diện người dùng (frontend).</p>
                    </td>
                </tr>
            </table>
            <?php submit_button(); ?>
        <input type="hidden" name="trp-form-language" value="vi"/></form>
    </div>
    &lt;?php
}

Thêm script và bảng định dạng (stylesheet).

Để làm cho giao diện quản lý trở nên đẹp hơn hoặc có tính tương tác cao hơn, cần thêm CSS và JavaScript vào trang cấu hình.admin_enqueue_scriptsHãy sử dụng các “hook” (cơ chế kết nối giữa các đoạn mã) và kiểm tra giá trị “slug” của trang web để đảm bảo rằng trang chỉ được tải khi plugin của chúng ta được kích hoạt.

add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) );

public function enqueue_admin_assets( $hook ) {
    if ( 'settings_page_my-custom-greeting' !== $hook ) {
        return;
    }
    wp_enqueue_style( 'my-custom-greeting-admin', plugin_dir_url( __FILE__ ) . 'assets/css/admin-style.css' );
    wp_enqueue_script( 'my-custom-greeting-admin', plugin_dir_url( __FILE__ ) . 'assets/js/admin-script.js', array( 'jquery' ), '1.0.0', true );
}

Tóm lại

Theo các bước được trình bày trong bài viết này, chúng ta đã hoàn thành quy trình phát triển một plugin WordPress hoàn chỉnh: từ việc thiết lập môi trường, xây dựng cấu trúc bảo mật cơ bản, đến việc sử dụng các hook (hàm gắn kết) của WordPress để triển khai các chức năng chính, và cuối cùng là tạo ra giao diện quản lý thân thiện với người dùng. Trọng tâm của việc phát triển plugin nằm ở việc hiểu sâu về hệ thống hook của WordPress và tuân thủ các tiêu chuẩn bảo mật cũng như quy tắc lập trình của nó. Từ plugin nhỏ này, bạn có thể tiếp tục mở rộng chức năng của nó bằng cách thêm các lớp (classes) mới, sử dụng các thao tác trên cơ sở dữ liệu phức tạp hơn, tích hợp REST API, hoặc tạo các khối nội dung tùy chỉnh (như Gutenberg Block), để cuối cùng xây dựng thành một plugin chuyên nghiệp với nhiều tính năng mạnh mẽ và dễ bảo trì.

FAQ 常见问题

Làm thế nào để gỡ lỗi (debug) plugin WordPress của tôi?
Kích hoạt chế độ gỡ lỗi (debug mode) của WordPress là cách hiệu quả nhất để giải quyết các vấn đề phát sinh trong quá trình sử dụng nền tảng này.wp-config.phptệp, đặt giá trị của hằng sốWP_DEBUGHằng số được thiết lậptrueĐiều này sẽ hiển thị trực tiếp các lỗi PHP, cảnh báo và thông báo trên trang web. Đối với việc gỡ lỗi phức tạp hơn, bạn có thể sử dụng các công cụ hoặc phương pháp phù hợp.error_log()Hàm sẽ ghi thông tin vào nhật ký lỗi của máy chủ, hoặc sử dụng các công cụ gỡ lỗi PHP chuyên nghiệp như Xdebug.

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

Trong quá trình phát triển, bạn nên tránh sử dụng những hàm PHP quá mới hoặc đã lỗi thời, bị loại bỏ (deprecated). Hãy tham khảo sách hướng dẫn chính thức của PHP để biết phiên bản tối thiểu mà các hàm đó được hỗ trợ. Trong tệp chính của plugin hoặc tài liệu đi kèm, bạn có thể ghi rõ thông tin này để người dùng biết được.Requires PHP:Các thẻ tiêu đề (header tags) được sử dụng để chỉ định phiên bản PHP tối thiểu cần thiết cho plugin. Nhờ đó, WordPress sẽ hiển thị cảnh báo nếu phiên bản PHP không đáp ứng yêu cầu.

Làm thế nào để plugin của tôi hỗ trợ việc dịch thuật và hiển thị nội dung bằng nhiều ngôn ngữ khác nhau?

WordPress sử dụng framework GNU gettext để hỗ trợ tính năng quốc tế hóa (i18n). Đầu tiên, cần thêm đoạn mã để xác định các chuỗi văn bản cần được dịch ở tất cả những nơi cần thực hiện việc dịch.__()_e()_x()Bao bọc bằng các hàm như. Sau đó, sử dụng công cụ như Poedit để quét mã và tạo.potCác tệp mẫu; sau đó tạo các tệp tương ứng cho mỗi ngôn ngữ..po.moFile. Cuối cùng, hãy sử dụng nó khi plugin được tải vào hệ thống.load_plugin_textdomain().

Khi gửi plugin lên thư mục chính thức của WordPress, cần lưu ý những điểm sau:

Trước khi gửi, vui lòng đảm bảo rằng mã nguồn tuân thủ nghiêm ngặt các tiêu chuẩn lập trình và quy định về tài liệu của WordPress. Các plugin phải sử dụng giấy phép GPLv2 hoặc phiên bản cao hơn. Bạn cần cung cấp thông tin chi tiết về…readme.txtTệp tin này bao gồm mô tả chi tiết về sản phẩm, hướng dẫn cài đặt, hình ảnh minh họa, và các câu hỏi thường gặp. Đoạn mã bạn cung cấp phải đảm bảo an toàn, không chứa bất kỳ hành vi xấu nào, và không được phụ thuộc vào các công cụ hoặc lệnh ngắn (shortcodes) – sản phẩm phải có thể sử dụng ngay sau khi được cài đặt. Sau khi bạn nộp tệp tin, đội ngũ kiểm duyệt sẽ tiến hành kiểm tra kỹ lưỡng.