Phát triển plugin cho WordPress: Từ cơ bản đến chuyên nghiệp – Xây dựng plugin tùy chỉnh đầu tiên của bạn

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

Tại sao các plugin lại là trọng tâm của hệ sinh thái WordPress?

Sự mở rộng mạnh mẽ của WordPress phần lớn phụ thuộc vào hệ thống plugin của nó. Các plugin cho phép nhà phát triển thêm bất kỳ tính năng nào vào trang web mà không cần phải sửa đổi mã nguồn gốc của WordPress, từ những biểu mẫu liên hệ đơn giản đến các hệ thống thương mại điện tử phức tạp. Việc hiểu rõ về quá trình phát triển plugin đồng nghĩa với việc bạn nắm giữ chìa khóa để tùy chỉnh WordPress sao cho phù hợp với mọi nhu cầu. WordPress tuân theo nguyên tắc “thỏa thuận quan trọng hơn cấu hình”, và tương tác với phần cốt lõi của hệ thống thông qua một bộ các hook (các điểm kết nối trong vòng đời của plugin) được thiết kế một cách rõ ràng.

Về bản chất, một plugin tiêu chuẩn là một hoặc nhiều thành phần (components) được đặt tại…/wp-content/plugins/Các tệp PHP trong thư mục đó phải chứa những dòng chú thích đặc biệt ở đầu tệp, nhằm mô tả plugin cho WordPress. Thiết kế mô-đun hóa này giúp đảm bảo sự tách biệt giữa các chức năng và tính ổn định của hệ thống, từ đó việc kích hoạt, vô hiệu hóa hoặc gỡ cài đặt plugin trở nên an toàn và dễ kiểm soát hơn.

Xây dựng plugin đầu tiên của bạn: Cấu trúc cơ bản

Để tạo một plugin, trước tiên bạn cần thiết lập các tệp cơ bản và cấu trúc của nó. Điều này không chỉ đơn thuần là việc viết mã lệnh, mà còn là bước quan trọng để đảm bảo rằng plugin có thể được bảo trì và mở rộng một cách dễ dàng trong tương lai.

Đọc thêm Làm chủ phát triển plugin WordPress từ đầu: Xây dựng chức năng độc quyền và tạo ra lợi nhuận hiệu quả

Trước hết, trong môi trường phát triển WordPress cục bộ của bạn…/wp-content/plugins/Trong thư mục đó, hãy tạo một thư mục mới. Tên của thư mục phải là một chuỗi ký tự tiếng Anh viết thường, duy nhất và có thể mô tả chức năng của plugin đó. Ví dụ:my-first-greeting-pluginTrong thư mục này, hãy tạo một tệp PHP chính; tên tệp thường giống với tên thư mục. Ví dụ:my-first-greeting-plugin.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%

Thông báo về phần đầu thông tin plugin

Tệp chính của plugin phải bắt đầu bằng một khối chú thích nhất định; đây là yếu tố then chốt để WordPress nhận diện plugin đó. Hãy thêm đoạn mã sau vào tệp PHP chính của bạn:

<?php
/**
 * Plugin Name:       我的第一个问候插件
 * Plugin URI:        https://example.com/my-greeting-plugin
 * Description:       这是一个演示插件,用于在网站页脚添加一句自定义问候语。
 * Version:           1.0.0
 * Author:            你的名字
 * Author URI:        https://example.com
 * License:           GPL v2 or later
 * Text Domain:       my-first-greeting-plugin
 * Domain Path:       /languages
 */

Đoạn chú thích này mô tả toàn bộ thông tin mà plugin hiển thị trên trang “Plugins” (Các plugin) trong giao diện quản trị WordPress.Plugin NameĐây là trường bắt buộc phải điền; các trường còn lại đều là tùy chọn. Sau khi lưu tệp, bạn sẽ thấy plugin mới này trong danh sách các plugin tại giao diện quản trị của WordPress, và có thể kích hoạt nó giống như bất kỳ plugin nào khác.

Sử dụng action hook để thêm tính năng

Sau khi kích hoạt plugin, nó hiện tại vẫn chưa thực hiện bất kỳ thao tác nào. Để plugin hoạt động được, chúng ta cần sử dụng các “Hook” của WordPress. Các Hook được chia thành hai loại: “Action” và “Filter”. Hook “Action” cho phép bạn thực thi mã tùy chỉnh vào những thời điểm nhất định (chẳng hạn khi trang được tải, khi bài viết được đăng).

Thêm lời chào ở phần chân trang.

Một yêu cầu phổ biến là thêm nội dung vào phần chân trang (footer) của trang web. WordPress cung cấp công cụ để thực hiện điều này.wp_footerĐây là một “hook hành động” (action hook). Chúng ta có thể “gắn” (mount) các hàm tùy chỉnh vào hook này.

Đọc thêm Hướng dẫn tối thượng phát triển plugin WordPress: Tạo plugin tùy chỉnh đầu tiên từ con số 0

