Sử dụng tham số để truy vấn với WP_Query trong WordPress

Sử dụng tham số để truy vấn với WP_Query trong WordPress

Khi bạn viết theme hay lập trình Plugin, việc truy vấn sử dụng trong là điều không thể tránh khỏi. Có những yêu cầu thiết kế website khó khăn, nhưng nếu nắm bắt được truy vấn WP_Query với các tham số đầu vào và giá trị đầu ra sẽ làm việc code trở nên dễ dàng hơn rất nhiều. Trong bài viết này, mình sẽ chia sẻ với bạn một số cách để sử dụng WP_Query trong WordPress, giúp bạn nắm hiểu rõ hơn về các tham số đầu vào và giá trị đầu ra khi truy vấn.

Cách sử dụng WP_Query trong WordPress

Trước khi bắt đầu vào tìm hiểu các tham số đầu vào và giá trị đầu ra, mình cần nắm rõ cách sử dụng của WP_Query, và để theo dõi kết quả xem câu query đó trả về những thứ gì bạn có thể dùng một plugin của WordPress để làm điều đó là plugin Debug Bar.

Lấy danh sách các bài viết bằng query

WP_Query là một lớp đối tượng được định nghĩa, hoạt động của nó liên quan đến việc truy vấn phức tạp từ các loại Post và Page (kể cả custom post type). Cú pháp của WP_Query như sau:

$query = new WP_Query( $args );

Trong đó:

  • $query: là biến đối tượng trả về.
  • $args: là một biến mảng chứa các tham số truy vấn.

Để kiểm tra có bài đăng nào trả về trong truy vấn không bạn sử dụng hàm $query->have_posts(). Giá trị trả về của hàm have_posts() là TRUE hoặc FALSE.

Ví dụ như sau:

<?php
  $the_query = new WP_Query( $args );
   if ( $the_query->have_posts() ) {
      // Có dữ liệu
   } else {
      // Không có dữ liệu
   }
?>

Dữ liệu trả về được sử dụng trong vòng lặp để lấy dữ liệu. Ví dụ như sau:

<?php
   $the_query = new WP_Query( $args );
   if ( $the_query->have_posts() ) {
      while ( $the_query->have_posts() ) : $the_query->the_post();
         //Hiển thị nội dung từ vòng lặp
      endwhile;
      wp_reset_postdata();
    } else {
      // Không có dữ liệu
    }
?>

Trong đó:

  • $the_query->the_post(): Trả về mảng chứa dữ liệu.
  • wp_reset_postdata(): Khi sử dụng $the_query->the_post(), bạn nên sử dụng để reset về dữ liệu truy vấn mặc định.

Tham số truy vấn trong WP_Query WordPress

Tham số truy vấn theo tác giả

lay cac bai viet theo tac gia

Lấy các bài viết của một tác giá xác định

Khi sử dụng tham số “author”, kết quả trả về sẽ là các bài viết của 1 hoặc nhiều các tác giả được liêt kê trong tham số. Có nhiều dạng liệt kê như: ID, name, một mảng, hoặc loại bỏ tác giả đó ra khỏi truy vấn. Cụ thể như sau:

//Tham số truy vấn theo ID tác giả
$query = new WP_Query( array( 'author' => 123 ) );

//Tham số truy vấn theo tên tác giả
$query = new WP_Query( array( 'author_name' => 'rami' ) );

//Tham số truy vấn nhiều ID của các tác giả.
$query = new WP_Query( array( 'author' => '2,6,17,38' ) );

//Tham số truy vấn loại trừ đi ID của một tác giả.
$query = new WP_Query( array( 'author' => -12 ) );

//Tham số truy vấn nhiều tác giả, tương tự
$query = new WP_Query( array( 'author__in' => array( 2, 6 ) ) );

//Tham số loại trừ tác nhiều tác giả.
$query = new WP_Query( array( 'author__not_in' => array( 2, 6 ) ) );

Tham số truy vấn theo danh mục bài viết

Truy vấn các bài viết cùng chuyên mục

Để thực hiện lấy các bài viết trong danh mục, bạn sử dụng các tham số như ‘cat’, ‘category_name’,…. Các cách dùng cụ thể của các tham số như sau:

//Tham số lấy các bài viết trong danh mục có ID là 4
$query = new WP_Query( array( 'cat' => 4 ) );

