Tìm hiểu cách sử dụng register_activation_hook()
và $wpdb
để tạo bảng trong WordPress plugin một cách an toàn và hiệu quả. Hướng dẫn đầy đủ, dễ hiểu cho cả người mới và lập trình viên nâng cao.
Giới thiệu
Khi bạn phát triển một plugin WordPress và cần lưu dữ liệu riêng biệt (ví dụ: đơn hàng, đánh giá, thông báo…), bạn sẽ cần tạo bảng mới trong cơ sở dữ liệu. Tuy nhiên, không thể để đoạn tạo bảng này chạy mỗi lần load trang — điều đó sẽ ảnh hưởng nghiêm trọng đến hiệu suất và an toàn.
Bài học hôm nay sẽ hướng dẫn bạn cách tạo bảng đúng chuẩn trong plugin, sử dụng $wpdb
và register_activation_hook()
để chỉ chạy một lần duy nhất – khi người dùng kích hoạt plugin.
Tư duy đúng: Chỉ tạo bảng khi plugin kích hoạt
Bạn nên gói toàn bộ logic tạo bảng vào một hàm, và gọi nó bằng hook register_activation_hook()
– đây là hook chỉ chạy duy nhất một lần khi plugin được kích hoạt.
Bước 1: Viết hàm tạo bảng
function my_plugin_create_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'my_custom_table';
if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name varchar(100) NOT NULL,
email varchar(100) DEFAULT '' 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);
}
}
Giải thích:
global $wpdb;
giúp bạn truy cập vào đối tượng database toàn cục của WordPressSHOW TABLES LIKE
để kiểm tra xem bảng đã tồn tại hay chưadbDelta()
là hàm được WordPress thiết kế riêng để tạo bảng hoặc cập nhật bảng một cách an toàn
Bước 2: Gắn vào hook kích hoạt plugin
register_activation_hook(__FILE__, 'my_plugin_create_table');
__FILE__
trỏ đến file plugin chính (nơi khai báo hàm trên)- Hook này sẽ chạy chính xác một lần duy nhất khi plugin được kích hoạt
Bonus: Kiểm soát phiên bản bảng bằng add_option()
Nếu sau này bạn muốn cập nhật cấu trúc bảng (schema), bạn nên lưu phiên bản vào options
để kiểm tra:
function my_plugin_check_db_version() {
global $wpdb;
$installed_ver = get_option('my_plugin_db_version');
if ($installed_ver != '1.0') {
my_plugin_create_table();
update_option('my_plugin_db_version', '1.0');
}
}
register_activation_hook(__FILE__, 'my_plugin_check_db_version');
Nếu là Theme thì sao?
Themes không có register_activation_hook()
như plugin. Trong trường hợp đó, bạn dùng hook sau:
add_action('after_switch_theme', 'my_theme_create_table');
Hàm my_theme_create_table()
sẽ hoạt động tương tự như phần plugin.
Tổng kết
Thành phần | Vai trò |
---|---|
$wpdb | Đối tượng thao tác database WordPress |
dbDelta() | Tạo và cập nhật bảng an toàn |
register_activation_hook() | Hook chạy duy nhất 1 lần khi kích hoạt plugin |
get_option() / update_option() | Quản lý phiên bản schema bảng |
after_switch_theme | Hook tương tự cho theme |
Kết luận
Việc tạo bảng trong WordPress không chỉ là kỹ thuật SQL – mà còn là tư duy an toàn, linh hoạt, và tuân thủ hệ sinh thái WordPress. Khi bạn hiểu rõ $wpdb
, dbDelta
, và register_activation_hook()
, bạn sẽ thấy việc xây dựng plugin chuyên nghiệp dễ dàng hơn rất nhiều.
Nếu bạn cần mình hướng dẫn thêm về cách lưu dữ liệu, hiển thị bảng quản trị, hoặc CRUD form cho bảng vừa tạo – đừng ngại hỏi nhé!
Thảo luận