管理 WordPress 網站時,管理者或資深讀者有時會需要透過文章 ID 快速定位內容。然而,WordPress 預設的搜尋功能僅針對文章標題與內文進行字串比對,當搜尋框輸入的是純數字 ID 時,系統通常會因為找不到包含該數字的文字內容而回傳無結果,或者列出一堆無關的模糊比對文章。
內容導覽
為什麼預設搜尋找不到 ID?
WordPress 的搜尋邏輯是將輸入的字串帶入 SQL 的 LIKE 語句中。它不會主動判斷該字串是否為資料庫的主鍵(Primary Key)。若要讓搜尋框具備「精確 ID 檢索」的功能,必須在 WP_Query 正式向資料庫發送請求前,利用 Hook 攔截並改寫查詢參數,將文字搜尋轉換為針對特定 ID 的篩選。
實作程式碼
function search_by_post_id($query) {
if ($query->is_search) {
if (is_numeric($query->query_vars['s'])) {
$query->set('post_type', 'any');
$query->set('post__in', array((int)$query->query_vars['s']));
$query->set('s', '');
}
}
return $query;
}
add_filter('pre_get_posts', 'search_by_post_id');程式邏輯拆解
- 掛載查詢攔截器:使用
pre_get_posts動作鉤子,這可以在主查詢執行前修改WP_Query的物件屬性。 - 判定搜尋情境:透過
$query->is_search確保程式碼只在前端執行搜尋時觸發,避免影響到後台選單或其他列表。 - 類型檢查:使用
is_numeric()判斷搜尋字串是否為純數字。如果是純數字,表示使用者可能正在嘗試查詢文章 ID。 - 參數重置:將搜尋類型設定為
any以涵蓋所有文章類型,並利用post__in指定要查詢的文章 ID。最關鍵的一步是將s(原始搜尋字串)清空,否則系統會同時執行 ID 查詢與關鍵字模糊搜尋,導致結果衝突。
踩坑提醒與實務建議
在實務應用中,這種強制轉換邏輯雖然強大,但需要考慮網站整體的資料型態與外掛功能:
- SKU 衝突問題:如果網站是電商類型(如 WooCommerce),且產品的 SKU 恰好設定為純數字,此程式碼會導致搜尋 SKU 時被強制導向 ID 查詢,造成找不到產品。
- 權限安全:
post_type設定為any會檢索到所有類型的內容。如果是具有機密文章的網站,建議根據實務需求限制查詢的文章類型。 - 媒體庫索引:圖片與檔案在 WordPress 中也是一種 Post,若搜尋的 ID 剛好對應到一張圖片,則搜尋結果頁會顯示該媒體檔案。
- 主查詢判定:若頁面中有其他側邊欄搜尋框或自訂的查詢區塊,建議加上
$query->is_main_query()判定,確保只改寫主搜尋結果頁。
實作懶人包,照作就能用
操作步驟
- 安裝並啟用 FluentSnippets 外掛
- 進入外掛介面,點擊「Create Your First Snippet」或「New Snippet」
- 新增一個「PHP」類型的片段
- 將文章中的實作程式碼完整複製並貼入編輯框
- 點擊儲存並啟用(Enable)
- 清除網站所有快取,即可在前端搜尋框輸入文章 ID 測試效果
如果啟用後網站出現異常,回到 Snippets 將該片段停用即可立刻復原,不會影響其他設定。


