Lỗi phân trang post custom post types wp_pagenavi năm 2024

Please note that the information in this post may no longer be accurate or up to date. I recommend checking more recent posts or official documentation for the most current information on this topic. This post has not been updated and is being kept for archival purposes.

I like to create custom post types to better organize my website’s content. There are many great plugins to help you create custom post types without code. A few times I have run into 404 errors when creating custom archive templates for my custom post types with pagination set up. Here’s a few checks I do that typically solves my issue after receiving a 404 error:

1. If you are only testing pagination out and are using the ‘posts_per_page’ argument to limit the number of results this will conflict with WordPress’ default settings of 10 posts per page. If you are testing pagination go to Settings > Reading in the admin dashboard and change “Blog pages show at most” to 1.

Lỗi phân trang post custom post types wp_pagenavi năm 2024

2. Are you using query_posts properly? Take at this article by scribu (author of wp-pagenavi) about how to properly use query_posts properly. In summary, the code looks like this:

query_posts( array( 'cat' => 8, 'paged' => get_query_var('paged') ) );

3. Double-check your code or plugin settings that you have indeed enabled archives with the has_archive parameter when you registered your post type.

Lỗi phân trang post custom post types wp_pagenavi năm 2024

4. If you have a page or post with the same slug as your custom post type name this can often cause issues. Check to see if this is the case and see if renaming that page or post’s slug fixes the 404 errors.

Problem still not solved? Take a look at How to Resolve WordPress Custom Post Type 404 Error Issues which is an article I wrote awhile back with some more tips.

Hopefully this provides you with a resolution! WordPress is great; it can be a little finicky but we still love it!

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. Và cần show liên kết phân trang như ở trên.

echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => min($paged,1), 'total' =>$wp_query->max_num_pages, 'prev_text'=>'<<', 'next_text'=>'>>', //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 ) ); WordPress có biến global của WP_Query là

//sử dụng WP_Query $posts_per_page=get_option("posts_per_page"); //posts per page $big = 999999999; $data=new WP_Query( array(

            ....  
'numberposts'=>-1,  
'posts_per_page'=>$posts_per_page,      
'paged'=>$paged  
            ....  
) ); while($data->have_posts()): $data->the_post(); ... endwhile; 5, dùng biến này để biết tổng số trang được tìm thấy. Viết lại cấu trúc đường dẫn phân trang vào thuộc tính ‘base’ và ‘format’. Bạn có thể sử dụng định dạng này.

echo paginate_links( array(

 'base' => get_pagenum_link(1) . '%_%',    
 'format' => 'page/%#%/',  
...  
)); Nếu bạn muốn tạo danh sách authors có phân trang, thì với hàm

//sử dụng WP_Query $posts_per_page=get_option("posts_per_page"); //posts per page $big = 999999999; $data=new WP_Query( array(

            ....  
'numberposts'=>-1,  
'posts_per_page'=>$posts_per_page,      
'paged'=>$paged  
            ....  
) ); while($data->have_posts()): $data->the_post(); ... endwhile; 6 cũng có thể giúp bạn làm được điều đó nhưng sử dụng tham số ‘

//sử dụng WP_Query $posts_per_page=get_option("posts_per_page"); //posts per page $big = 999999999; $data=new WP_Query( array(

            ....  
'numberposts'=>-1,  
'posts_per_page'=>$posts_per_page,      
'paged'=>$paged  
            ....  
) ); while($data->have_posts()): $data->the_post(); ... endwhile; 7‘ thay vì ‘

//sử dụng WP_Query $posts_per_page=get_option("posts_per_page"); //posts per page $big = 999999999; $data=new WP_Query( array(

            ....  
'numberposts'=>-1,  
'posts_per_page'=>$posts_per_page,      
'paged'=>$paged  
            ....  
) ); while($data->have_posts()): $data->the_post(); ... endwhile; 8‘. Ngoài class WP_Query đây là một giải pháp được tích hợp sẵn, xem thêm tại đây.

