Học cách tạo một vòng lặp WordPress tùy chỉnh với phân trang là rất tốt. Không phải lúc nào bạn cũng muốn sử dụng truy vấn mặc định trên trang của mình, vì vậy việc thiết lập truy vấn tùy chỉnh trên một trang là khá tiện dụng. Điều này đặc biệt hữu ích cho những thời điểm bạn muốn hiển thị tất cả các bài đăng trên trang đầu tĩnh và bạn muốn giới hạn các bài đăng đó ở một số thông số nhất định. Trong trường hợp của chúng tôi, chúng tôi sẽ giả định các thông số sau:
Type of post: post
# of posts we want to display on our page: 5
Category that our post resides in: Tutorials
Pagination: Yes
Chúng tôi cũng sẽ thiết lập một chức năng phân trang tùy chỉnh cho phép chúng tôi kiểm tra xem phân trang có tồn tại / có sẵn hay không và nếu có, chúng tôi sẽ hiển thị số lượng trang và liên kết đến các trang kế tiếp cho truy vấn của chúng tôi. Chúng tôi cũng sẽ sử dụng truy vấn này trên Trang chính tĩnh, nơi phổ biến nhất để thiết lập truy vấn tùy chỉnh. Nếu bạn không biết cách thiết lập trang đầu tĩnh, tôi thực sự khuyên bạn nên đọc nhanh tài liệu này trên WordPress.
The WP_Query Class
Trước tiên, hãy xem tham chiếu lớp cho WP_Query. Tại đây, chúng ta có thể xem mọi thứ chúng ta cần biết về việc tạo một phiên bản mới của WP_Query và kết quả là tạo một vòng lặp mới. Bạn nên tự làm quen và đánh dấu tài liệu tham khảo này vì đối với bất kỳ dự án nào yêu cầu hiển thị tùy chỉnh các trang hoặc bài đăng, đây là hướng dẫn của bạn. Đặc biệt quan tâm là các phần “phương pháp và thuộc tính” và “tham số”. Các phương thức và thuộc tính của truy vấn của chúng tôi cung cấp cho chúng tôi những cách mà chúng tôi có thể tương tác với truy vấn sau khi chúng tôi khởi tạo nó và các tham số là những gì chúng tôi sẽ đặt trong phần khởi tạo của truy vấn của chúng tôi. Các tham số này sẽ hoạt động như các đối số của chúng tôi và sẽ cho phép chúng tôi điều chỉnh truy vấn để chỉ hiển thị kết quả chúng tôi cần.
Interacting with WP_Query & Usage
Để bắt đầu, bạn nên đọc phần tương tác với WP_Query để biết cách bạn có thể tương tác với nó khi đã thiết lập xong. Hãy xem cách sử dụng cơ bản được ghi lại trên trang tham khảo của lớp.
<?php
// the query
$the_query = new WP_Query( $args ); ?>
<?php if ( $the_query->have_posts() ) : ?>
<!-- pagination here -->
<!-- the loop -->
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<h2><?php the_title(); ?></h2>
<?php endwhile; ?>
<!-- end of the loop -->
<!-- pagination here -->
<?php wp_reset_postdata(); ?>
<?php else: ?>
<p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>
<?php endif; ?>
Trong mẫu mã do WordPress cung cấp, chúng tôi thấy một vài điều đang xảy ra. Chúng tôi tạo một biến có tên là $ the_query và đặt nó bằng một phiên bản mới của WP_Query. Bên trong WP_Query, chúng tôi gửi một biến có tên là $ args. Biến này chứa tất cả các đối số của chúng ta cho truy vấn. Khi truy vấn mới được thiết lập, chúng ta có thể tương tác với nó. Chúng tôi bắt đầu bằng cách xem liệu có bất kỳ bài đăng nào để hiển thị dựa trên truy vấn của chúng tôi hay không. Chúng tôi thực hiện việc này bằng cách kiểm tra xem $ the_query-> have_posts () có trả về true hay không. Nếu đúng, thì chúng ta có thể vào vòng lặp của mình. Chúng tôi thực hiện điều này bằng cách sử dụng vòng lặp while với has_posts () làm điều kiện. Sau đó, trong mỗi lần lặp, chúng ta gọi $ the_query-> the_post () để thiết lập các biến nội bộ bên trong $ the_query và đặt biến $ post toàn cục. Bây giờ, bên trong vòng lặp của chúng tôi, chúng tôi có thể gọi bất kỳ hàm vòng lặp nào cũng như các phương thức và thuộc tính truy vấn và tùy chỉnh vòng lặp của chúng tôi. Trong mẫu ở trên, chúng tôi đang xuất ra tiêu đề của mỗi bài đăng trong truy vấn của mình bằng cách sử dụng hàm the_title (). Bạn nên khôi phục dữ liệu bài đăng gốc của trang bạn đang truy cập sau khi sử dụng truy vấn tùy chỉnh. Điều này được thực hiện bằng cách gọi hàm wp_reset_postdata ().
Setting Up Our Arguments
Như đã lưu ý ở trên, chúng tôi có bốn đối số mà chúng tôi muốn chuyển vào truy vấn của mình. Đây là một lần nữa để tham khảo nhanh:
Type of post: post
# of posts we want to display on our page: 5
Category that our post resides in: Tutorials
Pagination: Yes
Biến đối số của chúng ta có thể được chuyển vào dưới dạng một mảng, vì vậy hãy làm điều đó. Trước tiên, chúng tôi sẽ tạo mảng và gán nó cho một biến có tên là $ args, sau đó chuyển mảng đó vào phiên bản WP_Query mới của chúng tôi. Nếu chúng ta kiểm tra phần thông số trong mục lục, chúng ta sẽ thấy các liên kết đến mọi thứ chúng ta cần. Đầu tiên chúng ta hãy kiểm tra “thông số loại” sẽ cho phép chúng tôi đặt loại bài đăng của mình.
The Type Parameter
Tham số type cho phép chúng tôi hiển thị các bài đăng được liên kết với một số loại nhất định. Có một số có sẵn như đã thấy trong tài liệu. Trong trường hợp của chúng tôi, chúng tôi đang tìm kiếm một bài đăng. May mắn cho chúng tôi, đây là loại mặc định nếu bạn không chỉ định không, vì vậy chúng tôi thực sự không cần chỉ định nó. Nhưng để dự phòng và làm quen, chúng tôi vẫn sẽ thiết lập nó. Cho đến nay, biến đối số của chúng ta sẽ trông như thế này:
$query_args = array(
'post_type' => 'post'
);
Bây giờ, hãy đặt thông số danh mục của chúng tôi. Chúng ta sẽ kiểm tra "thông số danh mục" để xem chúng ta cần bao gồm những gì.
The Category Parameter
Chúng tôi biết rằng chúng tôi chỉ muốn hiển thị các bài đăng từ danh mục “Hướng dẫn” của chúng tôi, vì vậy, hãy xem những gì có sẵn cho chúng tôi. Chúng ta có thể thấy ngay rằng chúng ta có một tham số theo ý mình mà chúng ta có thể sử dụng. Đây là thông số "category_name". Từ định nghĩa, chúng ta thấy rằng tham số này yêu cầu loại slug, không phải tên thực. Trong bảng quản trị WordPress của chúng tôi, chúng tôi có thể lấy slug cho danh mục của chúng tôi được đề cập. Trong trường hợp này, nó là "hướng dẫn". Bây giờ chúng ta có thể thêm điều này vào biến đối số của mình, bây giờ sẽ trông giống như sau:
Bây giờ chúng ta hãy xem chỉ hiển thị một số bài đăng nhất định trên mỗi trang và thêm phân trang cho các bài đăng của chúng ta. Nhìn lướt qua mục lục, chúng ta thấy rằng chúng ta cần tìm hiểu kỹ phần gọi là “tham số phân trang”. Phần này cho chúng ta biết tất cả về cấu trúc bài đăng thành các trang khác nhau.
Pagination Parameters
Phần này của WP_Query có xu hướng khiến mọi người nhầm lẫn, nhưng chúng tôi sẽ xem xét và làm cho nó rất đơn giản. Điều đầu tiên chúng tôi muốn làm là giới hạn số lượng bài đăng hiển thị trên mỗi trang trong truy vấn được phân trang của chúng tôi. Để làm điều này, chúng tôi sử dụng tham số “posts_per_page” rất tự giải thích. Trong trường hợp của chúng tôi, chúng tôi muốn 5 bài đăng hiển thị trên mỗi trang. Truy vấn của chúng tôi bây giờ sẽ giống như sau:
Bây giờ, hãy xem xét việc phân trang các bài đăng. Trong tham chiếu lớp, chúng ta thấy hai định nghĩa trong phần tham số phân trang. Một cho “trang” và một cho “trang”. Hai định nghĩa như sau:
paged (int) - số trang. Hiển thị các bài đăng thường chỉ hiển thị trên trang X khi sử dụng liên kết "Bài viết cũ hơn".
page (int) - số trang cho một trang đầu tĩnh. Hiển thị các bài đăng thường chỉ hiển thị trên trang X của Trang chính tĩnh.
Trong trường hợp của chúng tôi, vì chúng tôi đang thiết lập truy vấn của mình trên trang đầu tĩnh, chúng tôi cần sử dụng tham số “page”. Đây thường là phần mà nhiều người nhầm lẫn, nhưng tài liệu luôn ở đây để giải cứu. Đoạn văn bản sau được lấy trực tiếp từ tài liệu:
Phân trang Lưu ý: Sử dụng get_query_var (‘page’); nếu bạn muốn truy vấn của mình hoạt động trong Mẫu trang mà bạn đã đặt làm trang đầu tĩnh của mình… Hiển thị các bài đăng từ trang hiện tại trên trang đầu tĩnh:
Làm thế nào đơn giản là vậy? Họ đã cung cấp cho chúng tôi thông số mà chúng tôi cần đưa vào truy vấn của mình để cho phép phân trang. Bây giờ, truy vấn của chúng tôi sẽ trông giống như thế này cho các trang chủ tĩnh:
Và cùng với đó, chúng tôi đã sẵn sàng thiết lập vòng lặp, thực hiện kiểm tra phân trang và hiển thị các liên kết phân trang nếu chúng xảy ra. Tất nhiên, chúng sẽ chỉ xảy ra nếu truy vấn của chúng tôi mang lại nhiều hơn số lượng bài đăng trên mỗi trang mà chúng tôi đã chỉ định. Trong trường hợp này, con số đó là 5. Hãy xây dựng vòng lặp của chúng ta!
Constructing The WordPress Loop
Bây giờ, đã đến lúc tạo vòng lặp. Khi chúng tôi bắt đầu vòng lặp, chúng tôi sẽ có quyền truy cập vào một loạt các chức năng của WordPress cho phép chúng tôi hiển thị những thứ như tiêu đề của bài đăng, đoạn trích của bài đăng và nội dung bài đăng. Vì đơn giản, chúng tôi sẽ chỉ xuất tiêu đề bài đăng. Tất nhiên, bạn có thể muốn hiển thị nhiều hơn thế, vì vậy hãy tìm hiểu kỹ Tham khảo chức năng của WordPress để biết một loạt các chức năng có sẵn cho bạn. Hãy cùng xem tài liệu “Vòng lặp” trên WordPress codex. Sau khi xem nhanh, chúng ta có thể thấy rằng vòng lặp được khởi tạo như sau:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<!-- some code here -->
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
Đây là cú pháp vòng lặp cơ bản, nhưng vì chúng tôi đang sử dụng truy vấn tùy chỉnh của mình, chúng tôi phải truy cập vòng lặp bằng cách sử dụng biến truy vấn đại diện cho một phiên bản mới của WP_Query. Từ trên, phiên bản truy vấn của chúng tôi được ghi nhận bởi biến $ the_query. Vòng lặp của chúng ta, trong trường hợp này, sẽ giống như sau:
<?php if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<!-- some code here -->
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
Bộ mã trên cung cấp một bộ chức năng nhất định. Đầu tiên, nó kiểm tra xem có bất kỳ bài đăng nào được gửi đi do truy vấn tùy chỉnh của chúng tôi hay không. Nếu điều này là đúng và chúng tôi có bài đăng, chúng tôi sẽ tham gia vào một vòng lặp while. Vòng lặp while lặp lại qua truy vấn của chúng tôi, sau đó thực hiện một bộ mã cho mỗi bài đăng được trả về. Đây là nơi chúng tôi có thể xuất những thứ như mỗi tiêu đề bài đăng, v.v. Nếu không có bài đăng nào được trả lại do truy vấn của chúng tôi, chúng tôi nhập phần khác của khối và trả về một câu lệnh lỗi thông báo cho người dùng rằng không có bài đăng nào tồn tại dựa trên truy vấn. Hãy cải thiện vòng lặp này một chút và làm cho nó thân thiện với người dùng hơn một chút để nó thực sự hiển thị một cái gì đó nếu chúng ta có bài đăng. Sử dụng hàm the_title () của WordPress, chúng tôi sẽ xuất ra tiêu đề của mỗi bài đăng được trả về. Vòng lặp của chúng ta bây giờ trông như thế này:
<?php if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<h1><?php echo the_title(); ?></h1>
<?php endwhile; else: ?>
<h1>Sorry...</h1>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
Và Voila! Vòng lặp của chúng tôi hiện đang xuất các bài đăng dựa trên truy vấn tùy chỉnh của chúng tôi. Bây giờ, thời gian cho một số chức năng ngọt ngào. Chúng tôi muốn phân trang vòng lặp của mình, điều này đặc biệt hữu ích khi chúng tôi có nhiều bài đăng và chỉ muốn hiển thị một lượng bài viết nhất định trên mỗi trang. Như chúng tôi đã lưu ý ở trên, chúng tôi chỉ hiển thị 5 bài đăng trên mỗi trang dựa trên truy vấn của chúng tôi. Giả sử rằng truy vấn của chúng tôi đang trả về 20 bài đăng (hoặc bất kỳ số tiền nào nhiều hơn 5). Chúng tôi muốn người dùng có thể truy cập các bài đăng cũ hơn nếu họ muốn. Nhưng bằng cách nào?
Paginating The Custom Loop
Bây giờ, vòng lặp của chúng ta đã sẵn sàng để phân trang, hãy cùng xem một số chức năng cốt lõi của WordPress. Nếu chúng ta xem Tham khảo hàm WordPress, chúng ta sẽ bắt gặp hai hàm có tên get_next_posts_link và get_previous_posts_link. Lưu ý rằng cũng có hai hàm next_posts_link và before_posts_link, nhưng theo tham chiếu hàm, chúng không hoạt động trên các trang tĩnh, do đó làm cho chúng vô hiệu trong trường hợp của chúng tôi. Chúng ta hãy xem xét hai chức năng chúng ta cần.
Hàm get_next_posts_link, như được mô tả ở đây trong tham chiếu hàm, nhận liên kết đến nhóm bài đăng trước đó trong truy vấn hiện tại. Theo tài liệu tham khảo:
Vì các truy vấn bài đăng thường được sắp xếp theo thứ tự thời gian ngược lại, get_next_posts_link () thường trỏ đến các mục cũ hơn (về cuối tập hợp) và get_previous_posts_link () thường trỏ đến các mục nhập mới hơn (về đầu tập hợp).
Nói một cách dễ hiểu, giờ đây chúng tôi có thể hiển thị các liên kết rất nhanh chóng và dễ dàng tới các nhóm bài đăng cũ hơn và mới hơn nếu chúng tồn tại (tức là nếu truy vấn của chúng tôi trả lại nhiều bài đăng hơn giá trị chúng tôi đặt trong thông số bài đăng trên mỗi trang). Hãy xem cách chúng tôi sử dụng hàm get_next_posts_link khi chúng tôi đang truy vấn một vòng lặp với WP_Query. Theo tài liệu,
Thêm tham số $ max_pages vào hàm get_next_posts_link () khi truy vấn vòng lặp với WP_Query. Để nhận tổng số trang, bạn có thể sử dụng thuộc tính max_num_pages của đối tượng WP_Query tùy chỉnh.
The Full Query With Next & Previous Post Links
Bây giờ, truy vấn tùy chỉnh đầy đủ của chúng tôi, với các liên kết phân trang đơn giản (tức là các liên kết trỏ đến các trang có bài đăng cũ hơn và mới hơn) sẽ trông như thế này:
Bây giờ, truy vấn tùy chỉnh đầy đủ của chúng tôi, với các liên kết phân trang đơn giản (tức là các liên kết trỏ đến các trang có bài đăng cũ hơn và mới hơn) sẽ trông như thế này:
Static Home Page
<?php
// set up or arguments for our custom query
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;;
$query_args = array(
'post_type' => 'post',
'category_name' => 'tutorials',
'posts_per_page' => 5,
'paged' => $paged
);
// create a new instance of WP_Query
$the_query = new WP_Query( $query_args );
?>
<?php if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); // run the loop ?>
<article>
<h1><?php echo the_title(); ?></h1>
<div class="excerpt">
<?php the_excerpt(); ?>
</div>
</article>
<?php endwhile; ?>
<?php if ($the_query->max_num_pages > 1) { // check if the max number of pages is greater than 1 ?>
<nav class="prev-next-posts">
<div class="prev-posts-link">
<?php echo get_next_posts_link( 'Older Entries', $the_query->max_num_pages ); // display older posts link ?>
</div>
<div class="next-posts-link">
<?php echo get_previous_posts_link( 'Newer Entries' ); // display newer posts link ?>
</div>
</nav>
<?php } ?>
<?php else: ?>
<article>
<h1>Sorry...</h1>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
</article>
<?php endif; ?>
Custom Static Page (that isn’t home page)
<?php
// set up or arguments for our custom query
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$query_args = array(
'post_type' => 'post',
'category_name' => 'tutorials',
'posts_per_page' => 5,
'paged' => $paged
);
// create a new instance of WP_Query
$the_query = new WP_Query( $query_args );
?>
<?php if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); // run the loop ?>
<article>
<h1><?php echo the_title(); ?></h1>
<div class="excerpt">
<?php the_excerpt(); ?>
</div>
</article>
<?php endwhile; ?>
<?php if ($the_query->max_num_pages > 1) { // check if the max number of pages is greater than 1 ?>
<nav class="prev-next-posts">
<div class="prev-posts-link">
<?php echo get_next_posts_link( 'Older Entries', $the_query->max_num_pages ); // display older posts link ?>
</div>
<div class="next-posts-link">
<?php echo get_previous_posts_link( 'Newer Entries' ); // display newer posts link ?>
</div>
</nav>
<?php } ?>
<?php else: ?>
<article>
<h1>Sorry...</h1>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
</article>
<?php endif; ?>
Bây giờ chúng tôi đã tạo các liên kết đến các trang trước và trang sau. Điều này thật tuyệt, và nó hoạt động, nhưng nếu chúng ta muốn một cấu trúc phân trang nâng cao hơn thì sao? Điều gì sẽ xảy ra nếu chúng ta muốn hiển thị số lượng trang, liên kết đến số trang thực tế và liên kết đến trang cuối cùng và đầu tiên nếu chúng ta có nhiều trang? Đối với điều này, chúng ta cần viết một hàm phức tạp hơn một chút dựa trên các nguyên tắc tương tự như trên. Chúng tôi đã biết một số điều sẽ giúp chúng tôi:
Chúng tôi có thể kiểm tra xem phân trang có tồn tại hay không Chúng tôi có thể kiểm tra số lượng trang tối đa hoặc trả về truy vấn dựa trên số lượng bài viết được trả lại so với số lượng bài viết trên mỗi trang được hiển thị Bây giờ chúng ta hãy xem xét thiết lập chức năng của chúng tôi.
Advanced Pagination Function
Chúng tôi muốn tạo một hàm chấp nhận ba giá trị:
1. The number of pages, tức là số trang của các bài đăng được trả về bởi truy vấn của chúng tôi. Điều này được thuộc tính $ max_num_pages
2. The page range. Đây là một loạt các trang mà chúng tôi sẽ hiển thị để người dùng có thể nhấp vào. Chúng tôi muốn nó là một số chẵn
3. Giá trị $ paged, sẽ khác với các trang chủ tĩnh và các trang tùy chỉnh khác.
Chúng tôi cũng muốn hàm của mình có các giá trị dự phòng, để chúng tôi có thể sử dụng hàm này trong bất kỳ truy vấn tùy chỉnh nào mà chúng tôi thiết lập và cả trên bất kỳ trang nào có truy vấn toàn cục (ví dụ: trang lưu trữ danh mục). Cho đến nay, hàm của chúng ta sẽ trông như thế này:
function custom_pagination($numpages = '', $pagerange = '', $paged='') {
if (empty($pagerange)) {
$pagerange = 2;
}
/**
* This first part of our function is a fallback
* for custom pagination inside a regular loop that
* uses the global $paged and global $wp_query variables.
*
* It's good because we can now override default pagination
* in our theme, and use this function in default quries
* and custom queries.
*/
global $paged;
if (empty($paged)) {
$paged = 1;
}
if ($numpages == '') {
global $wp_query;
$numpages = $wp_query->max_num_pages;
if(!$numpages) {
$numpages = 1;
}
}
}
Bây giờ mọi thứ đã được thiết lập, chúng ta cần tìm ra cách xuất cấu trúc phân trang. May mắn thay, WordPress xử lý điều này một cách tuyệt vời cho chúng tôi bằng một chức năng cốt lõi paginate_links. Hãy xem tham chiếu chức năng cho chức năng này và xem những gì nó cung cấp. Dưới đây là định nghĩa về hàm trực tiếp từ tài liệu:
Truy xuất liên kết được phân trang cho các trang lưu trữ bài đăng. Về mặt kỹ thuật, hàm có thể được sử dụng để tạo danh sách liên kết được phân trang cho bất kỳ khu vực nào
Nếu chúng ta đọc qua, chúng ta nhận thấy rằng hàm nhận một mảng đối số. Bạn nên đọc qua phần này và làm quen với ý nghĩa của mỗi đối số. Tuy nhiên, bây giờ hãy cuộn xuống phần “ví dụ với truy vấn tùy chỉnh”. Chúng tôi sẽ sử dụng cái này làm mẫu, nhưng chỉnh sửa một vài thứ. Trước hết, chúng tôi đã thiết lập số lượng trang (tức là số trang tối đa) bằng biến $ numpages. Chúng tôi cũng biết số trang hiện tại của chúng tôi được đặt bởi biến $ paged. Đối số ‘mid_size’ biểu thị “có bao nhiêu số ở một trong hai bên của trang hiện tại, nhưng không bao gồm trang hiện tại”. Chúng tôi sẽ sử dụng biến $ pagerange của chúng tôi ở đây, biến này được mặc định là 2 nếu không được chuyển qua hàm. Cuối cùng, chúng ta sẽ đặt các nút trước đó và nút tiếp theo của chúng ta thành mũi tên kép, và xuất phân trang của chúng ta ở định dạng đơn giản. Hai đối số quan trọng mà chúng tôi sẽ chỉnh sửa là:
base: chúng tôi sẽ không sử dụng gợi ý mặc định từ tham chiếu, vì trên các trang cao hơn 1, trang 1 tham chiếu trở lại “pageurl / page / 1” và chúng tôi muốn nó trỏ trở lại tham chiếu “pageurl”. Chúng tôi sẽ sử dụng một hàm WordPress khác thường hơn không được ghi lại trong tham chiếu hàm, được gọi là getpagenum_link (). Hàm này trả về url của một trang được phân trang khi bạn chuyển số trang vào. Nếu số trang là 1, nó được mặc định là url trang cơ sở. Cũng theo định nghĩa, “% %” trong đối số này sẽ được thay thế bằng đối số “định dạng” trên mỗi trang. Đối số ‘base’ của chúng ta sau đó sẽ giống như sau: 'base' => getpagenum_link (1). ‘% %’
format: trong trường hợp của tôi, tôi đang sử dụng các liên kết cố định khá tốt, vì vậy tôi sẽ không tuân theo định dạng mặc định. Tôi sẽ sử dụng định dạng “page /% #%”, định dạng này sẽ kết hợp với đối số "base" để xuất url ở định dạng này: nếu đó là trang 1, nó sẽ xuất ra “pageurl” bất kỳ trang nào cao hơn trang 1 sẽ cho kết quả là “pageurl / page / pagenumber” Các đối số của chúng ta bây giờ sẽ như thế này:
Cuối cùng, hãy xuất mọi thứ. Chúng ta chuyển các đối số của mình vào hàm paginate_links, hàm này sẽ trả về cấu trúc phân trang nếu chúng ta có nhiều hơn một trang. Sau đó, chúng tôi có thể kiểm tra xem paginate_links có trả về bất kỳ thứ gì không và nếu có, hãy chạy đầu ra bao gồm một số nội dung bổ sung như “trang x của y”. Chúng tôi sẽ thêm một vài lớp CSS và cũng kiểm tra các lớp trong đầu ra của chúng tôi và thêm các kiểu vào biểu định kiểu của chúng tôi cho phù hợp. Chúng ta nên có một cái gì đó giống như sau:
function custom_pagination($numpages = '', $pagerange = '', $paged='') {
if (empty($pagerange)) {
$pagerange = 2;
}
/**
* This first part of our function is a fallback
* for custom pagination inside a regular loop that
* uses the global $paged and global $wp_query variables.
*
* It's good because we can now override default pagination
* in our theme, and use this function in default quries
* and custom queries.
*/
global $paged;
if (empty($paged)) {
$paged = 1;
}
if ($numpages == '') {
global $wp_query;
$numpages = $wp_query->max_num_pages;
if(!$numpages) {
$numpages = 1;
}
}
/**
* We construct the pagination arguments to enter into our paginate_links
* function.
*/
$pagination_args = array(
'base' => get_pagenum_link(1) . '%_%',
'format' => 'page/%#%',
'total' => $numpages,
'current' => $paged,
'show_all' => False,
'end_size' => 1,
'mid_size' => $pagerange,
'prev_next' => True,
'prev_text' => __('«'),
'next_text' => __('»'),
'type' => 'plain',
'add_args' => false,
'add_fragment' => ''
);
$paginate_links = paginate_links($pagination_args);
if ($paginate_links) {
echo "<nav class='custom-pagination'>";
echo "<span class='page-numbers page-num'>Page " . $paged . " of " . $numpages . "</span> ";
echo $paginate_links;
echo "</nav>";
}
}
I'm fairly new to posting here and I'll try to keep it as clear as possible! Any guidance is greatly appreciated!
The Goal:
I am trying to create a Custom Post Type and a Taxonomy where I can upload posts inside the Taxonomy and have a URL structure like this: site-name.com/cpt-slug/taxonomy-slug/post-slu.
I also need to be able to have pagination on both site-name.com/cpt-slug/ and site-name.com/cpt-slug/taxonomy-slug
Currently:
I have studied a few other posts that have gotten me 99% of the way there! I just can't quite figure out how to finish it at this point. I have done most of what this answer has suggested and i will show my code below for clarity.
Overall the post I referenced makes a ton of sense, I feel I understand whats going on here and everything was good until I tried setting up Pagination on the page site-name.com/kb.
This page was working great. I was able to show all the posts per category and I was able to go from here and click any post or Taxonomy and have the URL structure mentioned above. However whenever I try to go to the next page or third page I either get a 404 error or I get redirected to a post in my CPT.
As an example site-name.com/kb/page/2 always goes to the same post that is a post in my CPT and site-name.com/kb/page/3 always goes to 404. After some digging around some more I found another post that seemed to have a very promising answer and I still feel it could be the right answer I just can't get it to work. Admittedly I don't have a lot of experience with rewrites and this may be where the issue is.
I have tested the pagination and my page template by creating a different page with a slug of /kb-test/ and everything works perfectly. So this only happens on /kb/ for some reason.
From what I understand from the posts I mentioned above, WordPress has created rewrites based on the CPT and Taxonomy I set up and so its not able to go to /kb/page/, but I have tried many times now tweaking the code I have here trying to get it to recognize /kb/page/ but to no avail.
Thank you ahead of time to anyone who takes the time to look through this and respond. I really think I must be super close but just cant quite get the last bit alone. Thanks everyone!
**
UPDATE
**
First off thank you for everyone helping me format my question, much appreciated! I wanted to write a quick update to help answer this question for future viewers if I can.
After working on this more I now realize I was very close with the code above. One thing I had to do was remove the rewrite_rules_array hook. I assume because the rules were conflicting with the rules I have in the generate_rewrite_rules hook.
So that's great! However I still have one remaining issue i'm working on. For some reason when I go to site-name.com/kb/page/2/ it still goes to a post that is in the /kb/ CPT. Every other page seems to work great. site-name.com/kb/page/3/ and so on, all work correctly. I even deleted the post that /page/2/ is going to. It still goes to that same URL but now just shows 404.
I'll keep working on this and update when I figure it out. In the mean time if anyone has any tips to help with this i'd appreciate any help!
**
FINAL UPDATE
**
Turns out the last little issue of /page/2/ was a caching issue and all is good now. I will answer my question so we can close it out. Hopefully this helps anyone in the future with this same issue!
Include this hook to tell Wordpress how to handle %taxonomy_name% in your CPT registration (for me "knowledge_base" is my CPT name, and "kb_topics" is my taxonomy name. Replace these as necessary throughout)
TIP: One last tip, in order to use a page template for site-name.com/kb/ you need to create a template in the back end with the filename of archive-knowledge_base.php, replacing knowledge_base with your CPT name.
That's it! I hope this helps others in the future maybe not run into the same issues I did. Good luck and happy coding!