Dưới phần chú thích ở đầu tệp PHP chính, hãy thêm đoạn mã sau:

// 声明一个自定义函数,用于输出问候语
function my_greeting_display() {
    echo '<p style="text-align: center; color: #666; padding: 10px;">Xin chào thế giới! Chào mừng bạn đã sử dụng plugin WordPress đầu tiên của tôi.</p>';
}
// 使用 add_action 函数将我们的自定义函数挂载到 wp_footer 钩子上
add_action( 'wp_footer', 'my_greeting_display' );

add_actionHàm là cầu nối giữa mã nguồn tùy chỉnh và phần cốt lõi của WordPress. Tham số đầu tiên là tên của hook (hàm gắn kết).‘wp_footer’Tham số thứ hai là tên hàm mà chúng ta đã định nghĩa.‘my_greeting_display’Hãy lưu file và làm mới trang web; bạn sẽ thấy đoạn văn chào hỏi này ở phần chân trang (footer).

Việc tích hợp các bộ lọc (filters) giúp tăng độ linh hoạt trong quá trình xử lý dữ liệu.

Các hook hành động (action hooks) giúp chúng ta thực hiện các thao tác cụ thể, trong khi các hook lọc (filter hooks) cho phép chúng ta chỉnh sửa dữ liệu. Chúng cho phép chúng ta thay đổi dữ liệu trước khi nó được sử dụng hoặc hiển thị trên trình duyệt. Điều này làm cho các plugin trở nên linh hoạt và dễ cấu hình hơn.

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

Ví dụ về việc chỉnh sửa tiêu đề bài viết

Giả sử chúng ta muốn tự động thêm dòng chữ “【Được đề xuất】” trước tất cả các tiêu đề bài viết. Chúng ta có thể sử dụng công cụ hoặc lệnh phù hợp để thực hiện điều này.the_titleBộ lọc.

Hãy thêm các hàm và bộ lọc mới sau vào tệp chính của plugin của bạn:

// 声明一个函数,用于修改文章标题
function my_prefix_post_title( $title, $post_id = null ) {
    // 确保只在主循环且是文章页面添加前缀
    if ( is_single() && in_the_loop() ) {
        $title = '【推荐】' . $title;
    }
    // 必须返回修改后的值
    return $title;
}
// 使用 add_filter 函数,挂载到 the_title 过滤器
add_filter( 'the_title', 'my_prefix_post_title', 10, 2 );

add_filterTham số thứ ba của nó10Đó là thứ tự ưu tiên: số càng nhỏ thì phần tử đó sẽ được thực hiện trước. Tham số thứ tư…2Điều này có nghĩa là dữ liệu được truyền vào một hàm (function) để hàm đó có thể thực hiện các thao tác cần thiết với dữ liệu đó.my_prefix_post_titleSố lượng tham số được truyền vào hàm lọc. Hàm lọc phải trả về giá trị đã được sửa đổi, chứ không chỉ đơn giản là in ra giá trị đó. Điều này giúp mã nguồn của bạn có thể hoạt động tương tác với các plugin hoặc chủ đề khác thông qua chuỗi xử lý dữ liệu bằng các hàm lọc.

Đọc thêm Nắm vững phát triển plugin WordPress: Xây dựng chức năng tùy chỉnh từ con số 0

tạo trang quản lý plugin

Khi một plugin cần một số tùy chọn có thể được cấu hình bởi người dùng, chúng ta cần tạo một trang quản trị nền tảng cho nó. Điều này được thực hiện bằng cách sử dụng API menu quản trị của WordPress.

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

Chúng tôi sẽ thêm một menu đơn giản ở vị trí menu chính vào thanh điều hướng bên trái của giao diện quản trị WordPress.

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.

Hãy tiếp tục thêm đoạn mã sau vào tệp chính của plugin của bạn:

// 注册管理菜单
function my_greeting_add_admin_menu() {
    add_menu_page(
        '问候插件设置',       // 页面标题
        '问候插件',           // 菜单标题
        'manage_options',     // 权限(管理员)
        'my-greeting-plugin', // 菜单slug
        'my_greeting_admin_page', // 回调函数,用于显示页面内容
        'dashicons-admin-generic', // 菜单图标(WordPress Dashicons)
        80                    // 菜单位置
    );
}
add_action( 'admin_menu', 'my_greeting_add_admin_menu' );

// 定义设置页面的HTML内容
function my_greeting_admin_page() {
    // 安全检查
    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( 'my_greeting_options' );
            do_settings_sections( 'my-greeting-plugin' );
            submit_button( '保存设置' );
            ?>
        <input type="hidden" name="trp-form-language" value="vi"/></form>
        <p>Chào mừng bạn đến với trang cài đặt của plugin đầu tiên của tôi. Trong tương lai, bạn có thể thêm nhiều tùy chọn khác vào đây.</p>
    </div>
    &lt;?php
}

