開發紀錄
精選文章與時間排序如何共存
從目前筆記列表的 featured metadata、發布日期排序與分頁實作,整理編輯推薦和最新文章為什麼要分開處理。
- 內容工程
- 編輯系統
- Astro
- 排序
「最新」和「精選」看起來都像是在告訴讀者先看哪篇,其實它們回答不同的問題。
最新排序回答的是:哪一些文章最近符合正式發布條件?精選標記回答的是:編輯希望在列表入口特別提出哪一些文章?如果把兩者混成同一個排序欄位,新的文章一發布,編輯想保留的入口就會被時間推走;如果完全忽略時間,讀者又無法知道內容的新鮮度。
目前的做法是把兩種責任拆開:公開集合先依發布時間和穩定 ID 排序,列表頁再把 featured 文章放進每個有效分頁都會出現的獨立精選區塊,普通文章另外分頁。
發布日期先決定哪些文章進入集合
筆記公開查詢先處理資格,不先處理版面:
draft必須是false。- 文章必須有
publishedAt。 - 發布日期不能晚於台北今天。
- 需要指定語言時,
locale必須相符。
符合條件後,集合依 publishedAt 由新到舊排序;如果秒級時間相同,再依 stableId 排出穩定順序。這一層只回答「哪些文章是可發布的,以及最新順序怎麼算」,不會因為某篇被標成 featured 就把時間改掉。
所以 featured 不是發布資格,也不是另一種日期。草稿不能靠填入 featured: true 提前進入正式網站,未到日期的文章也不會因為被選為精選而跳過發布條件。
列表頁再處理精選區塊
筆記列表收到已排序的公開集合後,才分成兩組:
可發布文章
├── featured 文章 → 每個有效分頁的精選區塊
└── 非 featured 文章 → 一般文章列表與分頁
每個有效分頁都會顯示精選區塊。一般列表會排除精選文章,因此同一篇不會在一般列表中重複;一般文章的分頁也只對非精選集合計算。
這個順序讓精選文章可以在每個分頁被找到,但不會把一般列表的數量和分頁搞亂。第 2 頁及後續頁面會再次顯示同一組精選文章;它們不會因此占用一般列表的頁數或項目。
如果只有精選文章、沒有一般文章,列表仍然有正式內容,但一般區塊不會為了填滿畫面複製卡片。空狀態則只在整個語言沒有可發布文章時出現。
精選不等於首頁置頂
首頁目前直接取該語言最新最多三篇正式文章。它使用的是發布日期排序結果,沒有另外把 featured 文章搬到首頁最前面。
這代表同一個 metadata 在不同頁面可能有不同責任:
- Notes 列表用它建立精選區塊。
- 首頁用最新排序顯示最近的文章。
- 文章頁和 sitemap 只關心文章是否符合正式輸出條件。
這不是資料不一致,而是頁面任務不同。精選標記目前是列表呈現的編輯訊號,不是整個網站的全域置頂命令。
精選區塊目前沒有手動順序
精選集合仍然沿用公開查詢的時間和 stableId 排序。現在的 metadata 只有布林值,沒有另外的 featuredOrder、權重或固定置頂時間。
因此,標記兩篇精選文章時,系統能知道它們都應該出現在精選區塊,卻不能從 frontmatter 表達「這篇一定在另一篇之前」。如果將來需要編輯順序,就要新增清楚的資料契約和驗證,不能把檔案順序或建置讀取順序當成排序依據。
這個限制反而讓目前的行為比較容易理解:
- 發布日期負責時間先後。
featured負責是否進入精選區塊。stableId只在發布時間相同時提供穩定的最後排序。
三者不互相冒充。
為什麼不把精選文章直接塞回一般排序
如果把精選文章直接排到一般列表最前面,會有幾個問題:
- 最新文章和編輯推薦的規則混在一起,讀者無法理解列表順序。
- 精選文章會占用一般分頁的位置,可能讓某些普通文章被推到下一頁。
- 取消精選後,文章的相對位置會突然改變,卻看不出是時間還是編輯標記造成的。
- 多語言版本若精選狀態不同,列表順序可能變成難以解釋的差異。
獨立區塊不是為了做更複雜的首頁,而是讓推薦訊號和時間訊號保持可讀。頁面可以先介紹幾篇編輯想提出的文章,再用一般列表呈現完整的時間序列。
精選的使用條件也要有限制
featured 適合用在值得從列表入口特別介紹的文章,例如代表網站方向、能幫助新讀者理解內容範圍,或雖然不是最新但仍值得先讀的文章。
它不適合被當成以下東西:
- 文章品質的自動評分。
- 搜尋排名或流量的保證。
- 讓沒有發布日期的草稿先曝光的方法。
- 為了讓版面有大卡片而任意標記的欄位。
- 把每一篇文章都標記後形成的另一種普通列表。
精選數量如果變多,讀者就不再感覺它是選擇。到那時要先檢查是否仍然需要精選區塊,而不是只繼續增加布林值。
多語版本要先決定編輯責任
featured 現在是每個語言文章檔案自己的 metadata。未來同一個 stableId 的繁中、英文和日文版本如果有不同的精選狀態,就可能在不同語言列表出現不同的推薦結果。
這不一定是錯誤,但必須是有意識的規則。可以選擇:
- 每個語言獨立編輯精選,尊重不同語言讀者的入口。
- 同一個
stableId共用精選決定,要求翻譯同步更新。 - 先只在有正式內容的語言做精選,不為不存在的翻譯預留標記。
目前程式能處理的是每份文章自己的 featured 值,還沒有把同一 stableId 的跨語言精選一致性做成驗證。若要建立三語共同的精選規則,應先補資料契約,再修改列表和測試。
寫作和驗證時可以分開看兩條排序
新增文章或修改精選狀態時,可以依序檢查:
- 文章是否先通過正式發布條件。
- 不標記精選時,發布時間和
stableId排序是否維持預期。 - 標記精選後,文章是否出現在每個有效分頁的精選區塊。
- 一般列表是否排除精選文章,分頁數量是否仍然正確。
- 首頁是否仍然依最新三篇顯示,而不是意外變成精選排序。
- sitemap 是否只反映正式列表與文章路由,不把 metadata 誤當成新的 URL。
這些檢查可以確認資料欄位被正確使用,但不能回答精選文章對讀者是否真的有幫助。推薦本身仍然是編輯和站主的內容判斷。
精選是編輯語意,時間是發布語意。讓它們各自負責,列表才不需要用一個模糊的「重要程度」欄位同時代替最新、推薦和公開資格。
紀錄範圍
本文根據筆記 schema、公開排序函式、列表元件、分頁路由、首頁查詢與 sitemap 實作整理。它描述目前 featured 和時間排序的工程行為,不宣稱精選文章一定帶來更高閱讀量,也沒有把跨語言精選一致性寫成目前已完成的功能。