Khi nào nên dùng custom table?
- Dữ liệu quá lớn và không liên quan trực tiếp đến post/user (ví dụ: chat log, analytics event).
- Cần query phức tạp hoặc hiệu năng cao (filter theo nhiều cột, join dữ liệu nhanh hơn).
- Không muốn “ô nhiễm” wp_postmeta hoặc wp_options (tránh autoload nặng).
Tạo custom table với dbDelta
WordPress cung cấp hàm dbDelta() để tạo hoặc nâng cấp bảng. Ví dụ: tạo bảng lưu log truy cập manga.
<?php
register_activation_hook( __FILE__, 'init_create_custom_table' );
function init_create_custom_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'manga_logs';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
user_id bigint(20) unsigned NOT NULL,
manga_id bigint(20) unsigned NOT NULL,
action varchar(50) NOT NULL,
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY user_id (user_id),
KEY manga_id (manga_id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
Bảng wp_manga_logs sẽ được tạo với index cho user_id và manga_id để query nhanh hơn.
Thêm dữ liệu vào custom table
Dùng $wpdb->insert() để thêm log mới:
<?php
global $wpdb;
$table = $wpdb->prefix . 'manga_logs';
$wpdb->insert(
$table,
[
'user_id' => get_current_user_id(),
'manga_id' => 123,
'action' => 'read',
],
[ '%d', '%d', '%s' ]
);
Truy vấn dữ liệu
Dùng $wpdb->get_results() để lấy danh sách log theo manga:
<?php
global $wpdb;
$table = $wpdb->prefix . 'manga_logs';
$logs = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM $table WHERE manga_id = %d ORDER BY created_at DESC LIMIT 20",
123
)
);
foreach ( $logs as $log ) {
echo "User {$log->user_id} đã {$log->action} vào {$log->created_at}<br>";
}
Xóa dữ liệu
<?php
global $wpdb;
$table = $wpdb->prefix . 'manga_logs';
$wpdb->delete(
$table,
[ 'user_id' => 5 ],
[ '%d' ]
);
Ví dụ thực tế: Hệ thống log đọc manga
- Khi user đọc một chương → ghi log vào custom table.
- Có thể query để hiển thị lịch sử đọc gần đây.
- Dùng log để phân tích thói quen đọc, feed recommendation.
So với việc nhồi log vào usermeta hoặc postmeta, custom table: nhẹ hơn, query nhanh hơn, scale tốt hơn.
Lưu ý khi làm việc với custom table
- Luôn dùng
$wpdb->prefixđể tương thích multisite. - Định nghĩa index chuẩn để tối ưu query (không thì custom table cũng chậm như postmeta).
- Dùng
dbDelta()khi upgrade schema (thêm cột mới, index mới). - Viết wrapper class để không lặp lại code insert/select/delete khắp nơi.
Kết luận
Custom table là giải pháp tối ưu cho dữ liệu lớn, phức tạp hoặc cần query chuyên biệt trong WordPress. Nó giúp giảm tải wp_postmeta, tránh phình wp_options, và mở đường cho các tính năng nâng cao như analytics, chat, logging. Với ví dụ log đọc manga ở trên, có thể thấy custom table giúp plugin/theme WordPress vừa mạnh mẽ hơn, vừa giữ được hiệu năng khi scale.
Bình luận