add_menu_pageHàm là yếu tố cốt lõi trong việc tạo ra các menu cấp cao trong WordPress. Sau khi lưu thay đổi, hãy đăng nhập vào backend của WordPress với tư cách quản trị viên; bạn sẽ thấy một mục menu mới có tên “Greeting Plugin” ở bên trái. Nhấp vào nó để truy cập trang cấu hình cơ bản mà chúng ta đã định nghĩa trước đó. Đây là bước đầu tiên trong quá trình xây dựng các plugin phức tạp hơn – trong tương lai, bạn có thể tích hợp các trường thiết lập, chức năng lưu dữ liệu thông qua biểu mẫu, và nhiều tính năng khác vào trang này.

Tóm lại

Bằng cách tạo ra một plugin chào hỏi đơn giản, chúng ta đã đi qua những bước cơ bản trong quá trình phát triển plugin cho WordPress: bắt đầu từ việc tạo các tệp cơ sở và thông tin tiêu đề (header information), sau đó sử dụng những công cụ và kỹ thuật có sẵn để hoàn thiện plugin.add_actionCác “hook” (móc) được sử dụng để thực thi mã nguồn ở những vị trí cụ thể trong chương trình, sau đó tiếp tục thực hiện các thao tác khác theo yêu cầu.add_filterBạn cần thực hiện các thay đổi sau: cuối cùng, hãy sử dụng API của menu quản trị để thêm giao diện cấu hình nền tảng cho plugin của mình. Bốn nền tảng cơ bản này – cấu trúc tệp tin, hook hành động, hook bộ lọc và giao diện quản trị – tạo nên cơ sở cho hầu hết các plugin WordPress. Bằng cách hiểu rõ và vận dụng thành thạo những khái niệm này, bạn đã bước từ mức độ mới bắt đầu lên mức độ chuyên nghiệp, và có thể bắt đầu xây dựng những công cụ tùy chỉnh phức tạp hơn, có nhiều chức năng hơn, từ đó giải phóng toàn bộ tiềm năng của WordPress.

FAQ 常见问题

###: Cấu trúc tối thiểu của một plugin là gì?
Một plugin chỉ có thể gồm một tệp PHP độc lập duy nhất. Miễn là tệp đó chứa các chú thích đầu tiên (header comments) hợp lệ dành cho plugin WordPress…Plugin NameVà đặt nó ở đó…/wp-content/plugins/Trong thư mục chính hoặc các thư mục con của nó, WordPress có thể nhận diện và liệt kê nội dung đó. Tất nhiên, các plugin phức tạp thường sẽ tổ chức mã nguồn thành nhiều tệp tin và thư mục con nhằm tăng tính dễ bảo trì.

Sự khác biệt cơ bản giữa hook hành động (action hook) và hook bộ lọc (filter hook) là gì?

Hook cho hành động được sử dụng để “thực hiện một thao tác” vào một thời điểm nhất định; nó không yêu cầu hàm của bạn phải trả về giá trị nào cả, mục tiêu chính là thực thi một đoạn mã. Hook cho bộ lọc được dùng để “thay đổi dữ liệu”; nó bắt buộc hàm của bạn phải trả về một giá trị (thường là giá trị đã được sửa đổi), để dữ liệu có thể được truyền tiếp trong chuỗi xử lý lọc. Nói một cách ngắn gọn: Hook cho hành động dùng để thực hiện một hành động cụ thể, trong khi hook cho bộ lọc dùng để thay đổi nội dung của dữ liệu.

Làm thế nào để đảm bảo rằng mã nguồn của plugin của tôi không xung đột với các plugin khác?

Để tránh xung đột giữa tên hàm, tên lớp hoặc tên hằng số, thực hành tốt nhất là sử dụng không gian tên (namespace – được khuyến nghị) hoặc thêm một tiền tố duy nhất cho tất cả các định danh. Ví dụ, trong các ví dụ của bài viết này, tất cả các hàm đều sử dụng không gian tên.my_my_greeting_Được sử dụng như một tiền tố (prefix). Kể từ PHP 5.3, việc sử dụng không gian tên (namespace) đã trở thành phương pháp tiên tiến và hiệu quả hơn nhiều.

Làm thế nào để debug khi phát triển plugin?

Trước tiên, hãy đảm bảo trongwp-config.phptrong tệpWP_DEBUGdefine( ‘WP_DEBUG’, true );Sử dụngerror_log()Hàm sẽ ghi thông tin gỡ lỗi vào nhật ký lỗi của máy chủ. Đối với việc kiểm tra biến, bạn có thể sử dụng…print_r()var_dump()Kết hợpwp_die()Hiển thị nội dung một cách an toàn trên trang web. Ngoài ra, việc sử dụng các tiện ích mở rộng dành cho nhà phát triển như Query Monitor có thể giúp tăng đáng kể hiệu quả trong quá trình gỡ lỗi (debugging).