Khái niệm cốt lõi và chuẩn bị
Việc phát triển plugin cho WordPress là quá trình viết các mô-đun mã PHP độc lập bên ngoài các chức năng cốt lõi của WordPress nhằm mở rộng và nâng cao hiệu năng của trang web. Việc hiểu rõ cách thức hoạt động của hệ thống là bước đầu tiên quan trọng để thành công trong việc phát triển plugin. WordPress sử dụng mô hình lập trình dựa trên sự kiện (hooks và filters) cùng với lập trình hướng đối tượng. Về bản chất, một plugin là một hoặc nhiều tệp PHP, và chúng tương tác với phần cốt lõi của WordPress thông qua các giao diện được định nghĩa sẵn, từ đó giúp thêm các chức năng mới một cách an toàn vào trang web.
Trước khi bắt đầu phát triển, bạn cần một môi trường máy chủ cục bộ hoặc môi trường thử nghiệm ổn định. Chúng tôi khuyên bạn nên cài đặt các phần mềm máy chủ cục bộ như XAMPP, Local by Flywheel hoặc DevKinsta. Đồng thời, hãy đảm bảo rằng bạn đã có một trình soạn thảo mã nguồn (chẳng hạn như VS Code hoặc PhpStorm) và đã kích hoạt chế độ gỡ lỗi (debug mode) của WordPress. Những điều này là cần thiết để quá trình phát triển diễn ra thuận lợi và không gặp phải sự cố.wp-config.phpTrong tệp tin, hãy thiết lập một số hằng số (constants):
define( ‘WP_DEBUG’, true );
define( ‘WP_DEBUG_LOG’, true );
define( ‘WP_DEBUG_DISPLAY’, false ); Kích hoạtWP_DEBUG_LOGSau đó, thông báo lỗi sẽ được ghi lại./wp-content/debug.logTrong tệp tin này, thông tin này rất quan trọng đối với việc truy tìm và giải quyết sự cố.
Đọc thêm Hướng dẫn nâng cao phát triển chủ đề WordPress: Từ cơ bản đến thành thạo với các bài thực hành。
Tạo ra plugin đầu tiên của bạn
Tạo một plugin, bắt đầu từ…/wp-content/plugins/Hãy tạo một thư mục riêng biệt trong thư mục đó, ví dụ như:my-first-pluginTrong thư mục này, bạn cần 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-plugin.php。
Viết thông tin tiêu đề plugin
Mọi plugin của WordPress đều cần có một phần ghi chú ở đầu (header comment) theo tiêu chuẩn; đây chính là “chứng minh thư” giúp WordPress nhận diện plugin đó. Phần ghi chú này phải được đặt ở đầu tệp tin chính của plugin và phải tuân theo định dạng cụ thể. Điều quan trọng nhất là…Plugin NameCác thông tin khác như mô tả, phiên bản, tác giả, v.v. cũng rất quan trọng.
<?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
* Domain Path: /languages
*/ Đoạn mã chú thích này sẽ giúp plugin của bạn xuất hiện trong danh sách các plugin tại giao diện quản trị (backend) của WordPress, đồng thời hiển thị thông tin được nêu trên.Text Domain和Domain PathĐây là nội dung được chuẩn bị cho việc quốc tế hóa (dịch) các plugin.
Triển khai một chức năng cơ bản
Bây giờ, hãy cùng thêm một tính năng đơn giản cho plugin này: tự động thêm một đoạn văn bản tùy chỉnh ở cuối nội dung bài viết. Điều này yêu cầu sử dụng “filter” (bộ lọc) của WordPress. Bộ lọc cho phép bạn thay đổi dữ liệu trước khi nó được lưu vào cơ sở dữ liệu hoặc hiển thị trên trình duyệt.
Chúng ta sẽ sử dụngthe_contentBạn hãy thêm đoạn mã sau ngay sau các dòng chú thích ở đầu tệp plugin chính của mình:
// 在文章内容末尾添加自定义文本
function myfp_add_text_to_content( $content ) {
if ( is_single() && in_the_loop() && is_main_query() ) {
$custom_text = ‘<p><em>Cảm ơn bạn đã đọc bài viết này! Bài viết này được hỗ trợ bởi “My First Plugin”.</em></p>’;
$content .= $custom_text;
}
return $content;
}
add_filter( ‘the_content’, ‘myfp_add_text_to_content’ ); Sau khi lưu file, hãy truy cập vào giao diện quản trị WordPress để kích hoạt plugin này. Khi bạn xem một bài viết cụ thể, bạn sẽ thấy đoạn văn bản mới được thêm vào cuối nội dung bài viết đó.myfp_add_text_to_contentĐây là hàm mà chúng ta đã định nghĩa; nó nhận vào nội dung của bài viết.$contentKhi các điều kiện được đáp ứng (đó là một bài viết đơn lẻ và đang trong vòng lặp chính), hãy thêm một đoạn văn bản vào, sau đó trả về nội dung đã được sửa đổi.add_filter()Hàm này sẽ gắn (mount) hàm tùy chỉnh đó vào hệ thống.the_contentTrên bộ lọc.
Sử dụng các hook (móc) và filter (bộ lọc) để xây dựng các phản ứng tương tác.
Điểm mạnh của các plugin WordPress nằm ở hệ thống hook phong phú của chúng, được chia thành Action Hooks (Hook hành động) và Filter Hooks (Hook lọc). Action Hooks cho phép bạn “thực thi” mã lệnh vào những thời điểm cụ thể, trong khi Filter Hooks cho phép bạn “sửa đổi” dữ liệu.
Sử dụng các hook hành động (action hooks) để thêm menu quản lý.
Giả sử chúng ta muốn thêm một trang cấu hình cho plugin của mình, và điều này đòi hỏi sử dụng các hook hành động (action hooks).admin_menuNó được kích hoạt khi xây dựng menu quản trị nền tảng WordPress.
// 添加插件设置页面到后台菜单
function myfp_add_admin_menu() {
add_menu_page(
‘我的插件设置’, // 页面标题
‘我的插件’, // 菜单标题
‘manage_options’, // 权限要求
‘myfp-settings’, // 菜单slug
‘myfp_settings_page’, // 用于显示页面内容的回调函数
‘dashicons-admin-generic’, // 图标(可选)
80 // 菜单位置
);
}
add_action( ‘admin_menu’, ‘myfp_add_admin_menu’ );
// 定义设置页面的显示内容
function myfp_settings_page() {
?>
<div class="“wrap”">
<h1><?php esc_html_e( ‘我的插件设置’, ‘my-first-plugin’ ); ?></h1>
<p><?php esc_html_e( ‘这是你的第一个插件设置页面。’, ‘my-first-plugin’ ); ?></p>
<form method="“post”" action="/vi/“options.php”/" data-trp-original-action="“options.php”">
<?php
// 后续可以在这里添加设置字段
settings_fields( ‘myfp_settings_group’ );
do_settings_sections( ‘myfp-settings’ );
submit_button();
?>
<input type="hidden" name="trp-form-language" value="vi"/></form>
</div>
<?php
} Sau khi kích hoạt tiện ích mở rộng (plugin), bạn sẽ thấy một mục menu mới có tên “Các tiện ích của tôi” ở bên trái màn hình nền. Chỉ cần nhấp vào mục đó để truy cập trang cấu hình tùy chỉnh.add_menu_pageHàm đóng vai trò then chốt; nó đã đăng ký một trang menu cấp cao nhất (top-level menu page).
Tạo mã ngắn để nâng cao chức năng của trang web.
Shortcodes là những công cụ mạnh mẽ giúp người dùng có thể dễ dàng sử dụng các tính năng của plugin trong bài viết hoặc trang web. Bạn có thể sử dụng chúng để...add_shortcode()để đăng ký một shortcode.
// 创建一个显示当前时间的短代码
function myfp_current_time_shortcode( $atts ) {
// 使用 shortcode_atts 设置默认属性并合并用户输入
$attributes = shortcode_atts( array(
‘format’ => ‘Y-m-d H:i:s’,
), $atts );
// 根据属性格式化当前时间
$current_time = date( $attributes[‘format’] );
// 返回要显示的内容,确保进行转义
return ‘<p>Thời gian hiện tại là: ’. esc_html($current_time).‘</p>’php
add_shortcode( ‘show_time’, ‘myfp_current_time_shortcode’ ); Bây giờ, người dùng có thể nhập nội dung vào trình soạn thảo bài viết.[show_time format=“F j, Y”]Đây là đoạn mã dùng để hiển thị ngày hiện tại theo định dạng đã được định nghĩa trước. Nó được sử dụng bởi các công cụ xử lý mã ngắn (short code processors).myfp_current_time_shortcodeNhận một mảng các thuộc tính, và trả về nội dung HTML cần được chèn vào trang web.
Bảo mật và thực hành tốt nhất cho plugin
Khi phát triển các tiện ích mở rộng (plugin), bảo mật là yếu tố cần được xem xét hàng đầu. Mã nguồn không an toàn có thể khiến trang web bị tấn công. Việc tuân thủ các thực hành tốt nhất sau đây là vô cùng quan trọng.
Xác thực, thoát ký tự và làm sạch dữ liệu
Mọi dữ liệu đến từ người dùng hoặc các nguồn bên ngoài (chẳng hạn như…)$_GET, $_POST, $_COOKIETất cả những dữ liệu đó đều không đáng tin cậy. Trước khi sử dụng chúng trong các truy vấn cơ sở dữ liệu hoặc hiển thị chúng trên trình duyệt, chúng phải được xử lý thích hợp.
- Khi truyền dữ liệu đến trình duyệt, hãy sử dụng các hàm mã hóa (escape functions) để đảm bảo rằng dữ liệu được hiển thị dưới dạng văn bản thuần túy, nhằm ngăn chặn các cuộc tấn công XSS (Cross-Site Scripting). Tùy theo từng ngữ cảnh cụ thể, WordPress cung cấp nhiều hàm mã hóa khác nhau.
esc_html()(Dùng bên trong các phần tử HTML)esc_attr()(Dùng trong thuộc tính HTML)esc_url()(Dùng cho URL) vàwp_kses_post()(Cho phép các thẻ HTML an toàn được sử dụng.) - Khi tương tác với cơ sở dữ liệu, hãy sử dụng các câu lệnh chuẩn bị (prepared statements). Tuyệt đối không nên kết hợp trực tiếp các biến vào truy vấn SQL. Thay vào đó, hãy sử dụng các phương thức chuẩn để đảm bảo an toàn và tránh lỗi phổ biến như truyền dữ liệu không đúng dạng.
$wpdb->prepare()Các phương thức hoặc API nâng cao hơn như…WP_QueryVí dụ:
global $wpdb;
$user_id = 123;
$safe_query = $wpdb->prepare( “SELECT * FROM {$wpdb->prefix}posts WHERE post_author = %d”, $user_id );
$results = $wpdb->get_results( $safe_query ); Đây%dĐây là một ký hiệu thay thế (placeholder).$wpdb->prepare()Sẽ được xử lý một cách an toàn.$user_idBiến (Variable).
Thực hiện việc thiết lập tùy chọn và đảm bảo an ninh
Khi thêm các tùy chọn cấu hình cho plugin, bạn nên sử dụng WordPress Settings API. API này tự động xử lý việc xác thực Nonce, kiểm tra quyền truy cập và lưu trữ các tùy chọn, từ đó giúp đơn giản hóa đáng kể quy trình bảo mật.
Trước hết, hãy sử dụng…register_setting()Hãy đăng ký một nhóm tùy chọn cấu hình, sau đó sử dụng nó.add_settings_section()和add_settings_field()Hãy thêm các trường (fields) vào đó. Trong hàm gọi lại (callback function) của menu quản lý đã được tạo trước đó…myfp_settings_pageThe function that is being called internally.settings_fields( ‘myfp_settings_group’ )和do_settings_sections( ‘myfp-settings’ )Nó sẽ hiển thị tất cả các trường bảo mật cần thiết cũng như các thông tin liên quan đến quá trình đăng ký. Cách này tiện lợi hơn nhiều so với việc xử lý các thông tin đó thủ công.$_POSTDữ liệu cần phải an toàn và đáng tin cậy hơn nhiều.
Tóm lại
Bạn đã trải qua những bước quan trọng trong quá trình phát triển plugin: từ việc viết những dòng chú thích đơn giản ở phần đầu của plugin, đến việc sử dụng các hàm hành động (actions) và hook để tương tác với phần cốt lõi của WordPress, tiếp theo là tạo ra các đoạn mã ngắn (shortcodes) và quản lý các trang liên quan đến plugin. Hãy luôn ghi nhớ nguyên tắc “an toàn là trên hết”: thực hiện việc xác thực dữ liệu một cách nghiêm ngặt, tiến hành việc mã hóa (escaping) và làm sạch dữ liệu trước khi sử dụng, đồng thời tận dụng tối đa các công cụ bảo mật mà WordPress cung cấp (chẳng hạn như API Settings). Phát triển plugin là một quá trình học hỏi không ngừng; bằng cách đọc mã nguồn của WordPress, tham khảo các hướng dẫn chính thức và tham gia cộng đồng, bạn sẽ có thể tạo ra những plugin mạnh mẽ, an toàn và được nhiều người yêu thích.
FAQ 常见问题
Có phải việc phát triển plugin đòi hỏi phải am hiểu sâu rộng về PHP không?
Đúng vậy, một nền tảng PHP vững chắc là điều kiện cần thiết, vì WordPress được viết bằng PHP. Bạn cần hiểu rõ về ngữ pháp PHP, các hàm, lớp, không gian tên (namespace), và các khái niệm liên quan khác. Ngoài ra, việc nắm vững cơ bản về HTML, CSS và JavaScript cũng sẽ rất hữu ích trong quá trình phát triển các tính năng phía trước của trang web (frontend).
Làm thế nào để gỡ lỗi mã plugin của tôi?
Phương pháp hiệu quả nhất là bật tính năng đã được đề cập ở phần trên.WP_DEBUG、WP_DEBUG_LOG和WP_DEBUG_DISPLAYNgoài ra, có thể sử dụng…error_log()Hàm sẽ ghi thông tin gỡ lỗi tùy chỉnh vào nhật ký (log), hoặc sử dụng các công cụ gỡ lỗi chuyên nghiệp như Xdebug kết hợp với trình soạn thảo mã của bạn để thực hiện việc gỡ lỗi từng dòng (line-by-line debugging).
Làm thế nào để tôi thêm các bản dịch ngôn ngữ cho plugin của mình?
Trước hết, hãy thiết lập đúng các thông tin trong phần chú thích ở đầu plugin.Text Domain(Ví dụ: ‘my-first-plugin’) vàDomain Path(Ví dụ: ‘/languages’). Sau đó, ở tất cả các vị trí trong mã mà có các chuỗi cần được dịch, hãy sử dụng cách tương tự.__( ‘Hello World’, ‘my-first-plugin’ )或esc_html_e( ‘Settings’, ‘my-first-plugin’ )Chức năng dịch. Cuối cùng, sử dụng các công cụ như Poedit để tạo ra bản dịch..potCác tệp mẫu (template files), và từ đó tạo ra các phiên bản dành cho các ngôn ngữ khác nhau..po和.moDịch tài liệu và đặt nó vào vị trí được chỉ định./languagesthư mục chính xác.
Làm thế nào để phát hành các plugin đã được phát triển thành danh mục chính thức của WordPress?
Bạn cần truy cập trang gửi đơn đăng ký plugin chính thức của WordPress. Trước khi gửi đơn, hãy đảm bảo rằng mã nguồn của plugin tuân thủ các tiêu chuẩn lập trình của WordPress, đi kèm với tài liệu hướng dẫn chi tiết và các chú thích rõ ràng; đồng thời, plugin không chứa bất kỳ vấn đề liên quan đến bản quyền của các thư viện thương mại bên thứ ba nào. Sau khi gửi đơn, quá trình xem xét sẽ được thực hiện, và nếu được chấp thuận, plugin của bạn sẽ có thể được người dùng trên toàn thế giới tìm kiếm và cài đặt.
Bước tiếp theo, chúng ta nên làm gì tiếp theo?
Đọc thêm và kiến thức thực tế
Những nội dung sau đây liên quan đến chủ đề của bài viết này, thích hợp để tiếp tục đọc sâu hơn. Ưu tiên bắt đầu với bài viết gần nhất với vấn đề hiện tại của bạn, rồi dần dần mở rộng sang các chủ đề xung quanh, hiệu quả thường sẽ tốt hơn.
- Tại sao lại chọn WordPress làm nền tảng trang web ưu tiên?
- Hướng dẫn cơ bản về WordPress: Xây dựng trang web chuyên nghiệp đầu tiên của bạn từ con số không
- Giải pháp xây dựng trang web toàn diện: Hướng dẫn thực hiện từ đầu đến khi trang web đi vào hoạt động
- Lời nói đầu: Tại sao chọn WordPress để phát triển?
- Hướng dẫn toàn diện xây dựng website: Quy trình hoàn chỉnh từ con số 0 đến tạo ra website chuyên nghiệp