Phân trang với $wpdb

Nếu website wordpress của bạn tạo thêm bảng và muốn phân trang cho dữ liệu được liệt kê trong bảng thì làm thế nào? Bạn chỉ băn khoăn tìm công thức tính tổng số trang bạn muốn hiện thị phù hợp với kết quả trích xuất từ bảng đó.

Thật đơn giản sử dụng công thức sau:

//$total: tổng số bài viết (dòng) được tìm thấy //$posts_per_page: số bài viết (dòng) /1 page ceil($total / $posts_per_page); Tham khảo ví dụ sau đây:

$data=$wpdb->get_results("select * from wp_mytable"); $page = isset( $_GET['cpage'] ) ? abs( (int) $_GET['cpage'] ) : 1; $posts_per_page=3; //posts per page $total=count($data); //total 100 rows echo paginate_links( array(

'base' => add_query_arg( 'cpage', '%#%' ),  
'format' => '',  
'current' => $page,  
'total' =>ceil($total / $posts_per_page),  
'prev_text'=>__('<<'),  
'next_text'=>__('>>')  
) ); Đôi khi class WP_Query không thực hiện được câu lệnh SQL phức tạp, bạn phải viết chuỗi SQL trực tiếp vào

//sử dụng WP_Query $posts_per_page=get_option("posts_per_page"); //posts per page $big = 999999999; $data=new WP_Query( array(

            ....  
'numberposts'=>-1,  
'posts_per_page'=>$posts_per_page,      
'paged'=>$paged  
            ....  
) ); while($data->have_posts()): $data->the_post(); ... endwhile; 9. Chúng ta sẽ sử dụng biến

$big = 999999999; echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => min($paged,1), 'total' =>$data->max_num_pages, 'prev_text'=>'<<', 'next_text'=>'>>', //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 ) ); 0 để lấy tổng số records được tìm thấy, kết hợp với lệnh LIMIT giới hạn kết quả records thỏa mãn chuỗi lệnh SELECT. Chép đoạn code sau trong functions.php

$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'); } 0

Bạn nên kế thừa tham số phân trang ‘paged’ hoặc có thể lưu vào tham số khác. Nhưng việc sử dụng tham số ‘paged’ liên quan đến các hàm sử lý phân trang trong wordpress là điều tốt nhất. Truyền tổng số page

$big = 999999999; echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => min($paged,1), 'total' =>$data->max_num_pages, 'prev_text'=>'<<', 'next_text'=>'>>', //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 ) ); 1 vào hàm hiển thị liên kết trang

$big = 999999999; echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => min($paged,1), 'total' =>$data->max_num_pages, 'prev_text'=>'<<', 'next_text'=>'>>', //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 ) ); 2 và

$big = 999999999; echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => min($paged,1), 'total' =>$data->max_num_pages, 'prev_text'=>'<<', 'next_text'=>'>>', //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 ) ); 3.

$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'); } 1

Kết quả giống như thế này:

Lỗi phân trang post custom post types wp_pagenavi năm 2024

Bạn có thể liệt kê chỉ số trang bởi hàm

$big = 999999999; echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => min($paged,1), 'total' =>$data->max_num_pages, 'prev_text'=>'<<', 'next_text'=>'>>', //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 ) ); 4.

$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'); } 2

Kết quả:

Lỗi phân trang post custom post types wp_pagenavi năm 2024

Phân trang trong trang tìm kiếm

Tạo phân trang trong trang tìm kiếm cũng giống như trên, có điều chú ý tới thuộc tính action của form.

$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'); } 3

Thêm ký tự slash “/” sau url bởi hàm

$big = 999999999; echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => min($paged,1), 'total' =>$data->max_num_pages, 'prev_text'=>'<<', 'next_text'=>'>>', //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 ) ); 5 thì paginate_links mới hoạt động.

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

$big = 999999999; echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => min($paged,1), 'total' =>$data->max_num_pages, 'prev_text'=>'<<', 'next_text'=>'>>', //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 ) ); 6,