//Tham số lấy các bài viết trong danh mục có tên là staff
$query = new WP_Query( array( 'category_name' => 'staff' ) );

//Tham số lấy các bài viết trong danh mục ID là 4 (tương tự)
$query = new WP_Query( array( 'category__in' => 4 ) );

//Tham số lấy tất cả bài viết của các danh mục có liệt kê ID
$query = new WP_Query( array( 'cat' => '2,6,17,38' ) );

//Tham số lấy tất cả bài viết của các danh mục có liệt kê tên
$query = new WP_Query( array( 'category_name' => 'staff,news' ) );

//Tham số lấy tất cả bài viết được nằm trong cả hai mục staff và news
$query = new WP_Query( array( 'category_name' => 'staff+news' ) );

//Tham số lấy các bài viết mà nó không nằm trong một trong các danh mục được liệt kê.
$query = new WP_Query( array( 'cat' => '-12,-34,-56' ) );

//Tham số lấy tất cả bài viết được nằm trong cả hai mục ID là 2 và 6
$query = new WP_Query( array( 'category__and' => array( 2, 6 ) ) );

//Tham số lấy tất cả bài viết được nằm một trong hai mục ID 2 và 6
$query = new WP_Query( array( 'category__in' => array( 2, 6 ) ) );

//Tham số lấy các bài viết mà nó không nằm trong một trong các danh mục được liệt kê.
$query = new WP_Query( array( 'category__not_in' => array( 2, 6 ) ) );

Tham số truy vấn theo Tags

Lấy các bài viết theo tag

Để truy vấn lấy danh sách các bài viết theo Tag cũng tương tự như danh mục, cũng có các tham số như sau:

//Tham số truy cấn theo tên tag
$query = new WP_Query( array( 'tag' => 'cooking' ) );

//Tham số truy vấn theo ID của tag
$query = new WP_Query( array( 'tag_id' => 13 ) );

//Tham số truy vấn hiển thị các bài viết trong các tag
$query = new WP_Query( array( 'tag' => 'bread,baking' ) );

//Tham số truy vấn hiển thị các bài viết nằm trong 3 tag cùng lúc
$query = new WP_Query( array( 'tag' => 'bread+baking+recipe' ) );

//Tham số truy vấn hiển thị các bài viết nằm trong 2 tag cùng lúc
$query = new WP_Query( array( 'tag__and' => array( 37, 47 ) ) );

//Tham số truy vấn hiển thị các bài viết trong các tag
$query = new WP_Query( array( 'tag__in' => array( 37, 47 ) ) );

//Tham số truy vấn hiển thị các bài viết không nằm trong các tag
$query = new WP_Query( array( 'tag__not_in' => array( 37, 47 ) ) );

Tham số truy vấn theo Taxonomy

Khi bạn cần lấy các bài viết theo phân loại bài viết thì bạn có thể sử dụng Query với các tham số sau để lấy được danh sách các bài viết.

Lấy các bài viết theo một Taxonomy cụ thể.

$args = array(
‘post_type’ => ‘post’,
‘tax_query’ => array(
array(
‘taxonomy’ => ‘people’,
‘field’ => ‘slug’,
‘terms’ => ‘bob’,
),
),
);
$query = new WP_Query( $args );

Lọc các bài viết với tham số AND

$args = array(
‘post_type’ => ‘post’,
‘tax_query’ => array(
‘relation’ => ‘AND’,
array(
‘taxonomy’ => ‘movie_genre’,
‘field’ => ‘slug’,
‘terms’ => array( ‘action’, ‘comedy’ ),
),
array(
‘taxonomy’ => ‘actor’,
‘field’ => ‘term_id’,
‘terms’ => array( 103, 115, 206 ),
‘operator’ => ‘NOT IN’,
),
),
);
$query = new WP_Query( $args );

Lọc các bài viết với tham số OR

$args = array(
‘post_type’ => ‘post’,
‘tax_query’ => array(
‘relation’ => ‘OR’,
array(
‘taxonomy’ => ‘category’,
‘field’ => ‘slug’,
‘terms’ => array( ‘quotes’ ),
),
array(
‘taxonomy’ => ‘post_format’,
‘field’ => ‘slug’,
‘terms’ => array( ‘post-format-quote’ ),
),
),
);
$query = new WP_Query( $args );

