Bắt đầu từ con số không: Kiến trúc cơ bản phát triển plugin WordPress

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

Bắt đầu từ con số không: Kiến trúc cơ bản phát triển plugin WordPress

Để phát triển một plugin cho WordPress, trước tiên bạn cần hiểu rõ cấu trúc cơ bản của nó. Tập tin quan trọng nhất trong một plugin chính là tập tin chính (main file), thường được đặt tên theo tên của plugin đó. Ví dụ:my-first-plugin.phpTệp tin này không chỉ chứa toàn bộ mã nguồn của plugin, mà quan trọng hơn là phần ghi chú thông tin về plugin ở phía trên tệp. Phần này đóng vai trò then chốt trong việc WordPress nhận diện plugin.

Các ghi chú ở phần đầu của plugin phải chứa những metadata nhất định. Dưới đây là một ví dụ cơ bản:

<?php
/**
 * Plugin Name: 我的第一个插件
 * Plugin URI:  https://example.com/my-first-plugin
 * Description: 这是一个用于演示的简单WordPress插件。
 * Version:     1.0.0
 * Author:      开发者名称
 * Author URI:  https://example.com
 * License:     GPL v2 or later
 * Text Domain: my-first-plugin
 */

Tôi đã tạo ra tệp tin này và đặt nó vào đúng vị trí cần thiết./wp-content/plugins/Sau khi thêm plugin vào danh mục, bạn có thể tìm thấy nó trên trang “Plugins” trong giao diện quản trị WordPress và kích hoạt hoặc vô hiệu hóa nó tùy theo nhu cầu. Việc hiểu rõ thứ tự tải và thực thi mã của các plugin là rất quan trọng. Khi WordPress tải các plugin, nó sẽ thực hiện việc này theo thứ tự bảng chữ cái./wp-content/plugins/Tất cả các tệp chính của plugin hợp lệ nằm trong thư mục này. Do đó, nếu plugin của bạn phụ thuộc vào chức năng của các plugin khác, bạn không thể đơn giản giả định rằng những plugin đó đã được tải và sẵn sàng sử dụng. Trong trường hợp này, bạn cần phải thực hiện các thao tác cần thiết để đảm bảoplugins_loadedAction hook này được sử dụng để đảm bảo rằng đoạn mã được thực thi đúng vào thời điểm thích hợp.

Đọc thêm Hướng dẫn toàn diện phát triển plugin WordPress: Từ cơ bản đến xây dựng tiện ích mở rộng cấp doanh nghiệp

Hiểu sâu về các “hook” (móc): Cơ chế hành động và bộ lọc

Triết lý cốt lõi của việc phát triển plugin cho WordPress là “Hook” (Khoái). Hook cho phép bạn chèn mã của mình vào quá trình thực thi của phần mềm WordPress gốc, các theme, hoặc các plugin khác mà không cần phải sửa đổi các tệp nguồn gốc. Hook chủ yếu được chia thành hai loại: Hook hành động (Action Hooks) và Hook lọc (Filter Hooks).

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%

Các “hook hành động” (action hooks) cho phép bạn thực thi các hàm tùy chỉnh khi những sự kiện cụ thể xảy ra. Ví dụ, khi một bài viết được đăng lên (when an article is published).publish_postKhi tải các tài nguyên ở phần đầu trang web (header of the web page)...wp_enqueue_scripts) Hoặc khi khởi tạo từ giao diện quản trị (management backend).admin_initĐể sử dụng một hook hành động (action hook), bạn cần phải…add_action()Hàm sẽ “gắn” hàm gọi lại (callback function) của bạn vào đó.

add_action( 'init', 'myplugin_custom_init' );
function myplugin_custom_init() {
    // 在WordPress初始化时执行
    // 例如,注册一个自定义文章类型
}

