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

21/10/2019 Wordpress 6280 lượt xem
Lưu bài viết

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!