本篇文章更新時間:2020/04/23
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
有碰過點擊分類列表文章最後一頁會顯示 404 Not Found 找不到文章的錯誤嗎?
恩,我查英文資料都很少了,估計中文使用者會碰到的機會更低XD
前端同事實作過程跟我反應這問題的時候,第一時間還以為是 Pagination 分頁問題。
開了 Query Monitor 查看 Rewrite 也正常,一開始也沒看出個什麼所以然,但就是持續出現 404 找不到頁面。直到看到這篇 WordPress /page/2 404 pagination problem - what to do? 下方的一個回覆:「改變顯示的文章數量就搞定了」
這個方向也是神展開。趕快跑去檢查請求時的 Query ,發現明明繼承下來的 Template 裡自己改寫 Query 的撈取數量為 5 ,怎麼會是 LIMIT 10, 10
? 這樣找不到半篇文章,所以判定找不到也是剛剛好啊。
由此可以得知,這個 posts_per_page
參數會先使用預設值(10
)執行,如果剛好繼承的 Template 頁面中有分頁的設定且與預設 get_option( 'posts_per_page' )
值不同的話,就會發生分頁邏輯錯誤。
圖片由左而右的順序其實因為
posts_per_page
這個參數的不同調影響會有點改變。舉分類的文章列表來說,預設使用
category.php
這份主題檔案繼承,但如果使用category-$id.php
繼承某個子分類的話,看上圖理論會優先執行,不過其實測試後並沒有,所以如果在 Template 裡有覆寫 WP_Query 結果的話,還得要先過前面這關,很容易就會在內容列表頁踩到雷。
整理踩雷因子:
- 使用變數 Template 繼承某一個列表頁面。
- 該繼承的頁面希望輸出文章列表數量與預設不同。
- 使用 Rewrite 方式連結分頁頁面。Ex:
/page/2/
三個因子缺一不可,要碰到的確不容易。
如果要趕在執行到繼承變數 Template 檔案前先將「每頁露出文章數量」改過同步的話,可以使用下面的方法:(範例是針對 news
這個分類)
function mxp_news_category_query_hack( $query ) {
if ( ! is_admin() && $query->is_main_query() ) {
// Not a query for an admin page.
// It's the main query for a front end page of your site.
if ( is_category('news')) {
// It's the main query for a category archive.
// Let's change the query for category archives.
$query->set( 'posts_per_page', 5 );
}
}
}
add_action( 'pre_get_posts', 'mxp_news_category_query_hack' );
後記
如果沒有特殊需求,其實都把「顯示文章數量」跟著預設的參數走就不會出問題。