Lọc các bài viết với tham số OR và AND

$args = array(
‘post_type’ => ‘post’,
‘tax_query’ => array(
‘relation’ => ‘OR’,
array(
‘taxonomy’ => ‘category’,
‘field’ => ‘slug’,
‘terms’ => array( ‘quotes’ ),
),
array(
‘relation’ => ‘AND’,
array(
‘taxonomy’ => ‘post_format’,
‘field’ => ‘slug’,
‘terms’ => array( ‘post-format-quote’ ),
),
array(
‘taxonomy’ => ‘category’,
‘field’ => ‘slug’,
‘terms’ => array( ‘wisdom’ ),
),
),
),
);
$query = new WP_Query( $args );

Tham số truy vấn tìm kiếm (search)

Được sử dụng khi bạn muốn tìm kiếm một bài viết, tác giả,…..

Tìm kiếm bài viết

$query = new WP_Query( array( ‘s’ => ‘keyword’ ) );

Tham số truy vấn theo Post và Page

Lấy các bài viết theo post và page.

$query = new WP_Query( array( ‘p’ => 7 ) );
//for page, use: ‘page_id’=>7

$query = new WP_Query( array( ‘name’ => ‘about-my-life’ ) );
//for page, use: ‘pagename’=>’about-my-life’

$query = new WP_Query( array( ‘pagename’ => ‘contact_us/canada’ ) );

// Lấy danh sách bài viết trên trang sử dụng tham số pagename.

$query = new WP_Query( array( ‘post_parent’ => 93 ) );

// Lấy danh sách bài viết theo post sử dụng tham số post_parent.

$query = new WP_Query( array( ‘post_parent__in’ => array( 2, 5, 12, 14, 20 ) ) );

// Lấy danh sách bài viết theo các id post.

$query = new WP_Query( array( ‘post_type’ => ‘page’, ‘post__in’ => array( 2, 5, 12, 14, 20 ) ) );

//Lấy các bài viết theo danh sách bài viết với kiểu post là page và với id

$query = new WP_Query( array( ‘post_type’ => ‘post’, ‘post__not_in’ => array( 2, 5, 12, 14, 20 ) ) );

Lấy danh sách bài viết kiểu post ngoại trừ các post có id được liệt kê.

Tham số truy vấn Post và Page sử dụng mật khẩu

$query = new WP_Query( array( ‘has_password’ => true ) );

// Truy vấn có mật khẩu

$query = new WP_Query( array( ‘has_password’ => false ) );

//Truy vấn không mật khẩu

$query = new WP_Query( array( ‘has_password’ => null ) );

// Truy vân có mật khẩu là trống.

$query = new WP_Query( array( ‘post_password’ => ‘zxcvbn’ ) );

// Truy vấn post có mật khẩu cụ thể.

Tham số truy vấn loại post

//Truy vấn loại post là page.

$query = new WP_Query( array( ‘post_type’ => ‘page’ ) );

// Truy vấn loại post bất kỳ.

$query = new WP_Query( array( ‘post_type’ => ‘any’ ) );

// Truy vấn theo loại post xác định

$args = array(
‘post_type’ => array( ‘post’, ‘page’, ‘movie’, ‘book’ )
);
$query = new WP_Query( $args );

Tham số truy vấn bài viết theo trạng thái (Status)

Đây là các tham số để sử dụng khi cần lấy danh sách các bài viết theo trạng thái cái này thường sử dụng khi bạn code phần admin của WordPress hơn

publish,pending,draft,auto-draft, future, private, inherit, trash, any

$query = new WP_Query( array( ‘post_status’ => ‘draft’ ) );

$args = array(
‘post_status’ => array( ‘pending’, ‘draft’, ‘future’ )
);
$query = new WP_Query( $args );

$args = array(
‘post_status’ => ‘any’,
‘post_type’ => ‘attachment’
);
$query = new WP_Query( $args );

Tham số truy vấn bài viết theo bình luận

// Truy vấn bài viết theo số bình luận

$args = array(
‘post_type’ => ‘post’,
‘comment_count’ => 20,
)
);
$query = new WP_Query( $args );

// Truy vấn bài viết theo một khoảng số bình luận nào đó.

$args = array(
‘post_type’ => ‘post’,
‘comment_count’ => array(
array(
‘value’ => 25,
‘compare’ => ‘>=’,
),
)
);
$query = new WP_Query( $args );

