Người Viết : ViKiMi Editor

Phân trang chỉ thực hiện được trên truy vấn chính của tệp mẫu, Thực hiện Fixed lỗi gặp phải!
Chúng ta đã làm việc nhiều với phân trang của WordPress, tất cả những cách làm đều ổn. Và WordPress chưa làm chúng ta cảm thấy mệt mỏi bởi vì chúng ta cần gì thì WordPress cũng đã có, chỉ cần dùng các chức năng phù hợp. Nhưng liệu có điều gì sẽ xảy ra khi một ngày không đẹp trời chức năng Phân trang của WordPress bỗng phát sinh lỗi.
A ) Công việc chúng ta cần là xem lại toàn bộ quá trình Phân trang, phân tích các khả năng có thể xảy ra, hoàn thiện nó lại cho đúng là được. Trước tiên, cần phải nắm bắt một số điều cơ bản sau đây về phân trang:
+ Khi có nhiều vòng lặp được sử dụng trong một tệp mẫu ( ví dụ category.php ) thì chỉ có một vòng lặp chính có thể thực hiện phân trang. Có lẽ vì lý do này mà WordPress cho phép chúng ta tạo ra nhiều tệp mẫu khác nhau theo mục đích sử dụng.
+ Chúng ta có thể thực hiện phân trang trên các tệp mẫu của WordPress với những cách truy vấn dữ liệu sau đây : Lớp WP_Query & Function query_posts() Hoặc là truy vấn mặc định.
B ) Giả sử chúng ta có một mẫu truy vấn chính và nó phát sinh lỗi. Lỗi gây ra có thể đơn giản là chúng ta gặp phải lỗi 404 hoặc trầm trọng là làm cho Website không thể hoạt động được. Truy vấn có thể như bên dưới, thật khó để tìm được lỗi.
<?php
/* Thiết lập số Posts trên một Page là 5 */
$paged = (get_query_var(‘paged’)) ? get_query_var(‘paged’) : 1;
$args = array(‘posts_per_page’ => 5, ‘paged’ => $paged );
query_posts($args); ?>
<?php if ( have_posts() ) :
while (have_posts()) : the_post(); ?>
<!– rest of the loop –>
<!– the title, the content etc.. –>
<?php endwhile; ?>
<!– pagination –>
<?php the_posts_pagination();
else : ?>
<!– No posts found –>
<?php endif; ?>
Chúng ta cần xác định nguyên nhân phát sinh lỗi và khắc phục sự cố xảy ra. Các bước khắc phục nghe có vẻ khó khăn nhưng điều này hoàn toàn có thể dễ dàng thực hiện và giải quyết thôi :
Bước 1 : Tìm ra tệp đang gây phát sinh lỗi, vì chỉ có thể thực hiện chữa lỗi nếu tìm ra tệp đang lập trình có lỗi. Do quá trình lập trình và dựa vào hệ thống phân cấp mẫu của WordPress thì bạn sẽ dễ dàng tìm ra nó.
Bước 2 : Mở tệp đang có lỗi ra và tìm vòng lặp chính để sửa lỗi do phân trang gây ra. Như chúng ta đã nói chỉ có vòng lặp chính mới có thể thực hiện phân trang và lỗi phân trang sẽ xảy ra ở đó.
Vậy xác định vòng lặp chính như thế nào ?
Vòng lăp chính là vòng lặp có tồn tại phân trang bài viết ở phía trước hoặc sau vòng lặp. Nếu không xác định ra được là có lỗi ở đâu hoặc phân trang như thế nào thì chắc chắn bạn nên tìm một Plugin để có thể phân trang.
THỰC HIỆN PHÂN SỬA LỖI PHÂN TRANG
Chúng ta cần biết rằng cả Function query_posts hoặc Lớp WP_Query đều không phải là cách tốt nhất thay thế cho truy vấn mặc định của WordPress. Do đó, cách sửa lỗi phân trang tốt nhất đó là tác động bằng cách trực tiếp với truy vấn mặc định.
Để làm được điều này bạn cần nối vào ‘pre_get_posts’ và thay đổi truy vấn chính bằng cách sử dụng is_main_query(). Đây là một cách đáng tin cậy để Fixed lỗi do phân trang gây ra. Bởi vì truy vấn chính sẽ được thay đổi trước khi Bài Post được lấy từ Cơ Sở Dữ Liệu.
Nhưng bạn đừng quên điều này : Đó là cách nối vào ‘pre_get_posts’ có thể áp dụng cho mọi tệp mẫu trừ mẫu trang (/Template Post Type: page) . Do đó với mẫu trang thì bạn hay thay thế bằng WP_Query.
CÔNG VIỆC 1 : Với truy vấn mẫu phát sinh lỗi ở trên chúng ta sửa lại như dưới
<?php if ( have_posts() ) :
while (have_posts()) : the_post(); ?>
<!– rest of the loop –>
<!– the title, the content etc.. –>
<?php endwhile; ?>
<!– pagination –>
<?php the_posts_pagination();
else : ?>
<!– No posts found –>
<?php endif; ?>
CÔNG VIỆC 2 : Thực hiện nối vào ‘pre_get_posts’ và thay đổi truy vấn chính để phân trang
Mở file function.php của Themes và thêm đoạn mã Code sửa lỗi phân trang như dưới đây :
function custom_post_queries( $query ) {
/** Thêm điều kiện kiểm tra để không thay đổi truy vấn tại trang wp-admin và chỉ thực hiện thay đổi với main query **/
if (!is_admin() && $query->is_main_query()){
$paged = ( get_query_var(‘paged’) ) ? get_query_var(‘paged’) : 1;
if(is_home()){
$query->set(‘post_type’,’post’);
$query->set(‘post_status’,’publish’);
$query->set(‘posts_per_page’, 3);
$query->set(‘paged’, $paged);
}
if(is_category()){
$query->set(‘post_type’,’post’);
$query->set(‘posts_per_page’, 5);
$query->set(‘paged’, $paged);
}
}
}
add_action( ‘pre_get_posts’, ‘custom_post_queries’ );