Home WordpressWordPress cơ bản Cách lấy dữ liệu bài viết trong wordpress

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

by admincp

Worpress cung cấp một số hàm tiện ích hay dùng để 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');

3 hàm phổ biến để 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_postsWP_Query: hay dùng để lấy các posts với điều kiện như lấy tất cả 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à tình trạng 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 khi có thể sử dụng template tag bạn sẽ phải cấu hình global post bởi hàm setup_postdata. Chú ý rằng không được thay tên biến $post bằng tên khác, template tag sẽ không hoạt động đúng.
Điều này 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 gọi 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à:

<?php while ( have_posts() ) : the_post(); ?>
	<?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; // end of the loop. ?>

Nếu bạn muốn sử dụng hàm get_posts & WP_Query để lấy dữ liệu trước khi sử dụng dữ liệu chính trong template, nghĩa 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 khi 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 hiện tại bằng cách gọi hàm wp_reset_postdata(). Ví dụ:

<?php
// example args
$args = array( 'posts_per_page' => 3 );

// the query
$the_query = new WP_Query( $args );
?>

<?php if ( $the_query->have_posts() ) : ?>

	<!-- start of the loop -->
	<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
		<?php the_title(); ?>
		<?php the_excerpt(); ?>
	<?php endwhile; ?><!-- end of the loop -->

	<!-- put pagination functions here -->
	<?php wp_reset_postdata(); ?>
<?php else:  ?>
<p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>
	
	<!-- main query loop -->
	<?php while ( have_posts() ) : the_post(); ?>
		<?php get_template_part( 'content', get_post_format() ); ?>
	<?php endwhile; // end of the loop. ?>
	
<?php endif; ?>

Đ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ác 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 khi lấy dữ liệu chính trong template. VD: sửa lại option ‘posts_per_page’

<?php 
global $query_string;
query_posts($query_string.'&posts_per_page=10');
while(have_posts()):the_post();
	...
endwhile;
?>

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:

<?php 
global $wp_query;
$args=array(
	'posts_per_page'=>10
);
query_posts(array_merge($wp_query->query_vas,$args));
while(have_posts()):the_post();
	...
endwhile;
?>

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 bao gồm phân trang, showposts: lượng posts cần lấy không bao gồm 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 chiều thuận hoặc ngược hay tăng hoặc giảm 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 thị 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 cần phải chỉ định tham số này. Ở ví 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 mỗi post the_post hàm lấy post ID the_ID() hay get_the_ID(). Ngoài cách này, bạn có thể sử dụng biến $query->post->ID mà không cần 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 ngẫu nhiên:
Xắp xếp ngẫu nhiên 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' => 'id',
			'terms' => array( 103, 115, 206 ),
			'operator' => 'NOT IN'
		)
	),
	
);

Và so sánh taxonomy thuộc một trong số giá trị chính 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 sử dụng thuộc tính compare. Chú ý: nếu điều kiện meta không tồn tại (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 so sánh một field nhưng đồng thời dòng dữ liệu đó có các 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ể kết hợp thuộc tính meta_key và meta_query.

<?php
$today = date('Ymd');
$args = array(
    'post_type' => '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 so sánh 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 thuộc tính meta_key giống như trên. Bạn có thể sử dụng các thuộc tính 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 số 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ó thuộc tính field ‘_thumbnail_id’.

$args=array(
	'meta_key' => '_thumbnail_id',
);

Phủ định Navigate

Lấy toàn bộ nhưng Loại trừ các posts này. Truyền mảng IDs của posts muốn loại bỏ trong kết quả.

$args=array(
	'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ể làm được mọi thứ rồi, thế nhưng nếu bạn chưa thấy đáp ứng đủ 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ể kết 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_id=$author )";
		}
	}
	return $where;
}

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ó thể cho phép hàm lọc dữ liệu bỏ qua filter posts_where bằng cách khai báo thêm vào tham số với thuộc tính suppress_filters=>false:

<?php
//some function that modifies the query
function useless_condition ( $where ) { return $where . ' AND 1=1 '; }

//attach your function to the posts_where filter
add_filter( 'posts_where' , 'useless_condition' );

//get posts AND make sure filters are NOT suppressed
$posts = get_posts( array( 'suppress_filters' => FALSE ) );
?>

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ó 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 khô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
      //...
}	

Nếu bạn thích bài viết này, hãy ủng hộ chúng tôi bằng cách đăng ký nhận bài viết mới ở bên dưới và đừng quên chia sẻ kiến thức này với bạn bè của bạn nhé. Bạn cũng có thể theo dõi blog này trên TwitterFacebook

Liên hệ

Công ty chuyên Thiết kế website uy tín nhất Miền Bắc: http://vinastar.net

Hotline tư vấn: 0989 48 3456

Nguồn: Sưu tầm trên internet

You may also like

Leave a Comment