本篇文章更新時間: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' ) 值不同的話,就會發生分頁邏輯錯誤。

WordPress Template 架構

圖片由左而右的順序其實因為 posts_per_page 這個參數的不同調影響會有點改變。

舉分類的文章列表來說,預設使用 category.php 這份主題檔案繼承,但如果使用 category-$id.php 繼承某個子分類的話,看上圖理論會優先執行,不過其實測試後並沒有,所以如果在 Template 裡有覆寫 WP_Query 結果的話,還得要先過前面這關,很容易就會在內容列表頁踩到雷。

整理踩雷因子:

  1. 使用變數 Template 繼承某一個列表頁面。
  2. 該繼承的頁面希望輸出文章列表數量與預設不同。
  3. 使用 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' );

後記

如果沒有特殊需求,其實都把「顯示文章數量」跟著預設的參數走就不會出問題。


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____36%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Mastodon