0%

正威網路行銷工作室,專注於基隆、台北與全台客製化網頁設計,提供專業 RWD 響應式、SEO 搜尋引擎優化、品牌形象設計與網站維護託管服務。

搜尋文章
聯絡資訊
地址基隆市仁二路 220 號 5 樓
追蹤我們

要關閉 WordPress 內建搜尋改用 Google 嗎?可程式化搜尋引擎設定方法與利弊

手機上的搜尋框

這篇舊版教的是:把 WordPress 內建的站內搜尋關掉,改用 Google 的站內搜尋,理由是可以「降低虛擬主機的負擔」。

實際上,大部分網站不需要這樣做。下面先說明原因,再整理真的需要時的正確做法。另外,舊版的程式碼在 PHP 8 會讓網站直接當機,請不要再使用。

大部分網站不需要關閉內建搜尋

WordPress 的站內搜尋,是在資料庫裡比對文章的標題、內文與摘要。文章數量在幾百、幾千篇的網站,搜尋一次的負擔很小,而且訪客真正使用搜尋的次數,通常遠少於一般的瀏覽。

改用 Google 搜尋也有代價:

  • 只搜得到 Google 已經收錄的網頁:新文章要等 Google 收錄之後才找得到;設定為不收錄(noindex)的頁面則永遠找不到。
  • 可能出現廣告:免費版的搜尋結果會顯示 Google 的廣告,你沒辦法完全控制出現什麼內容。
  • 外觀跟網站不一致:只能在 Google 提供的範圍內調整樣式。
  • 多載入 Google 的程式:會用到 Cookie,網站如果需要處理隱私權同意,也要一併考慮。

真正讓主機吃不消的,常常不是真人在搜尋,而是機器人大量亂打搜尋網址(/?s= 後面接一堆垃圾字)。這種情況用 Cloudflare 等防火牆或安全性外掛限制請求頻率,比拿掉整個搜尋功能更有效。新版 WordPress 也會自動在搜尋結果頁加上 noindex,這些頁面不會被搜尋引擎收錄。

什麼情況適合改用 Google?

  • 網站內容非常多,內建搜尋明顯變慢,或結果排序很不理想。
  • 想一次搜尋好幾個網站,例如主站加上另一個部落格子網域。
  • 想讓訪客搜尋到 PDF 文件裡的內容(內建搜尋只搜文章與頁面,不會搜附件檔案的內容)。

如果只是覺得內建搜尋「找不準」,也可以先試試 Relevanssi 這類搜尋強化外掛。它會建立自己的搜尋索引,結果排序比內建的好,而且訪客一樣留在你的網站上。

設定 Google 可程式化搜尋引擎

Google 提供給網站使用的站內搜尋服務,現在叫「可程式化搜尋引擎」(Programmable Search Engine),舊名是「自訂搜尋引擎」。

步驟一:建立搜尋引擎

  1. 用 Google 帳號登入 Programmable Search Engine。
  2. 新增一個搜尋引擎,填入名稱。
  3. 搜尋範圍選擇搜尋特定網站或網頁,輸入 example.com/*(換成你的網域),代表搜尋整個網站。有子網域也要一起搜尋的話,另外把子網域加進去。
  4. 建立完成後,會看到一段程式碼與搜尋引擎 ID,先複製下來。
  5. 控制台的外觀設定(Look and feel)可以調整版面與顏色,之後隨時可以修改。

步驟二:建立搜尋結果頁

到「頁面 → 新增頁面」,標題可以叫「搜尋結果」,網址代稱(slug)設成 site-search。在內容加入一個「自訂 HTML」區塊,貼上下面的程式碼,把 你的搜尋引擎ID 換成步驟一取得的 ID,然後發布頁面:

HTML
<script async src="https://cse.google.com/cse.js?cx=你的搜尋引擎ID"></script>
<div class="gcse-searchresults-only"></div>

gcse-searchresults-only 是「只顯示搜尋結果」的元件,它會讀取網址上的 q 參數自動搜尋,例如打開 /site-search/?q=網頁設計,就會直接顯示「網頁設計」的搜尋結果。

舊版文章用的頁面網址是 search。WordPress 內建搜尋本身也會用到 /search/ 開頭的網址,建議改用 site-search 這類不會混淆的名稱。

步驟三:讓原本的搜尋框改用 Google 結果頁

最簡單的做法是不動主題的搜尋框,只把送出的搜尋轉到剛剛建立的頁面。在子主題的 functions.php(或 Code Snippets 外掛)加入:

PHP
add_action( 'parse_query', function ( $query ) {
    // 只處理前台的主要查詢
    if ( is_admin() || ! $query->is_main_query() || ! $query->is_search() ) {
        return;
    }

    $keyword = wp_unslash( (string) $query->get( 's' ) );
    if ( ! isset( $_GET['s'] ) ) {
        // /search/關鍵字/ 這種網址的關鍵字是編碼過的
        $keyword = urldecode( $keyword );
    }
    $keyword = trim( $keyword );

    $target = home_url( '/site-search/' );
    if ( '' !== $keyword ) {
        $target = add_query_arg( 'q', rawurlencode( $keyword ), $target );
    }

    wp_safe_redirect( $target );
    exit;
} );

這樣一來:

  • 主題原本的搜尋框、搜尋小工具、區塊主題的「搜尋」區塊都不用改,送出後會自動跳到 Google 的搜尋結果頁。
  • 程式在 WordPress 開始查詢資料庫之前就轉走,不會執行內建的搜尋。
  • 後台的搜尋(例如文章列表、媒體庫裡的搜尋)不受影響。

之後想換回 WordPress 內建搜尋,把這段程式碼刪掉就好。

如果完全不需要搜尋功能

有些網站內容不多,根本用不到搜尋框,把它從版面上拿掉就好:

  • 傳統主題:到「外觀 → 小工具」刪除搜尋小工具。
  • 區塊主題:到「外觀 → 編輯器」,在頁首等範本裡刪除「搜尋」區塊。

傳統主題如果把搜尋框直接寫死在版面裡,可以加上這一行,讓它不要輸出:

PHP
add_filter( 'get_search_form', '__return_empty_string' );

舊版程式碼的問題

  • create_function() 在 PHP 8 已經被移除,放進去網站會直接出現嚴重錯誤。
  • $query->query_vars[s] 少了引號,PHP 8 會把 s 當成未定義的常數而出錯。
  • 搜尋框的 CSS 是針對特定網站的主題寫的,套到別的網站並不適用。

延伸閱讀

網站好不好找,站內搜尋和在 Google 上的能見度一樣重要。正威網路行銷是 25 年經驗的基隆網頁設計工作室,提供 SEO 搜尋引擎優化與網站維護託管,歡迎來聊聊。

分享這篇文章

返回文章列表更多「Wordpress代碼教學」文章

發表留言

還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。

讓我們一起打造
您的專屬網站!