Các hook của bộ lọc được sử dụng để thay đổi dữ liệu. Chúng cho phép bạn chặn và chỉnh sửa các biến được truyền vào, sau đó trả về giá trị đã được sửa đổi. Ví dụ, bạn có thể sử dụng chúng để thay đổi nội dung của một bài viết.the_content– Thay đổi độ dài đoạn trích (Modify the length of the excerpt).excerpt_length) hoặc sửa đổi kết quả truy vấn (the_postsĐể sử dụng bộ lọc, bạn cần phải gọi hàm tương ứng.add_filter()Hàm.

add_filter( 'the_title', 'myplugin_custom_title' );
function myplugin_custom_title( $title ) {
    // 修改文章标题
    return '前缀:' . $title;
}

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

Ngoài việc sử dụng hàng trăm hook tích hợp sẵn trong WordPress, các nhà phát triển plugin nâng cao còn có thể tạo ra những hook riêng của mình để các nhà phát triển khác có thể mở rộng chức năng của ứng dụng.do_action()Hãy tạo một hook hành động (action hook) bằng cách sử dụng…apply_filters()Hãy tạo một hook bộ lọc (filter hook).

// 在插件代码中定义一个自定义动作钩子
do_action( 'myplugin_after_something_happens', $some_data );

// 在插件代码中定义一个自定义过滤器钩子
$value = apply_filters( 'myplugin_filter_some_value', $default_value );

Xây dựng chức năng plugin: An toàn và các thực hành tốt nhất

Khi viết các chức năng cho plugin, bảo mật là yếu tố cần được xem xét hàng đầu. Đừng bao giờ tin tưởng vào dữ liệu do người dùng nhập vào. Mọi dữ liệu đến từ bên ngoài (chẳng hạn từ biểu mẫu, tham số URL, Cookie) đều phải được xác thực, làm sạch và xử lý (đặc biệt là việc “đánh dấu đặc biệt” các ký tự nguy hiểm – được gọi là “escape”

Đọc thêm Hướng dẫn nhập môn phát triển plugin WordPress: Từ con số không đến việc tạo ra các tính năng tùy chỉnh chuyên nghiệp

Xác thực và thoát dữ liệu

Đối với dữ liệu đầu vào, hãy sử dụng…sanitize_text_field()sanitize_email()intval()Sử dụng các hàm để dọn dẹp dữ liệu. Đối với dữ liệu được xuất ra trang HTML, hãy áp dụng các quy trình xử lý thích hợp.esc_html()esc_attr()wp_kses_post()Thực hiện việc “đánh dấu ký tự đặc biệt” (escape) để ngăn chặn các cuộc tấn công từ chương trình khác trên trang web (cross-site scripting attacks – XSS).

$user_input = $_POST['some_field'];
$clean_input = sanitize_text_field( $user_input );

// 输出时
echo '<div class="' . esc_attr( $class_name ) . '">'`. esc_html($clean_input)`.'</div>';

Tương tác với cơ sở dữ liệu

WordPress cung cấp…$wpdbCác đối tượng toàn cục (global objects) được sử dụng để thực hiện các thao tác trực tiếp trên cơ sở dữ liệu, tuy nhiên bạn nên ưu tiên sử dụng các hàm tích hợp sẵn của WordPress.get_post()update_option()V.v. Nếu bạn buộc phải sử dụng SQL, hãy đảm bảo rằng bạn làm điều đó một cách thích hợp.$wpdb->prepare()Các phương pháp để phòng ngừa tấn công SQL injection.

global $wpdb;
$user_id = intval( $_GET['id'] );
$results = $wpdb->get_results(
    $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}my_table WHERE user_id = %d", $user_id )
);

Thêm menu quản lý và trang quản lý.

Tạo một trang cấu hình cho plugin là một yêu cầu phổ biến. Bạn có thể sử dụng…add_menu_page()add_options_page()Các hàm này thêm mục menu trong backend. Các hàm này nên đượcadmin_menuhook hành độ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%.
add_action( 'admin_menu', 'myplugin_add_admin_menu' );
function myplugin_add_admin_menu() {
    add_options_page(
        '我的插件设置', // 页面标题
        '我的插件',     // 菜单标题
        'manage_options', // 权限
        'myplugin-slug',  // 菜单别名
        'myplugin_settings_page' // 用于呈现页面的回调函数
    );
}
function myplugin_settings_page() {
    // 输出设置页面HTML
    echo '<div class="wrap"><h1>Thiết lập</h1></div>';
}

Chuẩn bị cho việc phát hành plugin: Hóa đa ngôn ngữ và tổ chức mã nguồn

Khi các tính năng của plugin được hoàn thiện hơn, để phục vụ một đối tượng người dùng rộng lớn hơn và thuận tiện hơn trong việc bảo trì, chúng ta cần chú trọng đến các yếu tố như hóa đa ngôn ngữ (internationalization – i18n) và cách tổ chức mã nguồn (code organization).

Thực hiện quốc tế hóa cho plugin

Việc hỗ trợ quốc tế hóa (i18n) cho phép bạn dịch các plugin của mình sang các ngôn ngữ khác. Điều này đòi hỏi sử dụng các hàm dịch của WordPress.__()_e()_x()Hãy thu thập tất cả các chuỗi ký tự hiển thị cho người dùng, sau đó khai báo chúng ở phần đầu của plugin.Text Domain(ví dụmy-first-plugin)。

// 在代码中
$greeting = __( 'Hello, World!', 'my-first-plugin' );
_e( 'This text will be echoed and translatable.', 'my-first-plugin' );

// 然后,使用如Poedit等工具生成 .pot 翻译模板文件。

Tổ chức mã nguồn theo nguyên tắc mô-đun hóa

Hãy tránh việc chất đống toàn bộ mã nguồn vào tệp chính. Một thực hành tốt là phân chia mã nguồn theo các chức năng khác nhau vào các tệp riêng biệt..phpCác tệp tin được lưu trữ trong một thư mục nhất định, và chúng được sử dụng bởi tệp chính (main file) thông qua cơ chế chứa (include). Ví dụ:
- includes/admin/ Thư mục chứa các đoạn mã liên quan đến phần backend (phần xử lý nền).
- includes/public/ Thư mục chứa các đoạn mã liên quan đến phần trước (front-end) của ứng dụng.
- includes/class-*.php Nơi lưu trữ các định nghĩa lớp chính.
- assets/css/assets/js/ Dùng để lưu trữ các bảng định dạng (style sheets) và các tập lệnh (scripts).

Đọc thêm Hướng dẫn Tối thượng về Phát triển Plugin WordPress: Kỹ thuật Cốt lõi để Xây dựng Tính năng Tùy chỉnh Từ Con số 0

Việc sử dụng lập trình hướng đối tượng (Object-Oriented Programming – OOP) giúp tổ chức mã nguồn một cách tốt hơn, tránh được tình trạng xung đột tên hàm (function name conflicts), và nâng cao mức độ tái sử dụng (reusability) của mã nguồn. Hãy định nghĩa một lớp chính (main class), và trong phương

class My_First_Plugin {
    public function __construct() {
        add_action( 'init', array( $this, 'init_method' ) );
        add_filter( 'the_content', array( $this, 'filter_content' ) );
    }
    public function init_method() {
        // 初始化
    }
    public function filter_content( $content ) {
        return $content . '<p>Nội dung được thêm vào plugin</p>';
    }
}
new My_First_Plugin();

Tóm lại

Việc phát triển plugin cho WordPress là quá trình tích hợp các tính năng tùy chỉnh một cách liền mạch vào hệ sinh thái WordPress. Nền tảng của việc phát triển này bắt đầu từ một tệp chú thích đầu tiên của plugin tuân thủ các tiêu chuẩn nhất định. Trọng tâm của quá trình phát triển nằm ở việc sử dụng thành thạo các hook (khung lập trình) như action hooks và filter hooks, nhằm mở rộng hoặc thay đổi cách hoạt động của WordPress theo nguyên lý “dựa trên sự kiện”. Trong quá trình lập trình, việc đảm bảo an ninh phải được ưu tiên hàng đầu; dữ liệu cần được kiểm tra kỹ lưỡng, làm sạch và xử lý đúng cách (như việc đánh dấu các ký tự đặc biệt). Khi chức năng của plugin ngày càng được mở rộng, việc tổ chức mã nguồn một cách khoa học (bao gồm thiết kế hướng đối tượng và cấu trúc tệp tin được phân mô-đun hóa), cùng với khả năng hỗ trợ đa ngôn ngữ, sẽ trở thành những yếu tố then chốt giúp plugin dễ bảo trì, chuyên nghiệp hơn và có thể tiếp cận được nhiều người dùng hơn. Bằng cách tuân theo những thực hành tốt nhất này, bạn sẽ có thể tạo ra những plugin WordPress mạnh mẽ, an toàn và dễ dàng được phân phối.

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.

FAQ 常见问题

Phát triển plugin WordPress cần những kiến thức cơ bản nào?

Bạn cần nắm vững những kiến thức cơ bản về ngôn ngữ PHP, vì WordPress cùng các plugin của nó đều được viết bằng PHP. Ngoài ra, bạn cũng cần có hiểu biết cơ bản về HTML, CSS và JavaScript để xử lý giao diện người dùng (front-end) và các tương tác trên trang web. Điều quan trọng nhất là bạn phải hiểu rõ cách thức hoạt động của WordPress và hệ thống Hook của nó – đây chính là cơ chế cốt lõi trong việc phát triển các plugin.

Làm thế nào để ngăn tên hàm plugin của tôi xung đột với các plugin khác?

Thực hành tốt nhất là sử dụng lập trình hướng đối tượng (OOP) để đóng gói các chức năng của bạn vào một lớp; nhờ đó, tên các phương thức bên trong lớp sẽ trở nên độc lập với nhau. Nếu bạn sử dụng lập trình thủ tục, bạn phải thêm một tiền tố duy nhất cho tất cả các hàm, lớp và hằng số. Tiền tố này có thể là viết tắt của plugin hoặc tên thương hiệu của bạn, ví dụ:myplugin_acme_Và đảm bảo rằng tính nhất quán được duy trì xuyên suốt toàn bộ đoạn mã.

Tôi nên tải các tệp JavaScript và CSS của plugin từ đâu?

Để đảm bảo độ chính xác và hiệu suất, đừng bao giờ trực tiếp liên kết đến các tệp tài nguyên trong mẫu HTML. Bạn nên sử dụng các hàm xếp hàng (enqueue) được cung cấp bởi WordPress. Đối với các tài nguyên phía trước (front-end resources), hãy áp dụng các hàm tương ứng để quản lý việc tải chúng một cách hiệu quả.wp_enqueue_script()wp_enqueue_style()Và hãy gắn nó vào…wp_enqueue_scriptsTrên các “hook” (các điểm kết nối trong hệ thống) liên quan đến các hành động cụ thể. Đối với các tài nguyên chỉ được sử dụng trong giao diện quản trị nền (backend), chúng sẽ được gắn (mount) vào những vị trí tương ứng trong hệ thống.admin_enqueue_scriptshook.

Các plugin (tiện ích mở rộng) lưu trữ cài đặt và dữ liệu của chúng như thế nào?

Đối với các thiết lập đơn giản chỉ yêu cầu một giá trị duy nhất, bạn có thể sử dụng API tùy chọn của WordPress.add_option()get_option()update_option()Đối với dữ liệu phức tạp và có cấu trúc hơn (chẳng hạn như danh sách các mục trong biểu mẫu), bạn nên tạo các bảng cơ sở dữ liệu tùy chỉnh. Bạn có thể sử dụng chúng để lưu trữ và quản lý dữ liệu một cách hiệu quả.dbDelta()Hàm này được kích hoạt khi plugin được bật (thông qua…)register_activation_hookTạo hoặc cập nhật cấu trúc bảng một cách an toàn.