Tham số truy vấn bài viết theo phân trang

// Truy vấn theo số post trên một trang

$query = new WP_Query( array( ‘posts_per_page’ => 3 ) );

$query = new WP_Query( array( ‘posts_per_page’ => -1 ) );

// Truy vấn không phân trang

$query = new WP_Query( array( ‘nopaging’ => true ) );

// Truy vấn theo số trang cụ thể

$query = new WP_Query( array( ‘offset’ => 3 ) );

// Truy vấn theo số trang cụ thể cũng như số post trên mỗi trang cụ thể.

$query = new WP_Query( array( ‘posts_per_page’ => 5, ‘offset’ => 3 ) );

$query = new WP_Query( array( ‘paged’ => get_query_var( ‘paged’ ) ) );

Trên Page tĩnh hoặc page template thì dùng đoạn sau

$paged = ( get_query_var(‘page’) ) ? get_query_var(‘page’) : 1;
$query = new WP_Query( array( ‘paged’ => $paged ) );

Tham số truy vấn bài viết theo thứ tự sắp xếp

Khi bạn muốn truy vấn các bài viết theo thứ tự sắp xếp theo điều kiện mà bạn mong muốn thì bạn có thể sử dụng các query sau.

$args = array(
‘orderby’ => ‘title’,
‘order’ => ‘DESC’,
);
$query = new WP_Query( $args );

$args = array(
‘orderby’ => ‘menu_order title’,
‘order’ => ‘DESC’,
);
$query = new WP_Query( $args );

$args = array(
‘orderby’ => ‘rand’,
‘posts_per_page’ => 1,

);
$query = new WP_Query( $args );

Show post phổ biến bằng comment

$args = array(
‘orderby’ => ‘comment_count’
);
$query = new WP_Query( $args );

Show post theo custon fields

$args = array(
‘post_type’ => ‘product’,
‘orderby’ => ‘meta_value_num’,
‘meta_key’ => ‘price’,
);
$query = new WP_Query( $args );

$args = array(
‘orderby’ => array( ‘title’ => ‘DESC’, ‘menu_order’ => ‘ASC’ )
);
$query = new WP_Query( $args );

$args = array(
‘orderby’ => array( ‘meta_value_num’ => ‘DESC’, ‘title’ => ‘ASC’ ),
‘meta_key’ => ‘age’
);
$query = new WP_Query( $args );

$args = array(
‘post_type’ => ‘my_custom_post_type’,
‘meta_key’ => ‘age’,
‘orderby’ => ‘meta_value_num’,
‘order’ => ‘ASC’,
‘meta_query’ => array(
array(
‘key’ => ‘age’,
‘value’ => array( 3, 4 ),
‘compare’ => ‘IN’,
),
),
);
$query = new WP_Query( $args );

$q = new WP_Query( array(
‘meta_query’ => array(
‘relation’ => ‘AND’,
‘state_clause’ => array(
‘key’ => ‘state’,
‘value’ => ‘Wisconsin’,
),
‘city_clause’ => array(
‘key’ => ‘city’,
‘compare’ => ‘EXISTS’,
),
),
‘orderby’ => array(
‘city_clause’ => ‘ASC’,
‘state_clause’ => ‘DESC’,
),
) );

Tham số truy vấn bài viết theo thời gian

Khi muốn truy vấn bài viết theo mốc thời gian mà bạn mong muốn.

$query = new WP_Query( ‘year=2012&monthnum=12&day=12’ );

$args = array(
‘date_query’ => array(
array(
‘year’ => 2012,
‘month’ => 12,
‘day’ => 12,
),
),
);
$query = new WP_Query( $args );

$today = getdate();
$query = new WP_Query( ‘year=’ . $today[‘year’] . ‘&monthnum=’ . $today[‘mon’] . ‘&day=’ . $today[‘mday’] );

$today = getdate();
$args = array(
‘date_query’ => array(
array(
‘year’ => $today[‘year’],
‘month’ => $today[‘mon’],
‘day’ => $today[‘mday’],
),
),
);
$query = new WP_Query( $args );

$week = date( ‘W’ );
$year = date( ‘Y’ );
$query = new WP_Query( ‘year=’ . $year . ‘&w=’ . $week );

