Tìm hiểu đối tượng WP_Query trong lập trình WORDPRESS - Lập trình website thật dễ

Tìm hiểu đối tượng WP_Query trong lập trình WORDPRESS

Thông thường nếu bạn muốn lấy dữ liệu trong một table nào đó chẳng hạn như là table wp_post đi  nhé, nếu dùng biến toàn cục $wpdb để gọi tới các phương thức hỗ trợ như là get_results(), get_row()...vv việc này sẽ làm bạn tốn thời gian, nhưng với đối tượng WP_Query() thì bạn sẽ nhẹ nhàng hơn trong các thao tác gọi tới và show dữ liệu ra ngoài themes

Trong bài viết này tôi sẽ cố gắng làm rõ tất cả các vướng mắc hay gặp phải khi sử dụng đối tượng WP_Query

  1. WP_Query là gì ?
  2. Tại sao phải sử dụng WP_Query ?
  3. Một vài điểm lưu ý.

 

WP_Query là một class trong core của WordPress và được định nghĩa trong file wp-includes/query.php. Nó cung cấp các phương thức giúp cho việc thao tác với dữ liệu của post, page ( trong database ) một cách dễ dàng hơn, hầu hết các vấn đề mà bạn gặp phải khi làm việc với post, page đều đã được giải quyết trong class này.

Nếu như khi bạn tự build một website từ đầu, bạn cần phải viết ra từng lệnh MySQL Query một, rồi dùng các hàm để kết nối database, thực thi các câu lệnh query. Thì trong WordPress, điều đó được thay thế bằng class $wpdb. Sau đó bạn tập hợp các lệnh MySQL lại thành một class để lấy dữ liệu , thì trong WordPress, class đó tương ứng với WP_Query, chỉ có một sự khác biệt là nó đẹp hơn, đáng tin cậy và được bảo trì bởi rất nhiều lập trình viên giỏi trên khắp thế giới.

