Làm chủ phát triển plugin WordPress từ con số 0: Nguyên lý, thực hành và kỹ thuật nâng cao

Đọc trong 3 phút
2026-03-13
2026-06-03
2,296
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 plugin cho WordPress là cơ chế then chốt để mở rộng chức năng cốt lõi của nó. Nhờ vào plugin, bạn có thể thêm vô số tính năng mới cho trang web mà không cần phải sửa đổi mã nguồn gốc của WordPress. Việc phát triển plugin tuân theo một loạt quy ước và thực hành tốt nhất nhằm đảm bảo tính bảo mật, hiệu suất và khả năng bảo trì. Một plugin tiêu chuẩn cần có ít nhất một tệp chính, tên của tệp này thường trùng với tên của plugin đó. Ví dụ: my-awesome-plugin.phpBài viết này sẽ bắt đầu từ các khái niệm cơ bản và hướng dẫn bạn từng bước bước vào thế giới phát triển các tiện ích mở rộng (plugins).

Hiểu rõ nguyên lý cơ bản của các plugin

Về bản chất, một plugin cho WordPress là một hoặc nhiều tệp PHP, được lưu trữ trong thư mục cấp cao nhất của trang web (thường là thư mục `wp-content/plugins`). /wp-content/plugins/ Các plugin tương tác với phần cốt lõi của WordPress thông qua API (Giao diện Lập trình Ứng dụng) và hệ thống Hook (Các điểm kết nối) mà WordPress cung cấp.

Cơ chế hoạt động của hệ thống hook

Hệ thống hook (khớp nối) là nền tảng cơ bản trong quá trình phát triển các plugin cho WordPress. Các nhà phát triển thường sử dụng hai phương thức chính để “kết nối” các chức năng của plugin vào quy trình làm việc mặc định của WordPress: Action (Hành động) và Filter (Bộ lọc). Action cho phép bạn thực thi mã tự định vào những thời điểm cụ thể trong quá trình hoạt động của website, trong khi Filter cho phép bạn thay đổi dữ liệu được truyền qua các bước xử lý đó.

Đọc thêm Phát triển plugin cho WordPress: Từ cơ bản đến chuyên nghiệp – Hướng dẫn chi tiết cách tạo ra những tính năng độc đáo cho trang web của bạn

Ví dụ, sử dụng add_action() Một hàm có thể đăng ký một “hook hành động” (action hook). Khi WordPress thực thi đến điểm hành động đó, hàm gọi lại (callback function) mà bạn đã định nghĩa sẽ được thực thi.

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%

Thông tin tiêu đề tệp chuẩn của plugin

Mỗi tệp PHP chính của plugin đều phải chứa một khối ghi chú tiêu đề (header comment) được tiêu chuẩn hóa, nhằm cung cấp thông tin meta về plugin cho WordPress. Những thông tin này quy định cách plugin được hiển thị trên trang quản lý plugin ở phía sau hậu trường (backend).

<?php
/**
 * Plugin Name: 我的超级插件
 * Plugin URI: https://www.example.com/my-super-plugin/
 * Description: 这是一个用来演示插件开发基础的示例插件。
 * Version: 1.0.0
 * Author: 张三
 * Author URI: https://www.example.com/
 * License: GPL v2 or later
 * Text Domain: my-super-plugin
 */

Việc tải và kích hoạt các plugin

Khi người dùng kích hoạt một plugin thông qua giao diện quản trị WordPress, WordPress sẽ thực thi đoạn mã trong tệp chính của plugin mỗi lần trang được tải (miễn là đoạn mã đó không nằm bên trong các hàm hoặc không được bảo vệ bởi các điều kiện nhất định). Do đó, thông thường người ta khuyến nghị nên đóng gói toàn bộ đoạn mã thực hiện các chức năng của plugin vào các hàm hoặc lớp (class), và gọi chúng thông qua các “hook” (cơ chế kết nối giữa các thành phần của hệ thống WordPress), nhằm tránh việc đoạn mã đó được thực thi khi plugin chưa được kích hoạt.

Xây dựng plugin đầu tiên của bạn

Hãy cùng bắt tay vào tạo một plugin đơn giản nhé. Chức năng của plugin này là tự động thêm một đoạn thông báo bản quyền vào cuối mỗi bài viết trên trang web.

Tạo tệp plugin chính

Đầu tiên, trong /wp-content/plugins/ Hãy tạo một thư mục mới trong thư mục hiện tại và đặt tên cho nó là… my-first-pluginSau đó, hãy tạo tập tin chính (main file) bên trong thư mục đó. my-first-plugin.phpVà hãy thêm thông tin tiêu đề tệp chuẩn nêu trên vào đó.

