Hướng dẫn wordpress query mysql - truy vấn wordpress mysql

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 😀

Hướng dẫn wordpress query mysql - truy vấn wordpress mysql

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:

  global$wpdb;// Biến toàn cục lớp $wpdb được sử dụng trong khi tương tác với databse wordpressglobal$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$limit=10;// Số lượng record cần lấy

  $offset=0;// Số lượng record bỏ qua$offset=0; // Số lượng record bỏ qua

  $table=$wpdb->prefix.'posts';// Khai báo bảng cần lấy$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 $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$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…

  global  $wpdb;global  $wpdb;

  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$postID=5;// id bài viết cần lấy

  $limit=10;// Số lượng record cần lấy$table  =$wpdb->prefix. 'posts';// Bảng cần lấy

  $offset=0;// Số lượng record bỏ qua$sql    ="SELECT * FROM {$table} WHERE `ID` = %d";//câu sql query

  $table=$wpdb->prefix.'posts';// Khai báo bảng cần lấy$data   =$wpdb->get_row($wpdb->prepare($sql, $postID),ARRAY_A);//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…

  global$wpdb;global$wpdb;

  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$user_id=1;// Đặt biết user_id

  $limit=10;// Số lượng record cần lấy$table=$wpdb->prefix. 'posts';// Bảng cần lấy

  $offset=0;// Số lượng record bỏ qua$sql="SELECT COUNT(*) FROM {$table} WHERE `post_author` = %d";//câu sql query

  $table=$wpdb->prefix.'posts';// Khai báo bảng cần lấy$number=$wpdb->get_var($wpdb->prepare($sql, $user_id));//trả về dữ liệu trong biến $number

?>

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

Hướng dẫn wordpress query mysql - truy vấn wordpress mysql

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…

  $postID=5;// id bài viết cần lấy

  $table  =$wpdb->prefix.'posts';// Bảng cần lấy Get bài viết có kèm tên tác giả của bài viết đó.

  $sql    ="SELECT * FROM {$table} WHERE `ID` = %d";//câu sql queryTrong 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:

global$wpdb;$wpdb;

$user_id=1;=1;

  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=$wpdb->prefix.'posts';// Bảng post

  $limit=10;// Số lượng record cần lấy=$wpdb->prefix.'users';// Bảng bảng user

$limit=10;=10;

$offset=0;=0;

  $offset=0;// Số lượng record bỏ qua= "SELECT {$table_post}.`ID`, `post_title`, `post_date`, `display_name`

  $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

?>;//câu sql query

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.=$wpdb->get_results( $wpdb->prepare($sql,$limit,$offset),ARRAY_A);//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…
  •   $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.Get bài viết có kèm tên và mô tả tác giả của bài viết đó.

3. Get varCũ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.

global$wpdb;$wpdb;

$user_id=1;=1;

  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=$wpdb->prefix.'posts';// Bảng post

  $limit=10;// Số lượng record cần lấy=$wpdb->prefix.'users';// Bảng bảng user

  $offset=0;// Số lượng record bỏ qua=$wpdb->prefix.'usermeta';// User meta

$limit=10;=10;

$offset=0;=0;

  $table=$wpdb->prefix.'posts';// Khai báo bảng cần lấy="SELECT {$table_post}.`ID`, `post_title`, `post_date`, `display_name`, {$table_usermeta}.`meta_value` as description

  $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

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 ;//câu sql query

$data=$wpdb->get_results($wpdb->prepare($sql,$limit,$offset),ARRAY_A);//trả về dữ liệu trong biến $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ả!