Chuẩn bị môi trường phát triển plugin WordPress
Trước khi bắt đầu viết mã, một môi trường phát triển phù hợp là điều vô cùng quan trọng. Điều này không chỉ giúp bạn làm việc hiệu quả hơn mà còn giúp mô phỏng môi trường sản xuất thực tế, tránh được những sự không nhất quán giữa môi trường cục bộ và môi trường trực tuyến. Một môi trường phát triển điển hình cần bao gồm môi trường máy chủ cục bộ, trình soạn thảo mã và các công cụ gỡ lỗi.
Trước hết, bạn cần một môi trường máy chủ cục bộ có thể chạy WordPress. Chúng tôi khuyên bạn nên sử dụng các gói công cụ tích hợp như Laragon, XAMPP hoặc Local by Flywheel. Những công cụ này cho phép bạn cài đặt Apache/Nginx, PHP và MySQL chỉ với một cú nhấp chuột, giúp bạn tránh được quá trình cấu hình phức tạp. Hãy đảm bảo rằng phiên bản PHP của bạn tương thích với phiên bản WordPress hiện hành; thông thường, PHP 7.4 hoặc các phiên bản mới hơn được khuyến nghị sử dụng. Đồng thời, trong phần “Công cụ” -> “Sức khỏe trang web” (Tools -> Site Health) của WordPress, hãy kiểm tra xem có bất kỳ vấn đề nào quan trọng nào ảnh hưởng đến việc phát triển plugin không.
Thứ hai, hãy chọn một trình soạn thảo mã mạnh mẽ. Visual Studio Code là một lựa chọn rất phổ biến hiện nay; nó nhẹ nhàng, miễn phí, và có rất nhiều tiện ích mở rộng như PHP Intelephense (dùng để cung cấp gợi ý thông minh về mã nguồn) và WordPress Snippet (các đoạn mã mẫu). Một lựa chọn khác là PhpStorm, which cung cấp sự hỗ trợ phát triển WordPress chuyên sâu hơn, nhưng đây là phần mềm có phí.
Đọc thêm Từ không đến có: Hướng dẫn toàn diện và thực hành tốt nhất để phát triển plugin WordPress。
Cuối cùng, bật chế độ gỡ lỗi (debug mode) là một bước không thể thiếu trong quá trình phát triển. Điều này được thực hiện bằng cách sửa đổi các tệp tin trong thư mục gốc của WordPress (thư mục chứa các tệp cơ bản của hệ thống).wp-config.phpĐối với các tệp tin, bạn có thể bật chế độ báo cáo lỗi chi tiết; điều này rất quan trọng để phát hiện và sửa các lỗi trong mã nguồn. Hãy tìm xem các định nghĩa được thực hiện trong tệp tin đó.WP_DEBUGỞ nơi có các hằng số, hãy thêm đoạn mã sau:
// 启用 WordPress 调试模式
define( 'WP_DEBUG', true );
// 将错误记录到 /wp-content/debug.log 文件
define( 'WP_DEBUG_LOG', true );
// 在页面上显示错误(开发环境推荐,生产环境必须关闭)
define( 'WP_DEBUG_DISPLAY', true ); Tạo tệp plugin đầu tiên của bạn
Một plugin cho WordPress có thể đơn giản đến mức chỉ gồm duy nhất một tệp tin. Tất cả các plugin đều phải được lưu trữ trong một thư mục nhất định trên máy chủ./wp-content/plugins/Các plugin có thể sở hữu các thư mục con riêng, điều này giúp tổ chức cấu trúc mã nguồn một cách hiệu quả hơn, đặc biệt là đối với những dự án có cấu trúc phức tạp.
Chú thích ở phần đầu của plugin
Mỗi tệp chính của plugin đều phải bắt đầu bằng các chú thích đầu tiêu đề PHP được tiêu chuẩn hóa; đây là cách WordPress nhận diện thông tin về plugin. Hãy tạo một tệp mới và đặt tên nó là…my-first-plugin.phpVà đặt nó vào đó./wp-content/plugins/my-first-plugin/Nằm trong thư mục đó. Nội dung của tệp tin như sau:
<?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 chú thích này cung cấp toàn bộ thông tin meta về plugin được hiển thị trên trang “Plugins” trong giao diện quản trị WordPress (backend). Trong đó,Text Domain和Domain PathDùng để chuẩn bị cho việc hỗ trợ quốc tế hóa (i18n) các plugin.
Triển khai một chức năng đơn giả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 dòng văn bản tùy chỉnh ở cuối nội dung bài viết. Chúng ta sẽ sử dụng công cụ của WordPress để thực hiện điều này.the_contentFilter hook. In the one you just created…my-first-plugin.phpDưới phần chú thích ở đầu tệp, hãy thêm hàm sau:
Đọc thêm Nắm vững kỹ năng phát triển plugin cho WordPress: Xây dựng các tính năng tùy chỉnh từ con số không。
// 在文章内容末尾添加自定义文本
function my_first_plugin_add_footer_text( $content ) {
// 确保只在主循环的单篇文章页面执行
if ( is_single() && in_the_loop() && is_main_query() ) {
$footer_text = '<p><em>Cảm ơn bạn đã đọc! Bài viết này được cung cấp bởi “My First Plugin”.</em></p>';
$content .= $footer_text;
}
return $content;
}
add_filter( 'the_content', 'my_first_plugin_add_footer_text' ); Sau khi lưu file, hãy đăng nhập vào trang quản trị WordPress của bạn, truy cập vào trang “Plugins” (Các tiện ích mở rộng). Bạn sẽ thấy một tiện ích có tên là “My First Plugin” (Tiện ích đầu tiên của tôi). Hãy kích hoạt nó, sau đó truy cập một bài viết trên blog và bạn sẽ nhận thấy rằng đoạn văn bản mà chúng ta đã thiết lập đã được thêm vào cuối bài viết đó.
Sử dụng API cốt lõi của WordPress
Khi tiến hành phát triển ứng dụng một cách sâu rộng, bạn sẽ thường xuyên tương tác với các API mà WordPress cung cấp. Trong số đó, hệ thống “Hook” (Câu nối) là thành phần cốt lõi nhất, bao gồm hai loại chính: “Actions” (Hành động) và “Filters” (Bộ lọc).
Hiểu các hook hành động
Các “hook hành động” (action hooks) cho phép bạn thực thi mã tự định vào những thời điểm cụ thể. Ví dụ, khi một bài viết được đăng, bạn muốn gửi một email thông báo. Lúc này, bạn có thể sử dụng các hook hành động để thực hiện điều đó.publish_postHành động (Actions). Ví dụ dưới đây minh họa cách tạo một chức năng ghi thông tin vào nhật ký lỗi khi một bài viết được đăng.
// 定义文章发布时执行的动作函数
function my_first_plugin_log_post_published( $post_id, $post ) {
// 避免无限循环和非文章类型
if ( wp_is_post_revision( $post_id ) || $post->post_type != ‘post’ ) {
return;
}
// 记录日志
error_log( “文章 ID {$post_id} 已发布,标题为:{$post->post_title}” );
}
// 将函数挂载到 publish_post 动作钩子上
add_action( ‘publish_post’, ‘my_first_plugin_log_post_published’, 10, 2 ); Hàmadd_actionTham số thứ ba là mức độ ưu tiên (mặc định là 10); số càng nhỏ thì mức độ ưu tiên càng cao. Tham số thứ tư là số lượng các tham số mà hàm nhận vào.
Hiểu về các hook (khớp nối) trong bộ lọc (filter hooks)
Các hook của bộ lọc được sử dụng để chỉnh sửa dữ liệu. Trong chương “Tạo tệp plugin đầu tiên của bạn”, chúng ta đã sử dụng chúng.the_contentĐó chỉ là một “hook” (một thành phần được sử dụng trong hệ thống lọc dữ liệu) mà thôi. Nó nhận nội dung nguyên bản, cho phép bạn thực hiện các thay đổi cần thiết, sau đó trả về nội dung đã được sửa đổi. Một ví dụ khác thường được sử dụng là việc điều chỉnh độ dài của phần tóm tắt bài vi
// 修改摘要的默认字数
function my_first_plugin_custom_excerpt_length( $length ) {
return 30; // 将摘要字数改为30字
}
add_filter( ‘excerpt_length’, ‘my_first_plugin_custom_excerpt_length’ ); Thêm menu trang chủ (Add a home page menu)
Để tương tác với người dùng, chúng ta thường cần thêm một trang menu vào thanh bên cạnh quản trị trong giao diện WordPress. Điều này có thể được thực hiện bằng cách…add_menu_pageHàm thực hiện. Đoạn mã sau thêm một trang cài đặt cấp cao nhất cho plugin:
// 创建插件管理菜单
function my_first_plugin_add_admin_menu() {
add_menu_page(
‘我的第一个插件设置’, // 页面标题
‘我的插件’, // 菜单标题
‘manage_options’, // 所需权限
‘my-first-plugin’, // 菜单slug
‘my_first_plugin_settings_page’, // 回调函数,用于输出页面内容
‘dashicons-admin-plugins’, // 图标(可选)
100 // 菜单位置(可选)
);
}
add_action( ‘admin_menu’, ‘my_first_plugin_add_admin_menu’ );
// 设置页面的回调函数
function my_first_plugin_settings_page() {
?>
<div class="“wrap”">
<h1>Cài đặt plugin đầu tiên của tôi</h1>
<p>Đây là trang cấu hình của plugin. Trong tương lai, bạn có thể thêm các biểu mẫu (forms) và tùy chọn (options) vào đây.</p>
</div>
<?php
} 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) để người khác sử dụng, tính bảo mật và chất lượng mã nguồn là những yếu tố không thể bỏ qua. Việc tuân thủ các thực hành tốt nhất (best practices) có thể giúp bảo vệ trang web khỏi các cuộc tấn công, đồng thời đảm bảo tính tương thích
Xác thực và thoát dữ liệu
Đừng bao giờ tin tưởng vào dữ liệu do người dùng nhập vào hoặc dữ liệu từ cơ sở dữ liệu. Trước khi hiển thị dữ liệu trên trình duyệt, bạn cần phải tiến hành xử lý (như “đánh dấu đặc biệt” – escape) chúng; trước khi lưu chúng vào cơ sở dữ liệu, bạn cần phải kiểm tra và làm sạch chúng. WordPress cung cấp rất nhiều hàm hỗ trợ cho việc này.
- Xuất dữ liệu an toàn: Sử dụng
esc_html()、esc_attr()、esc_url()和wp_kses_post()Các hàm như vậy sẽ tiến hành mã hóa (escape) dữ liệu dựa trên ngữ cảnh cụ thể. - Xác thực nhập liệu: Sử dụng
sanitize_text_field()、sanitize_email()、intval()Các hàm như vậy được sử dụng để dọn dẹp dữ liệu từ biểu mẫu được người dùng gửi đi.
Ví dụ, khi thiết lập trang xử lý dữ liệu từ biểu mẫu:
$user_input = $_POST[‘some_field’] ?? ‘’; // 使用空合并运算符提供默认值
$clean_input = sanitize_text_field( $user_input ); // 清理数据
update_option( ‘my_plugin_option’, $clean_input ); // 安全存储 Sử dụng các phương thức không dựa trên CE (Common Encryption) và các quy trình kiểm tra quyền (permission checks).
Khi xử lý các yêu cầu từ biểu mẫu (đặc biệt là những yêu cầu đến từ các tệp admin-ajax.php hoặc admin-post.php), bạn phải sử dụng những quy trình hoặc công cụ được thiết kế riêng để đảm bảo tính chính xác, an toàn và hiệu quả trong việc xử lý dữ liệu.wp_verify_nonce()Để xác thực tính hợp lệ của yêu cầu và ngăn chặn các cuộc tấn công giả mạo yêu cầu xuyên trang web (Cross-Site Request Forgery – CSRF), hãy sử dụng…current_user_can()Kiểm tra xem người dùng hiện tại có quyền thực hiện thao tác đó hay không.
function my_first_plugin_handle_form_submit() {
// 1. 检查nonce
if ( ! isset( $_POST[‘my_nonce_field’] ) || ! wp_verify_nonce( $_POST[‘my_nonce_field’], ‘my_action’ ) ) {
wp_die( ‘安全校验失败!’ );
}
// 2. 检查权限
if ( ! current_user_can( ‘manage_options’ ) ) {
wp_die( ‘权限不足!’ );
}
// 3. 安全地处理数据…
} Tổ chức mã nguồn và quốc tế hóa
Đối với các plugin phức tạp, khuyến nghị sử dụng lập trình hướng đối tượng (Object-Oriented Programming – OOP) để tổ chức mã nguồn, bằng cách phân chia các chức năng thành các lớp (classes). Điều này giúp tăng độ dễ đọc và khả năng tái sử dụng của mã nguồn.
Đồng thời, hãy chuẩn bị sẵn cho việc hỗ trợ các ngôn ngữ quốc tế ngay từ đầu. Điều này có nghĩa là tất cả các chuỗi ký tự dùng để hiển thị cho người dùng đều nên được xử lý bằng các hàm dịch của WordPress.__()、_e()Tiến hành đóng gói sản phẩm. Nhìn lại các ghi chú ở phần đầu của plugin, chúng ta đã định nghĩa (hoặc thiết lập) các thông số cần thiết rồi.Text DomainTrong mã nguồn, bạn nên sử dụng nó như sau:
$message = __( ‘感谢阅读!本文由“我的第一个插件”为您呈现。’, ‘my-first-plugin’ ); Sau đó, bạn có thể sử dụng các công cụ như Poedit để tạo ra những gì bạn cần..pottệp mẫu, để người dịch tạo ra các ngôn ngữ khác nhau.moTệp.
Tóm lại
Thông qua hướng dẫn này, bạn đã hoàn thành hành trình cơ bản trong quá trình tạo ra một plugin cho WordPress từ con số không. Bạn đã học được cách thiết lập môi trường phát triển, tạo các tệp plugin chứa các ghi chú đầu tiên (header comments) theo tiêu chuẩn, và sử dụng hệ thống hook mạnh mẽ của WordPress để thêm các tính năng mới. Chúng ta cũng đã thảo luận về cách thêm menu quản trị một cách an toàn, xử lý dữ liệu, đồng thời nhấn mạnh tầm quan trọng của tính bảo mật và hỗ trợ đa ngôn ngữ (internationalization). Việc phát triển plugin là một quá trình liên tục học hỏi và thực hành; điều quan trọng nhất là hiểu rõ về hệ thống hook và các quy tắc bảo mật của WordPress. Tiếp theo, bạn có thể thử phát triển những tính năng phức tạp hơn, như tạo bảng cơ sở dữ liệu tùy chỉnh, thêm các đoạn mã ngắn (Shortcode), widget, hoặc các điểm cuối API (API endpoints), từ đó dần xây dựng những plugin chuyên nghiệp với chức năng đầy đủ và mã nguồn ổn định.
FAQ 常见问题
Một plugin có phải phải được đặt trong một thư mục riêng biệt không?
Không, một plugin có thể chỉ đơn giản là một thành phần độc lập (tức là không phụ thuộc vào các thành phần khác trong hệ thống)..phpĐơn giản là đặt tệp tin đó vào đúng vị trí cần thiết./wp-content/plugins/Các tệp tin thường nằm trong thư mục gốc của dự án. Tuy nhiên, đối với bất kỳ plugin nào chứa nhiều tệp tin, tài nguyên (như JS, CSS) hoặc cần được dịch, bạn nên sử dụng một thư mục riêng biệt để lưu trữ tất cả các tệp liên quan. Điều này sẽ giúp cấu trúc dự án trở nên rõ ràng hơn và dễ quản lý hơn.
Làm thế nào để các thiết lập của plugin của tôi được lưu trữ trong cơ sở dữ liệu?
WordPress cung cấp một API tùy chọn (Options API) rất tiện lợi. Bạn có thể sử dụng nó để thực hiện các thao tác cần thiết.add_option()、get_option()和update_option()Các hàm được sử dụng để thêm, lấy và cập nhật cài đặt của plugin. Những dữ liệu này sẽ được lưu trữ một cách an toàn trong hệ thống WordPress.wp_optionsTrong các bảng cơ sở dữ liệu, đối với lượng dữ liệu có cấu trúc lớn, bạn có thể xem xét việc sắp xếp dữ liệu đó thành các mảng (array) hoặc chuỗi JSON trước khi lưu trữ chúng.
Các plugin mà tôi phát triển có thể xảy ra xung đột với các plugin khác không?
Điều đó là có thể, đặc biệt là khi các plugin sử dụng những hook, tên hàm, hoặc tên lớp chung. Để tránh xung đột, thực hành tốt nhất là: thêm một tiền tố duy nhất cho tất cả các hàm, lớp, và biến của bạn (ví dụ: sử dụng tên viết tắt hoặc tên của plugin), sử dụng “slug” của plugin làm không gian tên (có thể áp dụng không gian tên thực sự trong PHP 5.3+), và chọn đúng thứ tự ưu tiên khi sử dụng các hook để đảm bảo trình tự thực thi như mong muốn.
Plugin cần tương thích với những phiên bản WordPress nào?
Điều này phụ thuộc vào đối tượng người dùng mà bạn nhắm đến. Thông thường, việc tương thích với các phiên bản chính hiện tại cũng như một hoặc hai phiên bản trước đó được khuyến nghị. Bạn có thể tham khảo thông tin chi tiết trong tài liệu hướng dẫn sử dụng plugin để biết cách thiết lập đúngreadme.txtTệp thông quaRequires at least:Các trường được sử dụng để chỉ định phiên bản WordPress tối thiểu cần thiết. Trong quá trình phát triển, nên tránh sử dụng các hàm chỉ có sẵn trong những phiên bản mới hơn, hoặc những tính năng mới được bổ sung trong những phiên bản đó.function_exists()Thực hiện việc đánh giá tính tương thích nhằm mở rộng phạm vi sử dụng của plugin.
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.
- Hướng dẫn phát triển plugin WordPress: Từ con số không đến plugin tùy chỉnh đầu tiên của bạn
- Trở thành nhà phát triển plugin WordPress: Hướng dẫn toàn diện từ đầu đến cuối
- Hướng dẫn toàn diện phát triển plugin WordPress: Từ cơ bản đến chuyên sâu để tạo các tiện ích mở rộng chuyên nghiệp
- 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
- Từ không đến có: Hướng dẫn toàn diện phát triển plugin WordPress đầu tiên của bạn một cách tuần tự