Đọc thêm Phát triển plugin cho WordPress: Hướng dẫn toàn diện từ cơ bản đến nâng cao – Xây dựng các mô-đun chức năng có tính tùy chỉnh cao

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

Chúng ta sẽ sử dụng the_content Bạn có thể sử dụng các bộ lọc (filters) để điều chỉnh nội dung được hiển thị trong bài viết. Hãy thêm đoạn mã sau vào tệp chính (main file) của bạn:

function myfp_add_copyright_to_content($content) {
    // 确保只在文章主循环中、且非管理后台执行
    if (is_single() &amp;&amp; !is_admin()) {
        $copyright_text = '<p><em>Bản quyền của bài viết này thuộc về trang web này. Khi sao chép, vui lòng ghi rõ nguồn gốc.</em></p>';
        $content .= $copyright_text;
    }
    return $content;
}
add_filter('the_content', 'myfp_add_copyright_to_content');

myfp_add_copyright_to_content Hàm nhận một tham số. $contentĐó chính là nội dung của bài viết. Chúng ta sử dụng các hàm để thực hiện các phép đánh giá điều kiện (condition judgment functions). is_single()Hãy đảm bảo rằng nội dung này chỉ được thêm vào trang của từng bài viết riêng lẻ, và không được thêm vào các trang khác. !is_admin() Điều này sẽ ngăn chặn việc đoạn văn bản về bản quyền được hiển thị trong trình soạn thảo nền (backend editor).

Quá trình địa phương hóa các plugin

Để plugin hỗ trợ nhiều ngôn ngữ, cần thực hiện quá trình internationalization (i18n). Đầu tiên, việc này đã được thực hiện trong phần tiêu đề của tệp chính (main file header). Text Domain: my-first-pluginSau đó, tải tệp ngôn ngữ vào khi plugin được khởi tạo (tức là khi plugin bắt đầu hoạt động).

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%.

Thông thường, chúng ta sử dụng… plugins_loaded Hãy thực hiện các thao tác cần thiết để tải nội dung dịch về một cách an toàn. Đồng thời, hãy sử dụng (các công cụ hoặc phương pháp phù hợp) để thực hiện việc này. __()_e() Sử dụng các hàm như `wrap` để bao bọc tất cả các chuỗi cần được dịch.

function myfp_load_textdomain() {
    load_plugin_textdomain(
        'my-first-plugin',
        false,
        dirname(plugin_basename(__FILE__)) . '/languages/'
    );
}
add_action('plugins_loaded', 'myfp_load_textdomain');

Chế độ phát triển plugin nâng cao

Khi các tính năng của plugin trở nên phức tạp hơn, việc áp dụng lập trình hướng đối tượng (Object-Oriented Programming – OOP) và các mô hình phát triển có cấu trúc rõ ràng hơn sẽ mang lại tính tổ chức tốt hơn, khả năng bao bọc dữ liệu (encapsulation) tốt hơn, và dễ bảo trì hơn.

Áp dụng lập trình hướng đối tượng

Việc sử dụng các lớp để bao bọc toàn bộ chức năng của plugin là một lựa chọn khôn ngoan. Điều này giúp tránh xung đột tên hàm và tạo ra cấu trúc mã nguồn rõ ràng, dễ hiểu hơn.

Đọc thêm Phân tích sâu rộng: Học cách phát triển plugin WordPress từ đầu, nắm vững những kiến thức cốt lõi và kỹ năng thực hành

class My_Advanced_Plugin {
    public function __construct() {
        // 在构造函数中绑定所有钩子
        add_action('wp_footer', array($this, 'add_footer_notice'));
        add_filter('the_title', array($this, 'modify_post_title'));
    }

public function add_footer_notice() {
        echo '<p style="text-align:center;">Được hỗ trợ kỹ thuật bởi My Advanced Plugin.</p>';
    }

public function modify_post_title($title) {
        if (in_the_loop()) {
            return '📝 ' . $title;
        }
        return $title;
    }
}
// 实例化插件类
new My_Advanced_Plugin();

Thêm trang cấu hình giao diện quản trị

Nhiều plugin yêu cầu cung cấp các tùy chọn cấu hình cho người dùng. Việc thêm trang cài đặt trong giao diện quản trị WordPress thường liên quan đến việc sử dụng các công cụ hoặc lệnh nhất định để tạo và quản lý những trang này. add_menu_page()add_submenu_page() Hàm này được sử dụng kết hợp với API Settings để lưu trữ các tùy chọn một cách an toàn.

