Cách lấy dữ liệu bài viết trong wordpress

Quảng cáo
Ads_ngang
Website dinhthuanit.com có bài Cách lấy dữ liệu bài viết trong wordpress

Worpress cung cấp một số hàm tiện ích hay dùng làm lấy dữ liệu bài viết.

lấy dữ liệu posts wordpress

Lấy post bởi ID, sử dụng get_post .

 Print_r(get_post(3)); //trả về đối tượng get_post($post_id,'OBJECT'); //trả về kiểu mảng: Returns an associative array of field names to values get_post($post_id,'ARRAY_A'); //returns a numeric array of field values get_post($post_id,'ARRAY_N');  

Get posts match your criteria

3 hàm thông dụng để lấy posts là: get_posts(), new WP_Query(), query_posts()
Trong đó :

  • query_posts : thường lấy các posts chính ở template (main query).
  • get_posts WP_Query : hay dùng làm lấy các posts với điều kiện như lấy mọi thứ các posts trong 1 category…

3 tiện ích này đều sử dụng tham số là kiểu string hoặc array.

 $args=array( 'name'=> 'sample-post-slug', 'post_status' =>  'publish' ); $data=get_posts($args);  

Ví dụ trên, mình lấy 1 post có slug=’sample-post-slug’ và trạng thái của post là publish. Truyền tham số mảng vào get_posts . Dùng lệnh lặp để lấy post.

 foreach($data as $post){ setup_postdata($post); //show post data the_title(); the_content(); ... }  

Lưu ý: với trường hợp lấy posts độc lập sử dụng get_posts, nếu muốn sử dụng template tag như trên vd: the_title, the_content chúng ta cần lấy mỗi dữ liệu post vào biến $post trong mảng lặp kết quả trả về của hàm get_posts. Và trước lúc cũng có thể có thể sử dụng template tag bạn bắt buộc phải cấu hình global post bởi hàm setup_postdata . Chú ý rằng không được đổi tên biến $post bằng tên khác, template tag sẽ không hoạt động đúng.
Điều này sẽ không áp dụng cho WP_Query (chưa test).

Sử dụng main query loop và secondary query loops.

Khi bạn lấy dữ liệu bởi hàm get_posts hoặc WP_Query xem là lấy dữ liệu thứ 2 sau dữ liệu của page chính. VÍ dụ dữ liệu loop trong template single.php, page.php hay category.php chính là main query loop. Chúng ta vẫn thường sử dụng vòng lặp lấy dữ liệu của trang post chi tiết là:

           

Nếu bạn mong muốn sử dụng hàm get_posts & WP_Query để lấy dữ liệu trước lúc sử dụng dữ liệu chính trong template, tức là đặt lệnh lặp lấy dữ liệu với các hàm này trước vòng lặp while ở trên, thì trước lúc bắt đầu thực hiện lấy dữ liệu chính bạn cần khôi phục lại dữ liệu của template ngày nay bằng phương pháp gọi hàm wp_reset_postdata() . Ví dụ:

    3 ); // the query $the_query = new WP_Query( $args ); ?>    have_posts() ) : ?>    have_posts() ) : $the_query-> the_post(); ?>                  

Điểm khác biệt giữa main query loop và secondary query loops là:

  • main query loop dựa vào URL, ví URL template single và category sẽ cho ra dữ liệu không giống nhau và đã được sử lý trước khi nạp template.
  • secondary loops là query độc lập sử dụng WP_Query.

Khác với get_posts & WP_Query, hàm query_posts có tác dụng sửa lại tham số trước lúc lấy dữ liệu chính trong template. VD: sửa lại option ‘posts_per_page’

     

WordPress lưu chuỗi tham số vào biến global $query_string Cách khác lấy tham số query từ biến $wp_query :

   10 ); query_posts(array_merge($wp_query-> query_vas,$args)); while(have_posts()):the_post(); ... endwhile; ?>   

Query Data

