Làm việc với custom table trong WordPress: Hướng dẫn thực tế

Mặc định WordPress lưu dữ liệu trong một số bảng lõi như wp_posts, wp_postmeta, wp_options,… Tuy nhiên, khi phát triển plugin phức tạp (ví dụ hệ thống chat, log, hay analytics), việc nhồi dữ liệu vào postmeta hoặc options có thể gây phình to và làm chậm site. Giải pháp bền vững là tạo custom table riêng. Bài viết này sẽ hướng dẫn cách tạo và làm việc với custom table trong WordPress, kèm ví dụ thực tế.

Làm việc với custom table trong WordPress: Hướng dẫn thực tế

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_idmanga_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


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...