class My_Plugin_Settings {
    public function __construct() {
        add_action('admin_menu', array($this, 'add_admin_menu'));
        add_action('admin_init', array($this, 'register_settings'));
    }

public function add_admin_menu() {
        add_options_page(
            '我的插件设置', // 页面标题
            '我的插件',     // 菜单标题
            'manage_options', // 权限
            'my-plugin-settings', // 菜单别名
            array($this, 'render_settings_page') // 回调函数
        );
    }

public function render_settings_page() {
        ?&gt;
        <div class="wrap">
            <h1>Cài đặt plugin của tôi</h1>
            <form method="post" action="/vi/options.php/" 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
    }

public function register_settings() {
        register_setting(&#039;my_plugin_options_group&#039;, &#039;my_plugin_option_name&#039;);
        // ... 添加设置字段和章节
    }
}

tạo bảng cơ sở dữ liệu tùy chỉnh

Đối với một số plugin cần lưu trữ dữ liệu phức tạp, có thể cần phải tạo các bảng dữ liệu tùy chỉnh. Công việc này nên được thực hiện khi plugin được kích hoạ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.

WordPress cung cấp một lớp hỗ trợ thao tác cơ sở dữ liệu rất tiện lợi. wpdbĐoạn mã để tạo bảng thường được đặt trong một tệp hoặc một khối mã được sử dụng thông qua các công cụ lập trình phù hợp. register_activation_hook Trong hàm đã được đăng ký.

function my_plugin_create_database_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'my_custom_data';
    $charset_collate = $wpdb->get_charset_collate();

$sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        user_id mediumint(9) NOT NULL,
        data text NOT NULL,
        created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
        PRIMARY KEY (id)
    ) $charset_collate;";

require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
register_activation_hook(__FILE__, 'my_plugin_create_database_table');

Bảo mật và phân phối các tiện ích mở rộng (plugins)

Trước khi một plugin được đưa vào sử dụng chính thức, cần phải đảm bảo tính an toàn của nó và nắm rõ quy trình phân phối cơ bản.

Thực hiện các phương pháp bảo mật tốt nhất

Mọi dữ liệu nhận được từ người dùng, dù đến từ nguồn nào đi nữa… $_GET$_POST Vẫn là cơ sở dữ liệu; tất cả dữ liệu đều phải được xác thực, làm sạch và xử lý (như việc thoát ký tự đặc biệt). Hãy luôn sử dụng các hàm mà WordPress cung cấp để thực hiện những công việc này. esc_html()wp_strip_all_tags()intval()prepare() Các phương pháp để xử lý truy vấn SQL nhằm ngăn chặn các cuộc tấn công XSS và SQL injection.

Đối với các bài kiểm tra khả năng thực hiện nhiệm vụ quản trị hoặc các thao tác quan trọng, hãy nhất định sử dụng các hàm kiểm tra khả năng (capability check functions) để đảm bảo tính chính xác và độ tin cậy của kết quả. current_user_can('manage_options')check_ajax_referer()

Chuẩn bị gói plugin để nộp lên danh mục chính thức.

Nếu bạn muốn phân phối plugin miễn phí cho người dùng trên toàn thế giới, bạn có thể nộp nó vào danh mục plugin của WordPress.org. Điều này đòi hỏi bạn phải tuân thủ một số quy định nghiêm ngặt, bao gồm sử dụng SVN để quản lý phiên bản, đảm bảo chất lượng mã nguồn, cung cấp các tệp dịch thuật, v.v. Một plugin tốt… readme.txt Tệp tin là bắt buộc phải có; nó tuân theo một định dạng cụ thể, được sử dụng để hiển thị thông tin trên trang chi tiết của plugin.

Tóm lại

Việc phát triển plugin cho WordPress bắt đầu bằng việc hiểu rõ hệ thống các hook (điểm kết nối) cốt lõi của nền tảng này, sau đó dần học cách xây dựng các chức năng mới, quản lý giao diện quản trị, xử lý dữ liệu, và chú trọng đến vấn đề bảo mật cũng như quá trình phân phối plugin. Người mới bắt đầu nên bắt đầu với việc tạo một plugin đơn giản, chứa các bộ lọc (filters) cơ bản, sau đó học cách lập trình theo hướng đối tượng, thêm trang cấu hình (setting pages), và thao tác với các bảng dữ liệu tùy chỉnh (custom databases). Hãy luôn nhớ rằng bảo mật là ưu tiên hàng đầu trong quá trình phát triển; việc sử dụng thành thạo các hàm bảo mật mà WordPress cung cấp là yếu tố then chốt để tạo ra những plugin đáng tin cậy. Tuân thủ các tiêu chuẩn và thực hành tốt nhất trong lập trình sẽ giúp plugin của bạn dễ dàng được bảo trì hơn, đồng thời tạo nền tảng vững chắc cho việc phát hành chúng lên danh mục chính thức của WordPress hoặc các nền tảng thương mại tương ứng.

