TODO: To change the header's content go to Dr.Explain menu Options : Project Settings : HTML (CHM) Export : Setup HTML Template and Layout
×
Menu
Index

Phân trang

Phân trang trong wordpress là một tính năng giúp rút gọn thanh cuộn khi blog của bạn có từ 50-100 posts hoặc lên đến 1000 bài viết.
 
Lấy số posts theo phân trang:
* Liệt kê posts bắt đầu ở vị trí nào và xác định số lượng muốn lấy ra:
$data = get_posts('posts_per_page=5&offset=1&category=1');
Chỉ định số lượng cần lấy ra trên một trang bạn sử dụng tham số posts_per_page. Trong wordpress bạn thiết lập con số này ở phần Settings > Reading.
Để lấy giá trị này bạn có hàm:
$posts_per_page = get_option("posts_per_page");  //posts per page
 
Chú ý:
Nếu số lượng bài viết cần lấy trong một phân trang nằm ngoài option “Blog pages show at most” trong phần Settings -> reading hay chỉ định thuộc tính “posts_per_page”!= get_option(‘posts_per_page’) trong WP_Query, query_posts thì có hoạt động không?
Tất nhiên là hoạt động được, nhưng lưu ý giá trị posts_per_page >= (settings->reading->Blog pages show at most) không chênh nhau quá có thể chênh từ 1,2,3
Ví dụ: Giá tri trong settings->reading->Blog pages show at most đặt là 10 mà bạn muốn hiển thị 5 kết quả trong 1 phân trang thì phân trang sẽ không hoạt động.
 
Một số ví dụ:
- Truy xuất tất cả dữ liệu bài viết nhưng có phân trang:
$args = array( 'posts_per_page' => 3 );
$lastposts = get_posts( $args );
 
- Truy xuất toàn bộ dữ liệu không phân trang.
query_posts('posts_per_page' => -1);
 
- Tham số phân trang kết quả.
$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)
);
get_posts($args);
 
Chú ý: ở phiên bản Wordpress 2.1 posts_per_page có thể thay thế bằng showposts.
 
- Với các template như category, home thì sẽ không sử dụng WP_Query, để can thiệp phân trang thì bạn dùng query_posts. Ví dụ:
global $wp_query, $querystring;
query_posts($querystring. "&posts_per_page=10");
Có thể không cần chỉ định số trang vì mặc định có ‘posts_per_page’ trong main query.
 
* Lấy posts ở phân trang nào.
Xác định chỉ số page hiện tại.
$paged = 1; //hoặc 0
if(get_query_var('paged')) {
  $paged = get_query_var('paged');
} elseif(get_query_var('page')) {
  $paged = get_query_var('page');
}
 
Thêm tham số, 'paged' bạn muốn chỉ hiển thị ở phân trang đó. Xem ví dụ này:
$data=new WP_Query(
    array(
                ....
        'numberposts' => -1,
        'posts_per_page' => $posts_per_page,     
        'paged' => $paged
                ....
    )
);
while($data->have_posts()):
$data->the_post();
...
endwhile;
 
 
Hiển thị phân trang:
* Hiển thị nút phân trang cho dữ liệu posts trong wordpress:
- Wordpress cung cấp hàm 'paginate_links' , xác định số lượng trang tối đa từ kết quả nhận được sau khi lấy dữ liệu, những thông tin sau bạn cần biết.
$data->found_posts;
#for global $wp_query
$wp_query->found_posts;
 
//trả về số trang được tìm thấy so với tổng số kết quả và số posts trên 1 trang
$data->max_num_pages
 
Truyền thông tin này vào hàm paginate_links.
$big = 999999999;
$pagination = paginate_links( array(
    'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 
   
    'format' => '?paged=%#%',
    'current' => max($paged,1),
    'total' =>$data->max_num_pages,     //$wp_query->max_num_pages,
    'prev_text'=>'<<',
    'next_text'=>'>>',
   
) );
Giải thích:
Chú ý: Chúng ta có thể tùy biến đường dẫn phân trang, xem chi tiết ở phần URL Rewrite.
 
- Bạn có thể thêm tham số url khác vào mỗi địa chỉ các trang tiếp theo bởi tham số add_args.
$pagination = paginate_links( array(
    ...
    //thêm tham số vào liên kết phân trang.
    'add_args'=>array('abc'=>1)       //result: /page/2/?s=xx&abc=1
));
 
- Mặc định wordpress sử dụng thẻ <span, <a cho nút phân trang , bạn có thể  sửa cấu trúc HTML hiển thị cho phân trang với dạng list (ul,li).
#format ul>li
$pagination = str_replace('<span','<li><a',$pagination);
$pagination = str_replace('</span','</a></li',$pagination);
$pagination = str_replace('<a','<li><a',$pagination);
$pagination = str_replace('</a','</a><li',$pagination);
 
 
* Sử dụng plugin wp-pagenavi:
Cách đơn giản chúng ta sẽ sử dụng plugin wp-pagenavi để hiển thị nút phân trang.
Phân trang ở query chính trong template category/taxonomy, tag, archive. Chèn vào template bạn muốn hiển thị phân trang đoạn code dưới đây:
<?php wp_pagenavi(); ?>
 
Bạn cũng có thể hiển thị phân trang cho kết quả tùy biến dữ liệu Query. Ví dụ chúng ta muốn tạo phân trang hiển thị cho dữ liệu khác sử dụng WP_Query.
<?php
//custom query
$query = new WP_Query(...);
?>
<?php wp_pagenavi( array( 'query' => $query ) ); ?>
 
- Tùy biến hiển thị:
Sửa đầu ra HTML thay đổi cách nút phân trang hiển thị, bạn có thể sửa vào file pagenavi.css của plugin hoặc sử dụng hook sau:
//attach our function to the wp_pagenavi filter
add_filter( 'wp_pagenavi', 'ik_pagination', 10, 2 );
//customize the PageNavi HTML before it is output
function ik_pagination($html) {
     $out = '';
 
     //wrap a's and span's in li's
     $out = str_replace("<span","<a",$html);   
     $out = str_replace("</span>","</a>",$out);
   
     $out = str_replace('class="page','class="apage',$out);
     $out = str_replace('class="larger page','class="apage',$out);
     $out = str_replace("current","cpage",$out);
     $out = str_replace("nextpostslink","apage",$out);
     $out = str_replace("last","apage",$out);
   
     return '<span id="lblPage">'.$out.'</span>';
}
 
Nếu không muốn sử dụng css mặc định (pagenavi.css) bạn có thể tắt trong phần cài đặt của plugin.
Một ví dụ khác, mình muốn hiển thị dạng list cho phân trang sử dụng thẻ ul, li.
//attach our function to the wp_pagenavi filter
add_filter( 'wp_pagenavi', 'ik_pagination', 10, 2 );
 
//customize the PageNavi HTML before it is output
function ik_pagination($html) {
     $out = '';
 
     //wrap a's and span's in li's
     $out = str_replace("<a","<li><a",$html);   
     $out = str_replace("</a>","</a></li>",$out);
     $out = str_replace("<span","<li><span",$out);   
     $out = str_replace("</span>","</span></li>",$out);
 
     return '<div class="paging">
               <ul>'.$out.'</ul>
          </div>';
}
 
 
Made with help of Dr.Explain

Unregistered version