Trong bài này mình sẽ giới thiệu tới mọi người 1 cách để phân trang bằng ajax khi lấy dữ liệu như bài post hoặc page.
Sau khi hoàn thiện bài hướng dẫn này chúng ta có được shortcode dạng [ajax_pagination] Trong shortcode này chúng ta có các thông số như sau.
[ajax_pagination post_type=”post” posts_per_page=”5″ paged=”1″]
post_type: slug của post, page hoặc custom post type.
posts_per_page: Số lượng bài hiển thị trên một trang
paged: bắt đầu từ page số mấy. cái này không cần cũng được
Folder AjaxPagination sẽ để ở ngay thư mục theme của bạn (wp-contents/themes/[your-theme]/AjaxPagination) và nhớ include vào file functions.php của theme chúng ta đang làm việc.
1 2 3 4 | /* * Thêm dòng này vào file functions.php của theme */ include 'AjaxPagination/ajax_pagination_wp.php' ; |
Và bây giờ chúng ta sẽ đi vào chi tiết từng file như sau:
Shortcode hiển thị dữ liệu
Tạo file ajax_pagination_wp.php trong folder AjaxPagination nói bên trên. Sau đó gán đoạn code bên dưới này vào
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | /******************* * Load Post via ajax with Pagination - Query post * Author: Le Van Toan - www.levantoan.com ********************/ /****************** * Thêm shortcode ajax_pagination ********************/ function ajax_pagination_svl( $atts ){ $atts = shortcode_atts( array ( 'posts_per_page' => 5, 'paged' => 1, 'post_type' => 'post' ), $atts , 'ajax_pagination' ); $posts_per_page = intval ( $atts [ 'posts_per_page' ]); $paged = intval ( $atts [ 'paged' ]); $post_type = sanitize_text_field( $atts [ 'post_type' ]); $allpost = '<div id="result_ajaxp">' ; $allpost .= query_ajax_pagination( $post_type , $posts_per_page , $paged ); $allpost .= '</div>' ; return $allpost ; } add_shortcode( 'ajax_pagination' , 'ajax_pagination_svl' ); function query_ajax_pagination( $post_type = 'post' , $posts_per_page = 5, $paged = 1){ $args_svl = array ( 'post_type' => $post_type , 'posts_per_page' => $posts_per_page , 'paged' => $paged , 'post_status' => 'publish' ); $q_svl = new WP_Query( $args_svl ); /*Tổng bài viết trong query trên*/ $total_records = $q_svl ->found_posts; /*Tổng số page*/ $total_pages = ceil ( $total_records / $posts_per_page ); if ( $q_svl ->have_posts()): $allpost = '<div class="ajax_pagination" posts_per_page="' . $posts_per_page . '" post_type="' . $post_type . '">' ; while ( $q_svl ->have_posts()): $q_svl ->the_post(); $allpost .= '<div class="ajaxp_list_post">' ; $allpost .= '<a href="' .get_permalink(). '" title="' .get_the_title(). '">' .get_the_title(). '</a> - <span>' .get_the_date(). '</span>' ; $allpost .= '</div>' ; endwhile ; $allpost .= '</div>' ; $allpost .= paginate_function( $posts_per_page , $paged , $total_records , $total_pages ); $allpost .= '<div class="loading_ajaxp"><div id="circularG"><div id="circularG_1" class="circularG"></div><div id="circularG_2" class="circularG"></div><div id="circularG_3" class="circularG"></div><div id="circularG_4" class="circularG"></div><div id="circularG_5" class="circularG"></div><div id="circularG_6" class="circularG"></div><div id="circularG_7" class="circularG"></div><div id="circularG_8" class="circularG"></div></div></div>' ; endif ;wp_reset_query(); return $allpost ; } |
Code phân trang PHP. Dạng 1,2,3…
Đoạn code này giúp chúng ta có phân trang dạng 1,2,3….Hãy copy và dán đoạn code này vào tiếp file ajax_pagination_wp.php bên trên nhé.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | /****************** Function phân trang PHP có dạng 1,2,3 ... ********************/ function paginate_function( $item_per_page , $current_page , $total_records , $total_pages ) { $pagination = '' ; if ( $total_pages > 0 && $total_pages != 1 && $current_page <= $total_pages ){ //verify total pages and current page number $pagination .= '<ul class="pagination">' ; $right_links = $current_page + 3; $previous = $current_page - 3; //previous link $next = $current_page + 1; //next link $first_link = true; //boolean var to decide our first link if ( $current_page > 1){ $previous_link = ( $previous ==0)?1: $previous ; $pagination .= '<li class="first"><a href="#" data-page="1" title="First">«</a></li>' ; //first link $pagination .= '<li><a href="#" data-page="' . $previous_link . '" title="Previous"><</a></li>' ; //previous link for ( $i = ( $current_page -2); $i < $current_page ; $i ++){ //Create left-hand side links if ( $i > 0){ $pagination .= '<li><a href="#" data-page="' . $i . '" title="Page' . $i . '">' . $i . '</a></li>' ; } } $first_link = false; //set first link to false } if ( $first_link ){ //if current active page is first link $pagination .= '<li class="first active">' . $current_page . '</li>' ; } elseif ( $current_page == $total_pages ){ //if it's the last active link $pagination .= '<li class="last active">' . $current_page . '</li>' ; } else { //regular current link $pagination .= '<li class="active">' . $current_page . '</li>' ; } for ( $i = $current_page +1; $i < $right_links ; $i ++){ //create right-hand side links if ( $i <= $total_pages ){ $pagination .= '<li><a href="#" data-page="' . $i . '" title="Page ' . $i . '">' . $i . '</a></li>' ; } } if ( $current_page < $total_pages ){ $next_link = ( $i > $total_pages )? $total_pages : $i ; $pagination .= '<li><a href="#" data-page="' . $next_link . '" title="Next">></a></li>' ; //next link $pagination .= '<li class="last"><a href="#" data-page="' . $total_pages . '" title="Last">»</a></li>' ; //last link } $pagination .= '</ul>' ; } return $pagination ; //return pagination links } |
Js và css trong hướng dẫn này
Dưới đây là đoạn js để gửi thông số và nhận kết quả mà ajax gửi ra để hiển thị.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | /******* Author LeVanToan - https://levantoan.com *********/ // JavaScript Document ( function ($) { $(document).ready( function (){ $( '#result_ajaxp' ).on( 'click' , ' ul.pagination a' , function ( e ) { /** Prevent Default Behaviour */ e.preventDefault(); /** Get data-page */ var data_page = $( this ).attr( 'data-page' ); var posts_per_page = $( '.ajax_pagination' ).attr( 'posts_per_page' ); var post_type = $( '.ajax_pagination' ).attr( 'post_type' ); /** Ajax Call */ $.ajax({ cache: false , timeout: 8000, url: svl_array_ajaxp.admin_ajax, type: "POST" , data: ({ action : 'LoadPostPagination' , data_page : data_page, posts_per_page : posts_per_page, post_type : post_type }), beforeSend: function () { $( '.loading_ajaxp' ).css( 'display' , 'block' ); }, success: function ( data, textStatus, jqXHR ){ $( '#result_ajaxp' ).html( data ); }, error: function ( jqXHR, textStatus, errorThrown ){ console.log( 'The following error occured: ' + textStatus, errorThrown ); }, complete: function ( jqXHR, textStatus ){ } }); }); }); })(jQuery); |
Còn css các bạn tham khảo thêm ở file đính kèm nha
Gọi và xử lý ajax trong WordPress
Hàm này giúp các bạn load dữ liệu bằng ajax.
1 2 3 4 5 6 7 8 9 10 11 | /** Xử lý Ajax trong WordPress */ add_action( 'wp_ajax_LoadPostPagination' , 'LoadPostPagination_init' ); add_action( 'wp_ajax_nopriv_LoadPostPagination' , 'LoadPostPagination_init' ); function LoadPostPagination_init() { $posts_per_page = intval ( $_POST [ 'posts_per_page' ]); $paged = intval ( $_POST [ 'data_page' ]); $post_type = sanitize_text_field( $_POST [ 'post_type' ]); $allpost = query_ajax_pagination( $post_type , $posts_per_page , $paged ); echo $allpost ; exit ; } |
Không có nhận xét nào:
Đăng nhận xét