WordPress Nâng Cao

WP_Query và cách sử dụng trong WordPress

Trong WordPress, để truy vấn (query) dữ liệu post, page và nhiều thứ khác từ database thông thường ta sử dụng class được định nghĩa sẵn là WP_Query, class này được định nghĩa trong file wp-includes/query.php, đây là một class rất quan trọng và bạn sẽ bắt gặp nó thường xuyên nếu bạn tìm hiểu kỹ về WordPress. Chính vì thế trong bài viết này, WpGuide xin giới thiệu tới bạn WP_Query và cách sử dụng trong WordPress, hy vọng qua bài viết bạn sẽ hiểu rõ hơn về WP_Query và có thể truy vấn dữ liệu theo ý muốn của bạn.

Mặc định mỗi template đều đã gọi class WP_Query và ta có thể sử dụng luôn bằng cách gọi biến $wp_query. Bạn có xóa hết code trong template single.php rồi chèn đoạn code sau để xem giá trị của biến $wp_query:



<pre>
<?php print_r($wp_query); ?>
</pre>

wp-query-va-cach-su-dung

Bạn có thể thấy có rất nhiều thuộc tính xuất hiện trong biến $wp_query, thông thường để sử dụng những thuộc tính này ta phải dùng lệnh để trỏ đến thuộc tính cần sử dụng trong $wp_query, ví dụ để xem dữ liệu của thuộc tính post ta cần một đoạn lệnh như sau:


<pre>
<?php print_r($wp_query->post); ?>
<pre>

Nhưng WordPress đã làm việc này đơn giản hơn một chút, bạn chỉ cần gọi đối tượng đã được WordPress định nghĩa sẵn, bạn có thể tìm thấy chúng tại WP_Query Properties. Bạn có thể thấy danh sách khá dài nhưng hiện tại bạn chỉ cần quan tâm đến đối tượng $post, đây là đối tượng được định nghĩa cho $wp_query->post. Trong này có 2 đối tượng là $posts$post, đây là 2 đối tượng khác nhau, $posts sẽ chứa tất cả những bài viết truy vấn được từ data nhưng $post sẽ chỉ hiển thị bài viết đang được truy vấn. Thông thường bạn sẽ chỉ sử dụng $post và khi muốn hiển thị toàn bộ bài viết thì bạn sẽ sử dụng vòng lặp (loop).

wp_query-va-cach-su-dung

Vòng lặp (loop) cho WP_Query

Bạn có thể mở template index.php của theme twentysixteen và bạn sẽ thấy cấu trúc cơ bản của một vòng lặp trong WordPress nó như thế này:

<?php 
/*
 * Đoạn mã này hiển thị tiêu đề các bài viết ra trang chủ 
 */ 
if ( $wp_query->have_posts() ) : //Kiểm tra xem có bài viết hay không
 // Start the loop. 
 while ( $wp_query->have_posts() ) : $wp_query->the_post();
  //the_post() sẽ trỏ tới giá trị tiếp theo và thiết lập lại giá trị cho $post
  echo $post->post_title . '<br/>'; //Hiển thị tham số post_title trong $post 
 // End the loop.
 endwhile; 
endif; 
?> 

Vì $wp_query là một đối tượng được định nghĩa sẵn nên bạn có thể viết lại đoạn mã trên như sau vẫn được WordPress chấp nhận:

<?php 
/*
 * Đoạn mã này hiển thị tiêu đề các bài viết ra trang chủ 
 */ 
if ( have_posts() ) : //Kiểm tra xem có bài viết hay không
 // Start the loop. 
 while ( have_posts() ) : the_post();
  //the_post() sẽ trỏ tới giá trị tiếp theo và thiết lập lại giá trị cho $post
  echo $post->post_title . '<br/>'; //Hiển thị tham số post_title trong $post 
 // End the loop.
 endwhile; 
endif; 
?> 

Ngoài ra, bạn có thể sử dụng các Template Tag đã được nhắc đến trong bài trước để thay cho việc gọi tham số như $post->post_title

Làm thế nào để truy vấn WP_Query theo yêu cầu?

