Khôi Phục Mật Khẩu

Vui lòng liên hệ với Quản trị viên để được hỗ trợ reset lại mật khẩu tài khoản của bạn.

Zalo Admin
0358949680
Nhắn Zalo
Hoặc
Quên mật khẩu ?
Tạo tài khoản để truy cập đầy đủ tính năng!
Hoặc
Trang chủ / Blog / Thực hành query dữ liệu database wordpress sử dụng wpdb
Huy Kira
Huy Kira · Theo dõi

Thực hành query dữ liệu database wordpress sử dụng wpdb

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.

Thực hành query dữ liệu database wordpress sử dụng wpdb

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:

<?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:

<?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.

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

<?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í 6 năm trước

mất nữa ngày giờ đã tìm ngay vấn đề hay quá anh ơi .

nguyen thien 4 năm trước

tô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

Thick Quota 4 năm trước

Truy 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";

Huy Kira 4 năm trước

Bá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

Thick Quota 4 năm trước

thiếu thêm điều kiện rồi AND post.post_mime_type = 'image/png' cảm ơn Huy đã check nhé

Thick Quota 4 năm trước

1. 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'