WordPress 搜尋框支援文章 ID 查詢的實作教學

管理 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() 判定,確保只改寫主搜尋結果頁。

實作懶人包,照作就能用

操作步驟

  1. 安裝並啟用 FluentSnippets 外掛
  2. 進入外掛介面,點擊「Create Your First Snippet」或「New Snippet」
  3. 新增一個「PHP」類型的片段
  4. 將文章中的實作程式碼完整複製並貼入編輯框
  5. 點擊儲存並啟用(Enable)
  6. 清除網站所有快取,即可在前端搜尋框輸入文章 ID 測試效果
如果啟用後網站出現異常,回到 Snippets 將該片段停用即可立刻復原,不會影響其他設定。
文章分享