Nếu chỉ sử dụng đối tượng $wp_query thì bạn sẽ không thể truy vấn dữ liệu theo ý muốn, ví dụ bạn chỉ muốn hiển thị bài viết trong một chuyên mục nhất định thì phải làm như thế nào? Để trả lời câu hỏi này, WordPress đã cho phép bạn có thể tùy chỉnh tham số để có bạn có thể truy vấn dữ liệu theo đúng những gì bạn muốn.

Có 2 cách để bạn khai báo một đối tượng để lấy dữ liệu từ WP_Query:

$my_query = new WP_Query('posts_per_page=5&cat=5');

hoặc

$args = array('posts_per_page' => 5,
              'cat' => 5
              );
$my_query = new WP_Query($args);

Cả hai cách trên đều trả về giá trị giống nhau nhưng mình khuyên bạn nên sử dụng cách thứ 2 vì nó giúp bạn quản lý các tham số dễ dàng hơn. Cách sử dụng đối tượng $my_query giống như với $wp_query nên mình sẽ chỉ liệt kê ra một vài tham số quan trọng thường dùng trong quá trình lập trình với WordPress.

Lưu ý: Khi bạn sử dụng $wp_query thì bạn không phải khai báo gì cả nhưng với $my_query bạn phải khai báo nó trước vòng lặp.

Để phân trang bạn phải có lệnh wp_reset_postdata() sau vòng lặp, mình sẽ nói kỹ hơn về kỹ thuật phân trang vào những bài viết sau.

Các tham số thông dụng của WP_Query

  • posts_per_page: Tùy chỉnh số lượng bài viết cần lấy
  • post_type: Lấy bài viết từ một post type chỉ định, nếu muốn lấy nhiều post type khác nhau, bạn có thể cho chúng vào mảng, ví dụ:


$args = array('post_type' => array('posts', 'page', 'abcxyz'));

$my_query = new WP_Query($args);


  • offset: Bỏ qua một số lượng các bài viết, ví dụ bạn muốn hiển thị 5 bài viết ra trang chủ nhưng lại ko muốn hiển thị bài viết mới nhất thì bạn chỉnh offset = 1.
  • order & orderby: Lấy bài viết theo thứ tự được sắp xếp theo giá trị orderby.
  • ignore_sticky_posts: Giá trị bằng 1 nếu bạn không muốn hiển thị sticky posts, và ngược lại.
  • tag (string) : Lấy bài theo slug của tag.
  • tag_id (int) : Lấy bài theo ID của tag.
  • tag__and (array) : Lấy bài từ nhiều tag nhưng các bài đó sử dụng chung nhiều tag, sử dụng ID.
  • tag__in (array) : Lấy bài từ nhiều tag khác nhau, sử dụng ID.
  • tag__not_in (array) : Không lấy bài từ tag chỉ định, dùng ID.
  • tag_slug__and (array) : Tương tự với tag__and nhưng dùng slug.
  • tag_slug__in (array) : Tương tự với tag__in nhưng dùng slug.
  • cat (int) : Lấy bài theo ID của category.
  • category_name (string) : Lấy bài theo slug của category.
  • category__and (array) : Lấy bài từ nhiều category nhưng những bài này có chung category, sử dung ID.
  • category__in (array) : Lấy bài từ nhiều category khác nhau, sử dụng ID.
  • category__not_in (array) : Không lấy bài từ category chỉ định, sử dụng ID.

Thêm: lấy bài theo thời gian

Trên đây là một vài tham số thường dùng trong WP_Query, bạn có thể xem đầy đủ tại WP_Query Parameters.

Lời kết

WP_Query có thể coi là một class quan trọng bậc nhất trong WordPress, với những tùy chỉnh tham số, bạn có thể truy vấn bài viết theo ý mình và hơn thế nữa nếu bạn có khả năng sáng tạo và ứng dụng những kỹ thuật khác của WordPress.

Hẹn gặp lại bạn trong bài viết tiếp theo.

About the author

hoadx

Với WPGuide, mình mong muốn được chia sẻ những kinh nghiệm, thủ thuật, hướng dẫn về WordPress và nhiều thứ khác...

1 Comment

Leave a Comment