Hôm trước mình có giới thiệu cách truy vấn sql vào database wordpress để get dữ liệu, nhưng vẫn thấy chưa thấm lắm =)). Nên hôm nay mình và các bạn cùng nhau thực hành query dữ liệu database wordpress để hiểu hơn về cách query dữ liệu database wordpress
Mình sẽ lần lượt đưa ra các ví dụ yêu cầu, rồi sau đó sẽ giải quyết các vấn đề đó nha.
1. Truy vấn sql database wordpress get 10 bài viết mới nhất có hình đại diện
Phân tích: Như chúng ta đã biết bài viết được lưu trong bảng wp_posts, hình đại diện của bài viết lại lưu trong bảng wp_postmeta, nhưng ngặt ngèo ở chổ nó chỉ lưu id của hình dại diện chứ không phải là url của hình.
Vì thế để lấy ra được hình đại diện của bài post chúng ta phải query như sau: Từ wp_posts join bảng wp_postmeta để lấy ID của hình đại diện rồi tiếp tục join ngược lại bảng wp_posts để lấy url hình ảnh (Vì hình ảnh của wp được lưu trong bảng wp_posts).
Cụ thể chúng ta sẽ có đoạn code như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php global $wpdb; $table = $wpdb->prefix . 'posts'; $tablemeta = $wpdb->prefix . 'postmeta'; $limit = 10; $offset = 0; $sql = "SELECT `post`.`ID`, `post`.`post_author` as author, `post`.`post_date` as date, `post`.`post_title` as title, `post`.`post_name` as slug, `imagethumb`.`guid` as image FROM $table as post LEFT JOIN $tablemeta as thumbnail ON `thumbnail`.`post_id` = `post`.`ID` AND `thumbnail`.`meta_key` = '_thumbnail_id' LEFT JOIN $table as imagethumb ON `imagethumb`.`ID` = `thumbnail`.`meta_value` WHERE `post`.`post_type` = 'post' AND `post`.`post_status` = 'publish' GROUP BY `ID` ORDER BY `date` DESC LIMIT %d OFFSET %d"; $data = $wpdb->get_results( $wpdb->prepare($sql, $limit, $offset), ARRAY_A); ?> |
2. Truy vấn sql database wordpress get list danh mục với số lượng bài viết
Phân tích: Danh mục bài viết được lưu ở bảng wp_terms, nhưng số lượng bài viết của từng danh mục thì lại lưu ở bảng wp_term_taxonomy với yêu cầu này chúng ta từ bảng wp_terms join bảng wp_term_taxonomy sau đó get các thành phần tương ứng:
Cụ thể code như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php global $wpdb; $limit = 100; $offset = 0; $tableterm = $wpdb->prefix . 'terms'; $tabletaxo = $wpdb->prefix . 'term_taxonomy'; $sql = "SELECT `term`.`term_id` as id, `term`.`name` as title, `term`.`slug` as slug, `tax`.`parent` as parent, `tax`.`count` as count FROM $tableterm as term LEFT JOIN $tabletaxo as tax ON `term`.`term_id` = `tax`.`term_id` WHERE `tax`.`taxonomy` = 'category' ORDER BY `term`.`term_id` DESC LIMIT %d OFFSET %d"; $data = $wpdb->get_results( $wpdb->prepare($sql, $limit, $offset), ARRAY_A); ?> |
3. Truy vấn sql database wordpress get danh sách thành viết bình luận nhiều trong tháng
Đây là đoạn code được nhiều người cần để list top thành viên bình luận nhiều. Code này mình lấy top 10 thành viên bình luận nhiều nhất.
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $m = (string)date('m', time()); $y = (string)date('Y', time()); global $wpdb; $comments = $wpdb->get_results( "SELECT `comment_ID`, `comment_post_ID`, `comment_author`, `comment_author_email`, `comment_author_url`, count(comment_author_email) As count FROM `wp_comments` WHERE comment_approved=1 AND `comment_date` LIKE '$y-$m%' Group by comment_author_email order by count DESC LIMIT 10" ); $data =(array)$comments; ?> |
4. Get top thành viên viết bài nhiều nhất trong tháng
Bạn nào làm tổng kết báo cáo website chắc cần đoạn code này. Code get 10 thành viên viết bài nhiều nhất trong tháng
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $month = (string)date('m', time()); $year = (string)date('Y', time()); global $wpdb; $table_post = $wpdb->prefix . 'posts'; $table_user = $wpdb->prefix . 'users'; $query = "SELECT u.ID, u.display_name, u.user_email, count(post_title) as num FROM {$table_post} p JOIN {$table_user} u ON p.post_author = u.ID WHERE post_type='post' AND post_status='publish' AND YEAR(post_date)=%d AND MONTH(post_date)=%d GROUP BY post_author ORDER BY num DESC LIMIT 10"; $data = $wpdb->get_results( $wpdb->prepare( $query, $year, $month )); ?> |
Tổng kết:
Bài hôm nay mình đã giới thiệu nhiều hơn về query dữ liệu từ database của wordpress. Một khi bạn đã thành thạo trong việc sử dụng class $wpdb thì wordpress không còn là vấn đề của bạn. Hy vọng bài viết này sẽ giúp ích cho bạn!
Bạn nào có cần đoạn code nào liên quan đến cách get dữ liệu wordpress mà chưa rõ thì comment cho mình biết mình sẽ giúp!. Các bạn có thể đọc qua bài viết này để biết các câu sql hay cần dùng cho wordpress
Chúc các bạn học wordpress thành công!
Huỳnh Thiện Trímất nữa ngày giờ đã tìm ngay vấn đề hay quá anh ơi .
Thích Trả lời 3 năm trước
nguyen thientôi có một nhu cầu bạn có thể giúp được không: tôi muốn truy suất 1 dòng trong data table khi nhập id của dòng
Thích Trả lời 1 năm trước
Thick QuotaTruy vấn sql database wordpress get 10 bài viết mới nhất có hình đại diện Code query của Huy có vẻ hơi cồng kềnh quá, dùng query sau dễ hiểu và gọn nhẹ hơn: $sql = "SELECT post.ID as ID, post.post_author as author, post.post_modified as date, post.post_title as title, post.post_name as slug, post.guid as image FROM $table post LEFT JOIN $tablemeta meta ON post.ID = meta.post_id WHERE meta.meta_key = '_thumbnail_id' AND post.post_type = 'post' AND post.post_status = 'publish' ORDER BY post.post_modified DESC LIMIT %d OFFSET %d";
Thích Trả lời 6 tháng trước
Huy KiraBác chạy câu query của bác chưa :))). post.guid as image <= có thấy gì sai chổ này ko :D
Thích Trả lời 6 tháng trước
Thick Quotachời, nó là alias khi gọi ra thôi mà. Display ra thay vì guid --> image
Thích Trả lời 6 tháng trước
Thick Quotaleft join 1 lần 2 bảng là đủ dữ liệu rồi, sau đó dùng mệnh đề where lọc theo điều kiện thôi
Thích Trả lời 6 tháng trước
Thick Quotathiếu thêm điều kiện rồi AND post.post_mime_type = 'image/png' cảm ơn Huy đã check nhé
Thích Trả lời 6 tháng trước
Huy KiraỦa bác chạy thử code của bác chưa vậy :D. Thêm cái này vào có tác dụng gì nhỉ. Ví dụ là ảnh gif, jpeg, jpg là ko lấy được hả... mà sao chỉ chấp nhận png. p/s: Mà cái sai ở đây ko phải chổ đó, sai là cái 'post' nó đang làm bài viết chả liên quan gì đến hình đại diện hết. Bác phải join thêm 1 bản posts nữa thì mới lấy được link hình đại diện. Bác nên chảy thử code của mình!
Thích Trả lời 6 tháng trước
Thick Quotaok, để mình check lại, cảm ơn bạn
Thích Trả lời 6 tháng trước
Thick Quota1. Truy vấn sql database wordpress get tất cả bài viết có hình đại diện sau cái left join thứ 1 điều kiện gộp bảng ON có AND `thumbnail`.`meta_key` = '_thumbnail_id' --> cái này là điều kiện để dưới sau mệnh đề where mới đúng phải không? Huy thử xem lại nhé, mình để dưới đó lọc ra mới đúng, còn để ngay sau ON không có ý nghĩa. Mình thử chạy rồi, Huy check xem nhé, mình theo code Huy bị lọt lưới vài row, bỏ limit nhé. SELECT * FROM $table as post LEFT JOIN $tablemeta as thumbnail ON post.ID = thumbnail.post_id LEFT JOIN $table imagethumb ON imagethumb.ID = thumbnail.meta_value WHERE thumbnail.meta_key = '_thumbnail_id' AND post.post_type = 'post' AND post.post_status = 'publish'
Thích Trả lời 6 tháng trước