FAQ 常见问题

Một plugin cần ít nhất bao nhiêu tệp tin?

Một plugin chỉ cần ít nhất một tệp PHP. Chỉ cần tệp đó chứa thông tin đầu (header) của plugin đúng cách và được lưu trữ ở đúng vị trí… /wp-content/plugins/ Trong thư mục đó hoặc các thư mục con của nó, WordPress có thể nhận diện và tải nó vào.

Tất nhiên, khi các chức năng trở nên phức tạp hơn, việc chia mã nguồn thành nhiều tệp khác nhau (như JavaScript, CSS, các tệp lớp PHP riêng biệt, v.v.) là một cách tổ chức tốt hơn.

Sự khác biệt giữa các hook (khớp nối) và filter (bộ lọc) trong plugin WordPress là gì?

Mặc dù Action Hooks (Câu lệnh Hành động) và Filter Hooks (Câu lệnh Lọc) đôi khi được gọi chung là “Hooks” (Câu lệnh Kết nối), nhưng chúng có những công dụng khác nhau.

Các hook hành động (action hooks) cho phép bạn chèn đoạn mã tùy chỉnh vào những điểm cụ thể trong vòng đời (lifecycle) của ứng dụng WordPress. Chúng không yêu cầu trả về giá trị nào; chúng chỉ thực hiện một nhiệm vụ cụ thể, chẳng hạn như gửi email hoặc ghi nhật ký. Hàm cốt lõi liên quan đến các hook hành động là… (The core function related to action hooks is…) add_action()do_action()

Các hook của bộ lọc cho phép bạn “thay đổi” giá trị của một biến (thường là một chuỗi hoặc một mảng). Chúng sẽ kỳ vọng rằng hàm gọi lại của bạn sẽ trả về giá trị đã được sửa đổi. Hàm cốt lõi là… add_filter()apply_filters()

Nói một cách đơn giản: Hành động (action) là việc thực hiện một công việc nào đó, còn bộ lọc (filter) là công cụ dùng để thay đổi dữ liệu.

Làm thế nào để ngăn không cho tên các hàm trong plugin xung đột với tên của chủ đề (theme) hoặc các plugin khác?

Cách tốt nhất là sử dụng lập trình hướng đối tượng, bằng cách đóng gói tất cả các chức năng của bạn vào một lớp. Như vậy, chỉ có tên lớp và tên phương thức là cần phải được đảm bảo duy nhất.

Nếu bạn sử dụng lập trình thủ tục (procedural programming), bạn nên thêm một tiền tố độc đáo và dễ nhận diện cho tất cả các tên hàm, hằng số và biến toàn cục của mình. Thông thường, bạn có thể sử dụng tên của plugin hoặc các từ viết tắt làm tiền tố. Ví dụ, nếu plugin của bạn có tên là “Super Tool”, bạn có thể đặt tiền tố cho các hàm như sau: stool_get_data()stool_OPTION_KEY Được rồi.

Một cách khác, còn hiệu quả hơn nữa, là sử dụng không gian tên (namespace) trong PHP; điều này sẽ giúp bạn ngăn cách các đoạn mã của mình một cách hiệu quả nhất.

Trong quá trình phát triển plugin, làm thế nào để xử lý các thiết lập và tùy chọn của người dùng?

WordPress khuyến nghị mạnh mẽ việc sử dụng API Settings của họ để quản lý các tùy chọn của plugin. API này giúp bạn lưu trữ các tùy chọn một cách an toàn (trong cơ sở dữ liệu của WordPress). wp_options Việc sử dụng các phương thức như xác thực không dựa trên chuẩn CE (CE-certified), hiển thị dữ liệu trên trang (field rendering), và gửi form (form submission) là một cách an toàn và chuẩn hóa để bảo vệ dữ liệu người dùng.

Các bước chính bao gồm: sử dụng register_setting() Đăng ký một nhóm tùy chọn (option group) và sử dụng nó. add_settings_section()add_settings_field() Thêm các khu vực và trường để thiết lập, sau đó sử dụng chúng ở phía trước (phía người dùng – front end). settings_fields()do_settings_sections() Chỉ cần như vậy là bạn có thể tạo ra biểu mẫu cài đặt hoàn chỉnh. Khi lưu các tùy chọn, hãy sử dụng… update_option() Hàm.