WordPress Pagination là một phần quan trọng trong việc hiển thị danh sách bài viết và giúp người dùng dễ dàng duyệt qua các trang. Trong bài viết này, chúng ta sẽ tìm hiểu cách tạo và tùy chỉnh tính năng này trong giao diện WordPress mà không cần sử dụng plugin.
Contents
WordPress Pagination là gì?
Khi duyệt một chuyên mục hoặc danh sách bài viết theo tháng, năm, ta thường thấy một phần ghi “Trang tiếp theo” hoặc “Trang 2”. Đó chính là Pagination – chức năng giúp người dùng dễ dàng duyệt bài viết hơn. Số bài viết trên mỗi trang có thể được quy định trong phần Cài đặt > Đọc.
Bạn đang xem: Tạo WordPress Pagination không cần plugin
WordPress Pagination trong các giao diện mặc định
Mặc định, WordPress không cho phép hiển thị quá nhiều bài viết trên một trang. Vì vậy, chúng ta cần phải chia nhỏ danh sách bài viết thành các trang riêng biệt. Vậy làm thế nào để tạo và tùy chỉnh tính năng Pagination trong một giao diện WordPress mới?
Hướng dẫn của WordPress đã cung cấp một số function để làm việc này trong các template có sẵn của WordPress.
WordPress Pagination theo bài viết (trước và sau)
Function posts_nav_link()
sẽ hiển thị liên kết tới trang tiếp theo và trang trước đó như sau:
“« Trang trước — Trang tiếp theo”
Còn hai function next_posts_link()
và previous_posts_link()
sẽ hiển thị các bài viết trước và sau. Nếu bạn muốn lấy giá trị, sử dụng:
$next_posts = get_next_posts_link();
$prev_posts = get_previous_posts_link();
WordPress Pagination theo số trang (Numeric)
Từ phiên bản WordPress 4.1 trở lên, bạn có thể sử dụng function the_posts_pagination()
để hiển thị danh sách các liên kết trang, bao gồm cả liên kết trang tiếp theo và trang trước.
Trong các template mặc định của WordPress, ví dụ trong category.php
, archive.php
, khi bạn sử dụng function trên, nó sẽ lấy giá trị của $wp_query
để xác định trang hiện tại.
WordPress Pagination trong bài viết/trang riêng lẻ (Single)
Để sử dụng Pagination trong một bài viết hoặc trang riêng lẻ và các liên kết trỏ tới bài viết tiếp theo hoặc bài viết trước (theo thời gian), chúng ta sử dụng các function sau:
previous_post_link()
: Hiển thị liên kết tới bài viết trước đó.
next_post_link()
: Hiển thị liên kết tới bài viết tiếp theo.
WordPress Pagination giữa các phần của bài viết
Để chia nội dung bài viết thành nhiều phần, mỗi phần là một trang, bạn cần thực hiện như sau:
- Tách các phần nội dung bằng thẻ
<!--nextpage-->
- Trong vòng lặp, bên dưới
the_content()
bạn thêm functionwp_link_pages()
Xem thêm : Cách nhập khẩu tệp CSV vào WordPress mà không cần plugin
Cụ thể, ví dụ như sau:
<?php if ( have_posts() ) : ?>
<!-- Start of the main loop. -->
<?php while ( have_posts() ) : the_post(); ?>
<?php the_content(); ?>
<?php wp_link_pages(); ?>
<?php endwhile; ?>
<?php endif; ?>
WordPress Pagination trong các Custom Query và Custom Template
Giờ hãy xem các phương án khó hơn. Nếu bạn đang sử dụng một giao diện riêng cho trang (ví dụ: page templates/blog.php), và bạn muốn chứa danh sách bài viết và có Pagination, bạn sẽ thực hiện như thế nào?
[sociallocker]
WP_Query
Nếu template của bạn chứa WP_Query, bạn cần thực hiện như sau:
Bước 1: Xác định query_var paged
Đầu tiên, hãy xác định query_var
(tức là thành phần ?page=x
hoặc /page/x
) trong query hiện tại. Lưu ý rằng phần này nằm ngoài vòng lặp while()
.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
Đây là một biến toàn cục, bạn có thể sử dụng một cách an toàn.
Bước 2: Cập nhật $args
để sử dụng paged
$args = array(
'post_type' => array('post'), // Có thể dùng post_type khác ở đây
'posts_per_page' => "5",
'paged' => $paged
);
Bước 3: Chạy WP_Query()
Thực hiện WP_Query để tạo danh sách bài viết. Lý do không sử dụng get_posts()
là vì WP_Query có biến $list->max_num_pages
để tra cứu và hiển thị Pagination chỉ khi số bài viết vượt quá một trang.
// Thực hiện WP_Query
$list = new WP_Query( $args );
if ( $list->have_posts() ) :
while( $list->have_post() ) : $list->the_post();
the_title(); // Demo output
endwhile;
wp_reset_postdata();
endif;
Bước 4: Viết Pagination
Trong custom template, bạn không thể sử dụng the_posts_pagination()
như trong phiên bản 4.9.1. Vì trong core function này sử dụng $wp_query
để xem có max_num_pages
hay không.
Xem thêm : Top 11 Trang web bất động sản uy tín nhất hiện nay
Bởi vậy, chúng ta cần viết code sử dụng paginate_links()
như sau:
global $wp_query;
$big = 999999999; // Số nguyên không thể xảy ra
$translated = __( 'Page', 'mytheme_textdomain' ); // Chuỗi dịch được cung cấp
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $list->max_num_pages,
'before_page_number' => '<span class="screen-reader-text">'.$translated.' </span>'
) );
Bước 5: Đăng ký rewrite URL để sử dụng ?paged
Trong file functions.php
hoặc một trong các file được load vào functions.php
tùy theo dự án, bạn cần đăng ký rewrite URL như sau:
add_action('init', 'rewrite_url');
// Lưu ý thay thế đường dẫn /blog/ bằng trang của bạn
$page_slug = 'blog';
function rewrite_url() {
add_rewrite_url($page_slug . '/page/([0-9]{1,})/?$', 'index.php?pagename=$matches[1]&paged=$matches[2]', 'top');
}
Bước này sẽ cho phép bạn sử dụng get_query_var('paged')
như trên. Nếu không sử dụng bước này, bạn sẽ lấy giá trị bằng $_GET('paged')
, nhưng không nên làm như vậy. Lý do là ta cần rewrite URL để nó tương thích với pagination_links()
ở bước 4.
Đừng quên vào Cài đặt > Cấu trúc permalink để lưu lại và áp dụng thay đổi.
Các cách làm không nên
Viết đè $wp_query
Việc viết đè lên biến $wp_query
không nên thực hiện vì $wp_query
là một biến toàn cục mặc định của WordPress. Nếu bạn ghi đè, thì có thể dữ liệu hiển thị sẽ không chính xác nếu bạn chưa hiểu rõ về WP_Query.
Tuy nhiên, điểm lợi của cách làm này là query sẽ gần giống các query mặc định và bạn có thể sử dụng the_posts_pagination()
.
Ví dụ:
global $wp_query;
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'post',
'posts_per_page' => 5,
'paged' => $paged
);
$wp_query = new WP_Query($args);
if (have_posts()) :
while (have_posts()) : the_post();
the_title();
endwhile;
the_posts_pagination();
wp_reset_query();
endif;
[/sociallocker]
WordPress Pagination là một tính năng quan trọng cho nhiều trang web để đảm bảo hiệu suất và tăng tỷ lệ chuyển đổi của nội dung. Nếu bạn cần phát triển giao diện với các tính năng tương tự, hướng dẫn trên sẽ giúp bạn hoàn thành công việc một cách hiệu quả.
Trong trường hợp bạn muốn sử dụng một plugin thay thế, WP-Pagenavi là một lựa chọn đáng xem.
Nếu bạn có thắc mắc hoặc câu hỏi, hãy để lại bình luận.
Nguồn: https://laptrinhc.edu.vn
Danh mục: Web