Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124


/page/2/ 404 真正該查的方向, 比較可能是這幾種:
到後台:
設定 → 永久網址 → 儲存變更
先做這個。

先在模板裡輸出看看:
<?php
echo get_pagenum_link(2);
?>看它印出的是不是預期的網址,像:
/news/page/2/如果這裡產生就不對,後面的分頁當然會 404。
paged 抓值錯誤請用這段:
<?php
$paged = max(1, get_query_var('paged'), get_query_var('page'));
echo 'paged=' . $paged;
?>打開 /page/2/ 時看有沒有抓到 2。如果沒抓到,代表 rewrite 或模板結構有問題。
這種最容易發生:
<?php
$paged = max(1, get_query_var('paged'), get_query_var('page'));
$query = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 5,
'paged' => $paged,
'cat' => 12,
]);
if ($query->have_posts()) :
while ($query->have_posts()) : $query->the_post();
echo '<h2>' . get_the_title() . '</h2>';
endwhile;
$big = 999999999;
echo paginate_links([
'base' => str_replace($big, '%#%', trailingslashit(get_permalink()) . 'page/%#%/'),
'format' => '',
'current' => $paged,
'total' => $query->max_num_pages,
]);
wp_reset_postdata();
else :
echo '沒有資料';
endif;
?>/news/ 第一頁正常/news/page/2/ 404這通常是因為你現在這頁是一般 page,不是 archive。
在 category.php、archive.php 裡自己又寫了:
$query = new WP_Query([...]);這很容易造成:
/page/2/ 其實是主查詢沒對上在 category/archive template,最穩的是直接用 主查詢:
<?php
/**
* The template for displaying archive pages
* 取得目前物件的 ID: get_queried_object_id();
* 取得目前的物件: get_queried_object();
* 取得目前物件的名稱: get_queried_object()->name;
* 取得目前物件的 slug: get_queried_object()->slug;
* 取得目前物件的類型(taxonomy): get_queried_object()->taxonomy;
*/
get_header();
?>
<main>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<article>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php the_excerpt(); ?>
</article>
<?php endwhile; ?>
<?php
global $wp_query;
$paged = max(1, get_query_var('paged'));
$links = paginate_links([
'total' => $wp_query->max_num_pages,
'current' => $paged,
'prev_text' => 'Prev',
'next_text' => 'Next',
'type' => 'array',
]);
if (!empty($links)) :
?>
<ul class="pagination">
<?php foreach ($links as $link) : ?>
<li><?php echo $link; ?></li>
<?php endforeach; ?>
</ul><!-- /.pagination -->
<?php
endif;
?>
<?php else : ?>
<p>沒有資料</p>
<?php endif; ?>
</main>
<?php get_footer(); ?>如果只是要「某分類與其子孫分類文章」,其實 category archive 主查詢本來就會處理分頁,通常不用自己再 new 一個 query。
現在要記住這句就夠了:
archive.php 負責顯示functions.php 的 pre_get_posts 負責改每頁幾筆不要在 archive.php 再寫 new WP_Query,不然很容易又把分頁弄壞。
paginate_links() 預設就能吐出接近想要的結構,重點是把它包成 ul > li。最簡單就是用 type => 'array',然後自己組 HTML。
<?php
global $wp_query;
$paged = max(1, get_query_var('paged'));
$links = paginate_links([
'total' => $wp_query->max_num_pages,
'current' => $paged,
'prev_text' => 'Prev',
'next_text' => 'Next',
'type' => 'array',
]);
if (!empty($links)) : ?>
<ul class="pagination">
<?php foreach ($links as $link) : ?>
<li><?php echo $link; ?></li>
<?php endforeach; ?>
</ul><!-- /.pagination -->
<?php endif; ?>產生出來會很接近你要的格式, 例如:
<ul class="pagination">
<li><span aria-current="page" class="page-numbers current">1</span></li>
<li><a class="page-numbers" href="/page/2/">2</a></li>
<li><a class="next page-numbers" href="/page/3/">Next</a></li>
</ul>這個 class 是 .pagination,所以可以直接寫:
.pagination {
display: flex;
gap: 8px;
list-style: none;
padding: 0;
margin: 20px 0;
}
.pagination li {
display: inline-block;
}
.pagination a,
.pagination span {
display: inline-block;
padding: 8px 12px;
border: 1px solid #ddd;
text-decoration: none;
}
.pagination .current {
background: #333;
color: #fff;
border-color: #333;
}加上 nav 包住,語意會更完整:
<?php if (!empty($links)) : ?>
<nav class="pagination-nav" aria-label="Pagination">
<ul class="pagination">
<?php foreach ($links as $link) : ?>
<li><?php echo $link; ?></li>
<?php endforeach; ?>
</ul>
</nav>
<?php endif; ?>paginate_links() 產生的 a 和 span 會自帶:
page-numberscurrentnextprev所以通常不用自己再加工 class,直接寫 CSS 就能套。
用 WordPress 主查詢 的話,不是在 archive.php 裡用 new WP_Query 設定每頁筆數,
而是要在 functions.php 用 pre_get_posts 去改。
正確做法: 把下面放到 functions.php:
function my_archive_posts_per_page($query) {
if (!is_admin() && $query->is_main_query() && $query->is_category()) {
$query->set('posts_per_page', 10); // 每頁 10 筆
}
}
add_action('pre_get_posts', 'my_archive_posts_per_page');如果是所有 archive 都要生效,如 category、tag、author、date archive 都一起改:
function my_archive_posts_per_page($query) {
if (!is_admin() && $query->is_main_query() && $query->is_archive()) {
$query->set('posts_per_page', 10); // 每頁 10 筆
}
}
add_action('pre_get_posts', 'my_archive_posts_per_page');如果只想指定某個分類, 例如只有 business-supplies 這個分類每頁 12 筆:
function my_archive_posts_per_page($query) {
if (!is_admin() && $query->is_main_query() && $query->is_category('business-supplies')) {
$query->set('posts_per_page', 12);
}
}
add_action('pre_get_posts', 'my_archive_posts_per_page');