WordPress, một hệ thống quản lý nội dung (CMS), được nhiều người sử dụng để xây dựng website vì tính phổ biến, giao diện dễ sử dụng, hỗ trợ đa dạng từ blog cá nhân đến web doanh nghiệp với chi phí ít, thời gian nhanh.
Cấu trúc các bảng database mặc định của WP
WordPress hỗ trợ chúng ta custom nhiều thứ từ cms cho tới frontend, tuy nhiên nếu chúng ta nhìn vào cấu trúc database thì nó chỉ có 12 bảng, nếu chỉ gói gọn trong 12 bảng thì data trong cùng 1 bảng về lâu dài sẽ phình to ra ảnh hưởng ít nhiều đến tốc độ query của site.
Hình 1 – Cấu trúc các bảng database mặc định của WP
Vấn đề hiện tại
Một điểm quan trọng nữa là cách WordPress thực hiện query vẫn chưa được tối ưu. Ví dụ nếu chúng ta xem xét bảng posts và postmeta, khi cần trích xuất danh sách bài viết thỏa mãn 4 điều kiện lọc như đoạn mã dưới đây.
Hình 2 – Hàm query của wordpress
Và in ra cấu trúc sql của câu query trên sẽ là
Hình 3 – Cấu trúc sql sau khi đã in ra từ hàm query của wordpress
Dựa trên ví dụ trước đó, chúng ta thấy WordPress đã thực hiện việc join đến bảng postmeta tới 4 lần. Khi có nhiều điều kiện hơn, số lần kết nối cũng tăng lên. Với bảng postmeta đã lớn và việc kết nối nhiều như vậy thì chắc chắn sẽ gây chậm site.
Tại sao WordPress lại không giải quyết vấn đề này?
Theo tôi, họ đã hiểu vấn đề từ lâu và chấp nhận nó vì mục tiêu ban đầu của họ là xây dựng các trang web về blog không có nhiều dữ liệu phức tạp. Hơn nữa, họ đang xây dựng một cơ sở dữ liệu phục vụ cho nhiều mục đích sử dụng, không thể tối ưu hóa trước một cấu trúc dữ liệu cụ thể và phải chấp nhận điều này.
Vậy có cách nào cải thiện nó không?
Nếu site của bạn trở nên chậm chạp hoặc bạn chuẩn bị build 1 site có tính năng phức tạp vượt ra ngoài wordpress hỗ trợ thì việc custom database riêng có thể là một giải pháp. Bằng cách này, bạn có thể:
- Tối ưu hóa cấu trúc dữ liệu cho nhu cầu cụ thể của trang web, tăng tính linh hoạt và hiệu suất.
- Tạo các tính năng hoặc chức năng riêng biệt không được hỗ trợ trong cơ sở dữ liệu chuẩn của WordPress.
- Xây dựng một hệ thống quản lý phân quyền linh hoạt hơn để phù hợp với yêu cầu cụ thể của trang web.
Các bước tạo custom table
Bước 1: Tạo custom table sử dụng wordpress database api
Ví dụ chúng ta tạo thêm 1 bảng postmeta_custom trong cơ sở dữ liệu của WordPress theo code bên dưới.
Hình 4 – Code tạo custom database
Hình 5 – Database sẽ có thêm bảng mới
Bước 2: Viết các lớp thêm sửa xoá cho phần database mới tạo
Ngoài những hàm query wordpress đã build sẵn thì nó cũng cung cấp cho chúng ta những hàm cho phép thao tác trực tiếp vào database.
Link tham khảo: https://developer.wordpress.org/reference/classes/wpdb/
Hình 6 – Viết lớp thêm/sửa/xoá cho bảng database mới
Bước 3: Show data trong cms
3.1 Nếu xem data là bảng phụ của bảng posts thì chúng ta có thể sử dụng action add_meta_boxes để show thông tin database custom và action save_post để lưu lại thông tin từ database custom.
Hình 7 – Sử dụng add_meta_boxes/save_post để hiển thị và lưu thông tin database mới
Khi post liên quan bị xoá thì thông tin từ bảng postmeta_custom mới này cũng bị xoá theo, có thể dùng hook before_delete_post của wordpress như sau
Hình 8 – Xoá record liên quan nếu post cha bị xoá
3.2 Nếu xem data là bảng chính thì chúng ta có thể kế thừa lớp WP_List_Table để tạo ra danh sách data.
Link tham khảo: https://developer.wordpress.org/reference/classes/wp_list_table/
Hình 9 – Tạo danh sách data kế thừa lớp WP_List_Table
Tới đây chúng ta đã xong phần setup quản lý từ bảng database mới. Phần còn lại là chúng ta sử dụng query của lớp $wpdb để tiến hành query bên ngoài frontend theo yêu cầu của khách hàng.