Pagination

 $args=array( 'numberposts' =>  4, //số lượng cần lấy -1 for all 'showposts'=> 6, //số lượng cần lấy cách 2 'posts_per_page' =>  1, //số lượng post trên trang (phân trang) );  

Chú ý: numberposts là lượng posts cần lấy ra bao kể cả phân trang, showposts: lượng posts cần lấy chưa cho dù là phân trang.

Sort

xắp xếp theo Anphabe

  • – theo tiêu đề title
  • – tên tác giả của bài viết ( author )
  • – theo post slug name

Ví dụ xắp theeo tiêu đề bài viết từ [a-z]

 $args=array( 'post_type'=> 'post', 'orderby' =>  'title', 'sort_order'=> 'asc' ); //xếp chiều ngược [z-a] $args=array( 'orderby' =>  'title', 'order'=> 'desc' );  

Xắp xếp theo phía thuận hoặc ngược hay tăng hoặc giảm cũng có thể có thể sử dụng sort_order hoặc order , đều có vai trò như nhau.

xắp xếp theo ngày tháng

  • – thời gian đăng bài (post/page) date
  • – thời gian sửa bài modified

Ví dụ sau đây xắp xếp những posts theo thứ tự ngày tháng, tức những posts viết sau sẽ hiển thị ở phía sau.

 global $query_string; query_posts($query_string."&orderby=date&order=asc"); //loop while(have_posts()): the_post(); endwhile;  

Thông thường wordpress sẽ xắp xếp ngược lại, các bài viết mới đươc hiện trên đầu. Chúng ta có:

 $args=array( 'orderby' =>  'date', 'order'=> 'desc' ); global $wp_query; $args=array_merge($wp_query-> query_vars,$args); $query=new WP_Query($args); while($query-> have_posts()): $query-> post-> ID; //trả về ID của post endwhile;  

Tham số này mặc định đã có, do vậy khi bạn thiết kế wordpress template không luôn phải chỉ định tham số này. Ở thí dụ trên, chúng ta sử dụng class WP_Query để lấy dữ liệu posts, bạn đã quá quen thuộc với hàm khởi tạo dữ liệu cho từng post the_post hàm lấy post ID the_ID() hay get_the_ID() . Ngoài cách này, bạn cũng đều có thể sử dụng biến $query-> post-> ID mà chẳng càng phải gọi trước the_post() .

Xắp xếp theo số

  • – theo post/page id ID
  • – xắp theo số lượng comments ( comment_count )
  • – xắp xếp theo post/page parent id.

VD: Xắp xếp các posts/page/custom post type có số lượng comments giảm dần.

 $args=array( 'orderby'=> 'comment_count', 'order'=> 'desc' );  

Xắp theo custom field :
Custom field là field được thêm bởi người dùng ngoài các fields mà kiểu dữ liệu cung cấp vd: kiểu dữ liệu post có một số trường như: title, content, excerpt,….Xem cách tạo custom field tại đây. Chỉ định tên field bởi tham số meta_key , giá trị field được xắp xếp theo anphabe hoặc number. Ví dụ sau xắp xếp custom field theo alphabe.

 $args=array( 'meta_key'=> 'field1', 'orderby'=> 'meta_value', 'order'=> 'asc' );  

Nếu giá trị của custom field là số, thay vì sử dụng meta_value bạn sử dụng meta_value_num để nói với wordpress xắp xếp field này theo numeric. Ví dụ sau đây xắp xếp các posts có custom field “field1” có giá trị giảm dần.

 $args=array( 'post_type'=> 'post', 'meta_key'=> 'field1', 'orderby'=> 'meta_value_num', 'order'=> 'desc' );  

Xắp xếp tình cờ :
Xắp xếp tình cờ các post/page/custom post type. Sử dụng "orderby"=> "rand"

 array( 'orderby'=> 'rand' );  

Custom post type

Lấy dữ liệu của custom post type. Chỉ định tên custom post type vào tham số post_type .

 $args=array( 'post_type' =>  'custom-post-name', );  

Lọc bài viết bởi taxonomy. So sánh 1 hoặc nhiều taxonomy với quan hệ ‘AND’,’OR’

 $args=array( 'tax_query' =>  array( 'relation' =>  'AND', array ( 'taxonomy' =>  'business-type', 'field' =>  'slug', 'terms' =>  array('term1','term2') 'operator'=> 'IN' ), array( 'taxonomy' =>  'actor', 'field' =>  'terms' =>  array( 103, 115, 206 ), 'operator' =>  'NOT IN' ) ), );  

Và đối chiếu taxonomy thuộc một trong những giá trị chuẩn xác với toán hạng operator .vd: IN, NOT IN
Chú ý: vẫn kiểu so sánh này nhưng lọc custom fields với ‘meta_query’ sẽ dùng tên tham số khác là ‘compare’.

Lọc bài viết với custom post fields. Cách đơn giản là so sánh giá trị một field.

 $args=array( 'meta_key'=> 'field-name', 'meta_value'=> 'field-value' );  

Nếu không biết giá trị của field, thì không cung cấp. Kết quả sẽ liệt kê tất cả các posts có trường field đó.

 $args=array( 'meta_key'=> 'field-name', );  

SO sánh nhiều fields thì chúng ta sử dụng tham số meta_query .

 $args=array( 'meta_query'=> array( 'relation'=> 'AND', array( 'key' =>  'color', 'value' =>  'blue', 'compare' =>  'NOT LIKE' ), array( 'key' =>  'price', 'value' =>  array( 20, 100 ), 'type' =>  'numeric', 'compare' =>  'BETWEEN' ), array( 'key' =>  'places_lat', 'value' =>  array($lat_min, $lat_max), 'compare' =>  'BETWEEN', //'type' =>  'DECIMAL', ), array( 'key' =>  'colors', 'compare' =>  'NOT EXISTS' // doesn't work ), array( 'key' =>  'colors', 'value' =>  'blue' ), ), );  

Bạn cũng có thể xắp xếp dữ liệu với ‘meta_query’ bằng cách dùng tính chất compare . Chú ý: nếu điều kiện meta không hiện hữu (compare=’NOT EXISTS’) thì giá trị của nó là vô nghĩa không cần đến, xem thêm: http://codex.wordpress.org/Class_Reference/WP_Meta_Query. Bạn muốn đối chiếu một field nhưng cùng lúc dòng dữ liệu đó có những fields khác, Ví dụ tôi muốn trả về các bài viết có ngày đăng từ ngày xx trở đi bởi giá trị field “the_date”, Đoạn code sau đây chúng ta có thể phối hợp tính chất meta_key và meta_query.

    'post', 'posts_per_page' =>  '4', 'meta_key' =>  'the_date', 'meta_query' =>  array( array( 'key' =>  'skyali_feature' ), array( 'key' =>  'the_date', 'value' =>  $today, 'compare' =>  '> =' ) ), 'orderby' =>  'meta_value_num', 'order' =>  'ASC' ); $your_custom_query = new WP_Query($args); ?>   

trường so sánh là the_date và kiểu đối chiếu lớn hơn hoặc bằng (> =). Để xắp xếp dạng ASC của trong kết quả trả về của field “the_date”, chúng ta cần khai báo thêm trường vào tính chất meta_key giống như trên. Bạn cũng có thể có thể sử dụng các tính chất khác để lọc posts theo ý muốn vd: post_type,..

Lọc bởi tag và category

Lọc posts với Tag.

 $args=array( 'tag__in'=> array(1,35,5), //thuộc 1 trong các tag 'tag_slug__in' =>  array('forrest-gump', 'forest-gump', 'questend') //search tags 'tag'=> 'tag1,tag2' //search tag );  

Lọc posts với category.

 $args=array( 'category' =>  3, //category id =3 'category_name'=> 'category1', //category slug );  

Get only post with thumbnail support

Lưu ý: Các posts có featured image hay thumbnail có tính chất field ‘_thumbnail_id’.

 $args=array( 'meta_key' =>  '_thumbnail_post__not_in' =>  array($post-> ID), );  

Sửa đổi câu lệnh where sql

Tham số của các hàm lấy dữ liệu như get_posts, WP_Query, query_posts cung cấp tính năng lọc dữ liệu khá đầy đủ, có thể kết thúc được tất cả rồi, thế nhưng nếu bạn chưa nhìn thấy đảm bảo đủ hoặc đang có ý tưởng can thiệp mệnh đề chuỗi where để can thiệp sâu hơn vào lênh sql và thậm trí bạn có thể phối hợp với dữ liệu của table khác. Lúc này bạn cần đến hook posts_where .
Ví dụ sau đây, tôi giới hạn bài viết theo author, kết quả chỉ trả về những bài viết của một author. Chúng ta truyền tham số URL restrict_manage_posts để lọc author.

 add_filter( 'posts_where' , 'posts_where' ); function posts_where( $where ) { if( is_admin() ) { global $wpdb; if ( isset( $_GET['author_restrict_posts'] ) && !empty( $_GET['author_restrict_posts'] ) && intval( $_GET['author_restrict_posts'] ) != 0 ) { $author = intval( $_GET['author_restrict_posts'] ); $where .= " AND ID IN (SELECT object_id FROM {$wpdb-> term_relationships} WHERE term_taxonomy_>   

Viết tiếp mệnh đề where trong câu lệnh sql vào biến $where , mọi hàm lấy dữ liệu trong wordpress đều sử dụng chung filter này. Và mọi hàm lấy dữ liệu sẽ bị sửa đổi tùy thuộc bởi hàm liên kết với filter posts_where.
Những bạn cũng cũng có thể có thể cấp phép hàm lọc dữ liệu bỏ lỡ filter posts_where bằng cách khai báo thêm vô tham số với thuộc tính suppress_filters=> false :

    FALSE ) ); ?>   

Lấy kết quả bài viết (Loop each post)

Sử dụng get_posts()

 $data=get_posts(..) foreach($data as $post){ setup_postdata($post); //cấu hình post, bắt buộc lấy post vào biến $post mới cũng đều có thể sử dụng the_title, the_permalink.. //show post data $post-> ID; //post id .. //template tags the_title(); the_post(); ... }  

Sử dụng WP_Query()

 $query = new WP_Query( $args ); //wp object while($query-> have_posts()){ $query-> the_post();//cấu hình post //sử dụng các hàm trong loop thông thường .... $query-> next_post(); //chuyển post tiếp-> trong các phiên bản gần đây chẳng cần gọi hàm này. }  

Sử dụng query_posts

 query_posts($args); while(have_posts()){ the_post(); //cấu hình post //... }  

Để thu được bài viết mới vui lòng đăng ký kênh kiến thức WordPress từ A-Z ở Form bên dưới. Bạn cũng cũng đều có thể thu được sự trợ giúp trên Twitter và Facebook

Bài viết Cách lấy dữ liệu bài viết trong wordpress được tổng hợp và biên tập bởi: dinhthuanit.com. Mọi ý kiến đóng góp và phản hồi vui lòng gửi Liên Hệ cho dinhthuanit.com để điều chỉnh. dinhthuanit.com xin cảm ơn.

Bài Viết Liên Quan


Bài Viết Khác


Quảng cáo
Ads_ngang