<?php
$args = array( 
  
//////Author Parameters - Tham số lấy bài viết theo tác giả
    //http://codex.wordpress.org/Class_Reference/WP_Query#Author_Parameters
    'author' => '1,2,3,',                     //(int) - Các ID tác giả cần lấy bài viết (thêm dấu - vào để loại trừ tác giả, ví dụ: -14, -20)
    'author_name' => 'luetkemj',              //(string) - Lấy bài viết dựa theo tên nick name của tác giả
    'author__in' => array( 2, 6 ),            //(array) - Lấy bài dựa theo ID của tác giả
    'author__not_in' => array( 2, 6 ),        //(array)' - Các ID của tác giả không muốn lấy bài
  
//////Category Parameters - Tham số lấy bài viết dựa theo category
    //http://codex.wordpress.org/Class_Reference/WP_Query#Category_Parameters
    'cat' => 5,//(int) - Lấy bài dựa theo ID của category
    'category_name' => 'staff, news',          //(string) - Lấy bài dựa theo category slug
    'category__and' => array( 2, 6 ),         //(array) - Lấy bài mà nó mang cả hai category 2 và 6 (ID)
    'category__in' => array( 2, 6 ),          //(array) - ID của các category không muốn lấy bài
    'category__not_in' => array( 2, 6 ),      //(array) - Các ID của category không muốn lấy bài
     
//////Tag Parameters - Tham số lấy bài viết dựa theo tag
    //http://codex.wordpress.org/Class_Reference/WP_Query#Tag_Parameters
    'tag' => 'cooking',                       //(string) - Lấy bài viết theo tag slug
    'tag_id' => 5,                            //(int) - Lấy bài viết theo tag ID
    'tag__and' => array( 2, 6),               //(array) - Lấy bài viết mà nó mang cả hai tag có ID 2 và 6
    'tag__in' => array( 2, 6),                //(array) - Lấy tất cả bài viết trong nhiều tag ID khác nhau
    'tag__not_in' => array( 2, 6),            //(array) - Các tag ID không muốn lấy bài
    'tag_slug__and' => array( 'red', 'blue'), //(array) - Lấy bài viết mà nó mang cả hai tag có slug red và blue
    'tag_slug__in' => array( 'red', 'blue'),  //(array) - Lấy bài viết trong nhiều tag slug khác nhau
  
//////Taxonomy Parameters - Lấy bài viết dựa theo taxonomy
    //http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
    //Quan trọng: tax_query là tham số có thể sẽ chứa nhiều mảng lồng vào bên trong
    'tax_query' => array(                     //(array) - Lấy bài viết dựa theo taxonomy
    'relation' => 'AND',                      //(string) - Mối quan hệ giữa các tham số bên trong, AND hoặc OR
      array(
        'taxonomy' => 'color',                //(string) - Tên của taxonomy
        'field' => 'slug',                    //(string) - Loại field cần xác định term của taxonomy, sử dụng 'id' hoặc 'slug'
        'terms' => array( 'red', 'blue' ),    //(int/string/array) - Slug của các terms bên trong taxonomy cần lấy bài
        'include_children' => true,           //(bool) - Lấy category con, true hoặc false
        'operator' => 'IN'                    //(string) - Toán tử áp dụng cho mảng tham số này. Sử dụng 'IN' hoặc 'NOT IN'
      ),
      array(
        'taxonomy' => 'actor',
        'field' => 'id',
        'terms' => array( 103, 115, 206 ),
        'include_children' => false,
        'operator' => 'NOT IN'
      )
    ),

//////Post & Page Parameters - Lấy bài viết dựa vào tham số của Post hoặc Page
    //http://codex.wordpress.org/Class_Reference/WP_Query#Post_.26_Page_Parameters
    'p' => 1,                               //(int) - ID của post cần hiển thị
    'name' => 'hello-world',                //(string) - Slug của post cần hiển thị
    'page_id' => 1,                         //(int) - ID của page cần hiển thị
    'pagename' => 'sample-page',            //(string) - Slug của page cần hiển thị
    'pagename' => 'contact_us/canada',      //(string) - Hiển thị page con bằng slug của page mẹ và page con, cách nhau bởi dấu gạch chéo
    'post_parent' => 1,                     //(int) - Lấy page con dựa vào ID của page mẹ
    'post_parent__in' => array(1,2,3)       //(array) - Lấy nhiều page con dựa vào nhiều page mẹ thông qua ID
    'post_parent__not_in' => array(1,2,3),  //(array) - Các ID của page mẹ không muốn hiển thị page con
    'post__in' => array(1,2,3),             //(array) - Danh sách các post cần lấy, dùng ID
    'post__not_in' => array(1,2,3),         //(array) - Danh sách các post không muốn lấy, dùng ID
    //NOTE: Bạn không thể sử dụng 'post__in' cùng với 'post__not_in' trong một query

//////Password Parameters - Lấy các bài viết dựa theo thiết lập mật khẩu của post
    //http://codex.wordpress.org/Class_Reference/WP_Query#Password_Parameters
    'has_password' => true,                 //(bool) - Lấy các bài viết có đặt password
                                              //true bài viết có pass 
                                              //false bài viết không có pass
                                              //null Mặc định nó sẽ lấy toàn bộ post có pass và không có pass
    'post_password' => 'multi-pass',          //(string) - show posts with a particular password (available with Version 3.9)

//////Type - Hiển thị post dựa vào loại post 
    //http://codex.wordpress.org/Class_Reference/WP_Query#Type_Parameters
    'post_type' => array(                   //(string / array) - tên post type cần lấy bài viết. Mặc định là 'post'
            'post',                         // -  post.
            'page',                         // - page.
            'revision',                     // - revision.
            'attachment',                   // - tập tin đính kèm. 
            'my-post-type',                 // - Tên custom post type
            ),
    'post_type' => 'any',                   // - Lấy bất kỳ post type đang có trên website

//////Status Parameters - Lấy các bài viết dựa theo trạng thái của nó
    //http://codex.wordpress.org/Class_Reference/WP_Query#Status_Parameters
    'post_status' => array(                 //(string / array)       
            'publish',                      // - Post hoặc Page đã được publish
            'pending',                      // - Post đang ở trạng thái Pending Review
            'draft',                        // - Post đang trong nháp
            'auto-draft',                   // - Các bài viết tự động lưu nháp
            'future',                       // - Bài viết đang được đặt thời gian đăng trong tương lai
            'private',                      // - Bài viết đang trong trạng thái riêng tư
            'inherit',                      // - Lấy một bản revision
            'trash'                         // - Lấy post từ thùng rác
            ),
    'post_status' => 'any',                 // - Sử dụng bất kỳ trạng thái nào


    
//////Pagination Parameters
    //http://codex.wordpress.org/Class_Reference/WP_Query#Pagination_Parameters
    'posts_per_page' => 10,                 //(int) - Số lượng bài viết cần lấy ra để hiển thị trên mỗi trang. Nếu muốn hiển thị toàn bộ thì đặt giá trị là -1
    'posts_per_archive_page' => 10,         //(int) - Số lượng bài viết cần lấy ra hiển thị trên mỗi trang. Nhưng chỉ sử dụng cho các trang lưu trữ.
    'nopaging' => false,                    //(bool) - Nếu muốn sử dụng phân trang thì đặt là true. Mặc định là false.
    'paged' => get_query_var('paged'),      //(int) - Số trang hiện tại.
                                            //NOTE: Sử dụng get_query_var('page') nếu bạn cần sử dụng nó ở một Custom Page Template
    										// http://codex.wordpress.org/Function_Reference/next_posts_link#Usage_when_querying_the_loop_with_WP_Query
                                            // http://codex.wordpress.org/Pagination#Troubleshooting_Broken_Pagination
    'offset' => 3,                          // (int) - Số bài viết trước đó mà bạn muốn bỏ qua.
                                            // Warning: Thiết lập này sẽ làm cho phần phân trang bị lỗi, xem thêm: http://codex.wordpress.org/Making_Custom_Queries_using_Offset_and_Pagination
    										// Nếu tham số 'posts_per_page' có giá trị là -1 thì offset sẽ bị bỏ qua.

                                            
    'page' => get_query_var('page'),        // (int) - Số trang hiện tại sử dụng cho Custom Page Template.
                                            
    'ignore_sticky_posts' => false,         // (boolean) - Tuỳ chọn có lấy bài viết được Sticky hay không. Nếu false thì sẽ hiển thị, true thì bỏ qua.

	//////Order & Orderby Parameters - Thiết lập kiểu sắp xếp các bài viết
    //http://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters
    'order' => 'DESC',                      //(string) - Thiết lập hiển thị tăng dần hay giảm dần.
                                              //Possible Values:
                                              //'ASC' - Hiển thị kiểu tăng dần (1, 2, 3; a, b, c).
                                              //'DESC' - Hiển thị kiểu giảm dần (3, 2, 1; c, b, a).
    'orderby' => 'date',                    //(string) - Thiết lập loại dữ liệu sẽ được sắp xếp dựa vào. Mặc định nó sẽ là tham số 'date' để dựa vào ngày đăng bài.
                                              //Possible Values:
                                              //'none' - Không sắp xếp
                                              //'ID' - Sắp xếp bởi ID bài viết
                                              //'author' - Sắp xếp bởi tác giả
                                              //'title' - Sắp xếp bởi tiêu đề
                                              //'name' - Sắp xếp bởi slug
                                              //'date' - Sắp xếp bởi ngày tháng
                                              //'modified' - Sắp xếp bởi ngày cập nhật
                                              //'parent' - Sắp xếp bởi ID của page mẹ
                                              //'rand' - Sắp xếp ngaẫu nhiên
                                              //'comment_count' - Sắp xếp bởi số lượng bình luận
                                              //'menu_order' - Sắp xếp bởi thứ tự của trang
                                              //'meta_value' - Sắp xếp bởi giá trị meta data
                                              //'meta_value_num' - Sắp xếp bởi giá trị dạng số tự nhiên của meta data
																							 
//////Date Parameters - Lấy bài viết trong khoảng thời gian cố định
    //http://codex.wordpress.org/Class_Reference/WP_Query#Date_Parameters

    'date_query' => array(                  //(array) - Date parameters (available with Version 3.7).
                                              //these are super powerful. check out the codex for more comprehensive code examples http://codex.wordpress.org/Class_Reference/WP_Query#Date_Parameters
      array(
	    'year' => 2014,                         //(int) - năm cần lấy bài (e.g. 2011).
	    'monthnum' => 4,                        //(int) - Tháng cần lấy bài (from 1 to 12).
	    'w' =>  25,                             //(int) - Số tuần trong năm cần lấy bài (từ 0 đến 53).
	    'day' => 17,                            //(int) - Lấy bài dựa theo ngày trong tháng (từ 1 đến 31).
	    'hour' => 13,                           //(int) - Lấy bài dựa theo giờ trong ngày (từ 0 đến 23).
	    'minute' => 19,                         //(int) - Lấy bài dựa theo phút trong giờ (từ 0 đến 60).
	    'second' => 30,                         //(int) - Lấy bài dựa theo giây trong phút (0 đến 60).
	    'm' => 201404,                          //(int) - Tháng của năm cần lấy bài (Ví dụ: 201307).
        'after'     => 'January 1st, 2013', //(string/array) - Lấy bài viết sau ngày cố định. Có thể sử dụng strtotime()-compatible string, hoặc sử dụng array gồm 'year', 'month', 'day'
        'before'    => array(               //(string/array) - Lấy bài viết trước ngày cố định. Có thể sử dụng strtotime()-compatible string, hoặc sử dụng array gồm 'year', 'month', 'day'
          'year'  => 2013,                  
          'month' => 2,                     
          'day'   => 28,                    
        ),
        'inclusive' => true,                //(boolean) - Nếu sử dụng before và after, sử dụng 'true' nếu muốn bao gồm cả hai tham số.
        'compare' =>  '=',                  //(string) - So sánh giá trị với '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS' (only in WP >= 3.5), and 'NOT EXISTS' (also only in WP >= 3.5). Default value is '='
        'column' => 'post_date',            //(string) - Cột dữ liệu mà cần gửi query đến, mặc định là 'post_date'
        'relation' => 'AND',                //(string) - OR hoặc AND, sử dụng khi có nhiều array trong date_query để tạo mối quan hệ
      ),
    ),

//////Custom Field Parameters - Lấy bài viết dựa theo custom field
    //http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters
    'meta_key' => 'key',                    //(string) - Lấy bài dựa theo meta key của custom field
    'meta_value' => 'value',                //(string) - Lấy bài dựa theo giá trị của custom field
    'meta_value_num' => 10,                 //(number) - Giá trị của custom field dạng số tự nhiên
    'meta_compare' => '=',                  //(string) - Toán tử để so sánh với 'meta_value'. Có thể sử dụng '!=', '>', '>=', '<', or ='. Mặc định là '='.
    'meta_query' => array(                  //(array)  - Sử dụng nhiều điều kiện lấy bài viết theo custom field 
       'relation' => 'AND',                 //(string) - Mối quan hệ của các array query bên trong, sử dụng 'OR' hoặc 'AND'
       array(
         'key' => 'color',                  //(string) - Tên meta key
         'value' => 'blue'                  //(string/array) - Giá trị meta value
         'type' => 'CHAR',                  //(string) - Loại giá trị. Có thể sử dụng 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'. Mặc định là 'CHAR'. Tham số 'type' DATE chỉ có thể hoạt động với tham số 'compare' nếu định dạng ngày tháng được sử dụng là YYYYMMDD.
                                            
         'compare' => '='                   //(string) - Toán tử so sánh với giá trị value trong mảng này. Có thể sử dụng '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS' (only in WP >= 3.5), and 'NOT EXISTS' (also only in WP >= 3.5). Default value is '='.
       ),
       array(
         'key' => 'price',
         'value' => array( 1,200 ),
         'compare' => 'NOT LIKE'
       )
    ), 

//////Caching Parameters
    //http://codex.wordpress.org/Class_Reference/WP_Query#Caching_Parameters
    //NOTE Caching is a good thing. Setting these to false is generally not advised.
    'cache_results' => true,                //(bool) Mặc định là true - Lưu cache của thông tin kết quả query
    'update_post_term_cache' => true,       //(bool) Default is true - Post meta information cache.
    'update_post_meta_cache' => true,       //(bool) Default is true - Post term information cache.
    
    'no_found_rows' => false,               //(bool) Xem thêm: http://flavio.tordini.org/speed-up-wordpress-get_posts-and-query_posts-functions
    

//////Search Parameter - Lấy bài viết dựa theo truy vấn tìm kiếm
    //http://codex.wordpress.org/Class_Reference/WP_Query#Search_Parameter
    's' => $s,                              //(string) - Từ khoá tìm kiếm bài viết. $s chính là biến lưu từ khoá truy vấn tìm kiếm khi tìm thông qua form tìm kiếm.
    'exact' => true,                        //(bool) - Tìm nội dung khớp chính xác với từ khoá tìm kiếm
    'sentence' => true,                     //(bool) - Sử dụng tìm kiếm trong cụm từ
         


);

$the_query = new WP_Query( $args );

// The Loop
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
  // Do Stuff
endwhile;
endif;

// Reset Post Data
wp_reset_postdata();

?>

 

Tìm hiểu đối tượng WP_Query trong lập trình WORDPRESS
5 (100%) 3 votes
Hai thẻ thay đổi nội dung bên dưới.
Chia sẻ kiến thức, kinh nghiệm liên quan đến lập trình và thiết kế website là niềm vui của mình. Nếu có câu hỏi hay thắc mắc làm thế nào để làm website bán hàng, giới thiệu công ty thì liên hệ mình nhé. SĐT 01632 434 165, Mình sẽ hỗ trợ hết sức có thể. Thân Ái và Quyết Thắng

Ý kiến của bạn

Fanpage Facebook
Danh mục
Lưu trữ
Bài giảng mới

Call Now