$big = 999999999; echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => min($paged,1), 'total' =>$data->max_num_pages, 'prev_text'=>'<<', 'next_text'=>'>>', //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 ) ); 7 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.

Phân trang sử dụng Plugin

Cách đơn giản nhất và an toàn đối với những người không sành về code , là sử dụng plugin để làm việc phân trang này. Bạn có thể tải plugin “WP-PageNavi“. Sau khi tải về giải nén vào thư mục plugins, rồi kích hoạt. Sau khi kích hoạt xong bạn cấu hình plugin để thay đổi một số hiển thị. Vào settings->PageNavi đừng quên nhấn Save Changes để lưu lại thay đổi.

*Cách Sử dụng: Trong theme Twentyten bạn thấy có dòng phân trang:

$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'); } 4

$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'); } 5

2 dòng trên có tác dụng next/prev bài viết. Với plugin WP-Pagenavi này giờ đây bạn chỉ thay bởi 1 dòng đơn giản sau:

$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'); } 6

Tạo phân trang với custom queries. Cách 1:

$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'); } 7

Cách 2: sử dụng WP_Query, quản lý sẽ tốt hơn. Với cách này bạn cần khai báo đối tượng độc lập WP_Query vào hàm

$big = 999999999; echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => min($paged,1), 'total' =>$data->max_num_pages, 'prev_text'=>'<<', 'next_text'=>'>>', //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 ) ); 8

$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'); } 8

Xem chi tiết cách dùng: tại đây.

Tùy biến hiển thị nút phân trang

Lỗi phân trang post custom post types wp_pagenavi năm 2024
Bạn có thể sử dụng hook để sửa lại mọi nội dung pagination tạo bởi

$big = 999999999; echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => min($paged,1), 'total' =>$data->max_num_pages, 'prev_text'=>'<<', 'next_text'=>'>>', //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 ) ); 9. Ví dụ thêm đoạn code sau vào functions.php

$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'); } 9

Lưu ý: sử dụng str_replace thay tên class của thẻ liên kết, và thêm thẻ HTML nếu muốn, nhưng tránh dùng từ “page” vì nó sẽ thay thế URL /page/ làm hỏng liên kết sang trang tới và lui.

Một số lỗi

Lỗi 404

Khi nhảy đến trang 2 có báo lỗi 404 không tìm thấy, nếu gặp lỗi này bạn nên kiểm tra lại hook pre_get_posts.

*Chỉnh lại prep_get_posts:

//sử dụng WP_Query $posts_per_page=get_option("posts_per_page"); //posts per page $big = 999999999; $data=new WP_Query( array(

            ....  
'numberposts'=>-1,  
'posts_per_page'=>$posts_per_page,      
'paged'=>$paged  
            ....  
) ); while($data->have_posts()): $data->the_post(); ... endwhile; 0

– Ví dụ vì nguyên nhân nào đó không xác định

$wp_query->found_posts; 0 thì bạn thiết lập lại

$wp_query->found_posts;

  1. * Có thể thay thế page vs paged:

//sử dụng WP_Query $posts_per_page=get_option("posts_per_page"); //posts per page $big = 999999999; $data=new WP_Query( array(

            ....  
'numberposts'=>-1,  
'posts_per_page'=>$posts_per_page,      
'paged'=>$paged  
            ....  
) ); while($data->have_posts()): $data->the_post(); ... endwhile; 1

Hoặc thêm dòng sau:

//sử dụng WP_Query $posts_per_page=get_option("posts_per_page"); //posts per page $big = 999999999; $data=new WP_Query( array(

            ....  
'numberposts'=>-1,  
'posts_per_page'=>$posts_per_page,      
'paged'=>$paged  
            ....  
) ); while($data->have_posts()): $data->the_post(); ... endwhile; 2

Tác giả: HOANGWEB.COM

Để nhận đượ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ó thể nhận được sự trợ giúp trên Twitter và Facebook