Hướng dẫn query dữ liệu database wordpress, truy vấn SQL trong wordpress
Trở lại với chủ đề database của wordpress. Hôm nay mình sẽ hướng dẫn cho các bạn cách query dữ liệu database wordpress, tất nhiên là không dùng cái new WP_Query của wordpress :D. Bài viết này yêu cầu bạn phải có sơ kiến thức về mysql thì mới hiểu được. Mà nếu chưa có kiến thức thì hôm nay tìm hiểu cũng được :D
Hướng dẫn query dữ liệu database wordpress
1. Get results
Get results sử dụng trong trường hợp lấy nhiều record trong 1 bảng. Ví dụ mình có đoạn code sau:
<?php global $wpdb; // Biến toàn cục lớp $wpdb được sử dụng trong khi tương tác với databse wordpress $limit = 10; // Số lượng record cần lấy $offset = 0; // Số lượng record bỏ qua $table = $wpdb->prefix . 'posts'; // Khai báo bảng cần lấy $sql = "SELECT * FROM {$table} WHERE `post_type` = 'post' LIMIT %d OFFSET %d"; // cậu sql query $data = $wpdb->get_results( $wpdb->prepare($sql, $limit, $offset), ARRAY_A); // thực thi câu query, trả về dữ liệu trong biến $data ?>
Với đoạn code trên mình muốn lấy ra 10 bài viết trong bảng wp_posts, có post_type là post. Dữ liệu trả về là 1 array có nhiều array con.
2. Get row
Get row sử dụng trong trường hợp bạn muốn lấy ra 1 record. Ví dụ như get 1 bài viết, dùng để get trang chi tiết bài viết...
<?php global $wpdb; $postID = 5; // id bài viết cần lấy $table = $wpdb->prefix . 'posts'; // Bảng cần lấy $sql = "SELECT * FROM {$table} WHERE `ID` = %d"; //câu sql query $data = $wpdb->get_row( $wpdb->prepare($sql, $postID), ARRAY_A); //trả về dữ liệu trong biến $data ?>
Đoạn code trên lấy dữ liệu của 1 record có ID là 5. Dữ liệu sẽ trả về 1 mảng chứa thông tin của bài viết có id là 5.
3. Get var
Get var được sử dụng trong trường hợp lấy 1 giá trị nào đó trong database. Ví dụ số lượng bài viết, số lượng view của 1 bài viết...
<?php global $wpdb; $user_id = 1; // Đặt biết user_id $table = $wpdb->prefix . 'posts'; // Bảng cần lấy $sql = "SELECT COUNT(*) FROM {$table} WHERE `post_author` = %d"; //câu sql query $number = $wpdb->get_var( $wpdb->prepare($sql, $user_id)); //trả về dữ liệu trong biến $number ?>
Đoạn code trên thực hiện nhiệm vụ lấy số lượng bài viết của user có id là 1. Được gán vào biến $munber
Ngoài 3 cách query dữ liệu như trên wordpress còn có cung cấp một số phương pháp query kiểu khác, nhưng mình chưa tìm hiểu đến nên chưa dùng. Các bạn nếu cần có thể tìm hiểu thử.
Hướng dẫn join 1, nhiều bảng và query dữ liệu database wordpress
1. Join 1 bảng và query dữ liệu
Bài toán ví dụ: Get bài viết có kèm tên tác giả của bài viết đó.
Phân tích: Trong database wordpress thì bài viết được lưu ở bảng wp_posts và trong bảng này ko có cột để lưu tên của tác giả, chỉ có cột để lưu id của tác giả là 'post_author'. Tên tác giả được lưu ở bảng wp_users. Vì vậy để đáp ứng yêu cầu của bài toán chúng ta từ bảng wp_posts phải join vào bảng wp_user để lấy tên của tác giả như sau:
<?php global $wpdb; $user_id = 1; $table_post = $wpdb->prefix . 'posts'; // Bảng post $table_user = $wpdb->prefix . 'users'; // Bảng bảng user $limit = 10; $offset = 0; $sql = "SELECT {$table_post}.`ID`, `post_title`, `post_date`, `display_name` FROM {$table} LEFT JOIN {$table_user} ON {$table_post}.`post_author` = {$table_user}.`ID` WHERE `post_status` = 'publish' AND `post_type` = 'post' LIMIT %d OFFSET %d"; //câu sql query $data = $wpdb->get_results( $wpdb->prepare($sql, $limit, $offset), ARRAY_A); //trả về dữ liệu trong biến $data ?>
Đoạn code trên lấy ra 10 record của bảng wp_posts. Mỗi record có các thông tin sau:
- Id của bài viết
- Tiêu đề bài viết
- Ngày viết bài
- Tên tác giả của bài viết
Bạn có thể lấy nhiều thông tin hơn bằng cách khai váo những trường cần lấy chổ cậu sql SELECT...
2. Join nhiều bảng và query dữ liệu
Bài toán ví dụ: Get bài viết có kèm tên và mô tả tác giả của bài viết đó.
Phân tích: Cũng tương tự như bài toán trên nhưng ở bài này yêu cầu là cần thêm mô tả của tác giả. Mô tả của tác giả thì lại không nằm trong bảng post và user mà nó lại nằm trong bảng wp_usermeta. Vì thế để thực hiện bài toán này chúng ta sẽ tiếp tục join thêm 1 bảng nữa vào code.
<?php global $wpdb; $user_id = 1; $table_post = $wpdb->prefix . 'posts'; // Bảng post $table_user = $wpdb->prefix . 'users'; // Bảng bảng user $table_usermeta = $wpdb->prefix . 'usermeta'; // User meta $limit = 10; $offset = 0; $sql = "SELECT {$table_post}.`ID`, `post_title`, `post_date`, `display_name`, {$table_usermeta}.`meta_value` as description FROM {$table} LEFT JOIN {$table_user} ON {$table_post}.`post_author` = {$table_user}.`ID` LEFT JOIN {$table_usermeta} ON {$table_usermeta}.`user_id` = {$table_user}.`ID` WHERE `post_status` = 'publish' AND `post_type` = 'post' AND {$table_usermeta}.`meta_key` = 'description' LIMIT %d OFFSET %d"; //câu sql query $data = $wpdb->get_results( $wpdb->prepare($sql, $limit, $offset), ARRAY_A); //trả về dữ liệu trong biến $data ?>
Ở bài này mình join thêm 1 bảng wp_usermeta. Bảng user và bảng usermeta liên kết với thông qua user_id. Chúng ta tiến hành join như bình thường!
Tóm lại:
Bài hôm nay mình đã hướng dẫn cho bạn cách query dữ liệu database wordpress. Cách query này thường áp dụng cho trường hợp bạn tạo bảng mới trong database wordpress mà bảng đó không có hàm nào hỗ trợ get dữ liệu.
Ưu điểm:
- Dữ liệu trả về rất nhanh, làm tăng tốc đố load web, cũng như tăng performance cho website
- Có thể get dữ liệu của bất kỳ bảng nào trong database
- Không phụ thuộc vào các hàm của WP
- Câu query thân thiện giống với query trong php thuần
Nhược điểm:
- Tốn thời gian viết code
- Phải có kiến thức cơ bản về mysql và cấu trúc database của wordpress
- Dễ bị tấn công sql injection nếu không có kiến thức bảo mật tốt.
Để tìm hiểu kỹ hơn về việc query dữ liệu database wordpress các bạn có thể tham khảo tài liệu ở đây: => Class wpdb
Chúc các bạn học wordpress hiệu quả!
Võ Quang Huy (Huy Kira)
Đam mê hóa học, ưng thi vào trường kinh tế... Đậu vào trường Sư phạm, quyết tâm đi dạy... Ra trường đi làm designer, tự học frontend, chuyển qua làm PHP, được công ty đào tạo laravel... Và hiện tại đang code react native(2015) => Fullstack ... ?? tối về viết blog... (Còn tiếp...)