$args = array(
‘date_query’ => array(
array(
‘year’ => date( ‘Y’ ),
‘week’ => date( ‘W’ ),
),
),
);
$query = new WP_Query( $args );

$args = array(
‘date_query’ => array(
array(
‘hour’ => 9,
‘compare’ => ‘>=’,
),
array(
‘hour’ => 17,
‘compare’ => ‘<=’,
),
array(
‘dayofweek’ => array( 2, 6 ),
‘compare’ => ‘BETWEEN’,
),
),
‘posts_per_page’ => -1,
);
$query = new WP_Query( $args );

$args = array(
‘date_query’ => array(
array(
‘after’ => ‘January 1st, 2013’,
‘before’ => array(
‘year’ => 2013,
‘month’ => 2,
‘day’ => 28,
),
‘inclusive’ => true,
),
),
‘posts_per_page’ => -1,
);
$query = new WP_Query( $args );

$args = array(
‘date_query’ => array(
array(
‘column’ => ‘post_date_gmt’,
‘before’ => ‘1 year ago’,
),
array(
‘column’ => ‘post_modified_gmt’,
‘after’ => ‘1 month ago’,
),
),
‘posts_per_page’ => -1,
);
$query = new WP_Query( $args );

Tham số truy vấn bài đăng bằng Custom Field

Bạn cũng có thể truy vấn để lấy các bài đăng bẳng Custom Field và với kiểu truy vấn này bạn vẫn có thể dùng các biểu thức logic.

$query = new WP_Query( array( ‘meta_key’ => ‘color’ ) );

$query = new WP_Query( array( ‘meta_value’ => ‘blue’ ) );

$args = array(
‘meta_key’ => ‘color’,
‘meta_value’ => ‘blue’
);
$query = new WP_Query( $args );

$args = array(
‘meta_key’ => ‘color’,
‘meta_value’ => ‘blue’,
‘meta_compare’ => ‘!=’
);
$query = new WP_Query( $args );

$args = array(
‘post_type’ => ‘post’,
‘meta_key’ => ‘number’,
‘meta_value_num’ => 10,
‘meta_compare’ => ‘<‘,
);
$query = new WP_Query( $args );

$args = array(
‘post_type’ => ‘event’,
‘meta_key’ => ‘event_date’,
‘meta_value’ => date( “Ymd” ), // change to how “event date” is stored
‘meta_compare’ => ‘>’,
);
$query = new WP_Query( $args );

$args = array(
‘meta_key’ => ‘price’,
‘meta_value’ => ’22’,
‘meta_compare’ => ‘<=’,
‘post_type’ => ‘product’
);
$query = new WP_Query( $args );

$args = array(
‘post_type’ => ‘product’,
‘meta_query’ => array(
array(
‘key’ => ‘color’,
‘value’ => ‘blue’,
‘compare’ => ‘NOT LIKE’,
),
),
);
$query = new WP_Query( $args );

$args = array(
‘post_type’ => ‘product’,
‘meta_query’ => array(
‘relation’ => ‘OR’,
array(
‘key’ => ‘color’,
‘value’ => ‘blue’,
‘compare’ => ‘NOT LIKE’,
),
array(
‘key’ => ‘price’,
‘value’ => array( 20, 100 ),
‘type’ => ‘numeric’,
‘compare’ => ‘BETWEEN’,
),
),
);
$query = new WP_Query( $args );

$args = array(
‘post_type’ => ‘product’,
‘meta_query’ => array(
‘relation’ => ‘OR’,
array(
‘key’ => ‘color’,
‘value’ => ‘orange’,
‘compare’ => ‘=’,
),
array(
‘relation’ => ‘AND’,
array(
‘key’ => ‘color’,
‘value’ => ‘red’,
‘compare’ => ‘=’,
),
array(
‘key’ => ‘size’,
‘value’ => ‘small’,
‘compare’ => ‘=’,
),
),
),
);
$query = new WP_Query( $args );

Tham số truy vấn bài đăng bằng quyền user

Khi bạn muốn hiển thị các bài đăng thuộc quyền của một user nào đó bạn có thể sử dụng query này để truy vấn bài đăng đó.

$args = array(
‘post_status’ => array( ‘publish’, ‘private’ ),
‘perm’ => ‘readable’,
);
$query = new WP_Query( $args );