打開任何一個 WooCommerce 商品頁,捲到最底下,幾乎都會看到一排「相關商品」。它不是你親手挑的,而是系統自己抓出來的。問題來了:為什麼抓出來的常常不是你想推的那幾件?想換掉它,你在後台翻遍商品編輯頁,卻找不到一個叫「相關商品」的欄位可以填。
這篇要把 WooCommerce 相關商品的運作邏輯講透:系統到底依據什麼決定要顯示哪些商品、為什麼它的排序看起來總是不變、以及當預設結果不滿意時,你能用哪幾種方式手動覆寫。看完你會知道,相關商品其實是一套以分類與標籤為核心的自動推薦機制,而真正的控制權,藏在你對商品分類結構的規劃,以及幾個關鍵的程式 hook 裡。
WooCommerce 相關商品是依據什麼自動產生的
WooCommerce 相關商品是系統根據「商品之間共用的分類與標籤」自動挑選出來的一組推薦,預設顯示在單一商品頁的最下方。你沒有手動指定,它就會自己運算。
運算邏輯的核心很單純:系統會抓出目前這件商品被歸到哪些分類(product category)、貼了哪些標籤(product tag),然後去資料庫裡找其他同樣帶有這些分類或標籤的商品。共用的分類與標籤越多,被視為相關的機率就越高。舉例來說,一件貼了「夏季」「棉質」標籤、歸在「女裝上衣」分類的 T 恤,會優先和同時命中這幾項的商品被湊在一起;只共用一個標籤的商品,相關性權重就比較低。
這裡有個常被忽略的細節:相關商品的挑選同時看分類和標籤,預設兩者都納入。這也是為什麼有些店家覺得相關商品「跑出來的東西很跳」——因為某個跨類別共用的標籤(例如「促銷」「新品」這種貼了一堆商品的萬用標籤)把不相干的品項也拉了進來。
底層負責這件事的函式是 wc_get_related_products(),它的簽名長這樣:
wc_get_related_products( int $product_id, int $limit = 5, array $exclude_ids = array(), array $related_by = array() )
四個參數分別是:要找誰的相關商品、最多回傳幾筆(預設 5)、要排除哪些商品 ID、以及依據哪些條件比對(分類、標籤)。系統就是呼叫這支函式,拿著比對結果去渲染商品頁最下方那一排。
相關商品、追加銷售、交叉銷售的差別在哪
這三個名詞最容易混淆,但它們的產生方式與顯示位置完全不同,搞清楚才知道該動哪一個。
相關商品(Related Products)是自動的,由前面講的分類與標籤運算產生,顯示在單一商品頁底部,你無法在後台直接點選要放哪幾件。
追加銷售(Up-sells)是手動的,你在商品編輯頁親手指定,目的是引導顧客買更高階、更貴的版本。它顯示在商品頁的商品描述下方,常見的用法是把基礎款連到進階款。
交叉銷售(Cross-sells)也是手動的,同樣由你指定,但它顯示在「購物車頁面」,用來推薦和購物車內商品互補的品項,例如買了相機就推記憶卡。
關鍵差異整理如下:
| 類型 | 怎麼產生 | 顯示位置 | 控制權 |
|---|---|---|---|
| 相關商品 | 系統依分類與標籤自動運算 | 單一商品頁底部 | 間接(靠分類標籤規劃) |
| 追加銷售 | 在商品編輯頁手動指定 | 商品頁描述下方 | 完全手動 |
| 交叉銷售 | 在商品編輯頁手動指定 | 購物車頁面 | 完全手動 |
理解這張表,就能解開本文開頭那個困惑:後台之所以找不到「相關商品」欄位,是因為 WooCommerce 原生根本沒有提供手動挑選相關商品的欄位。商品編輯頁「商品資料」區塊裡的「連結商品(Linked Products)」分頁,能填的只有追加銷售與交叉銷售這兩格,它們和那排自動的相關商品是兩回事。想真正換掉自動相關商品,得另尋方法。
為什麼相關商品的排序看起來總是固定不變
相關商品在同一群命中的品項裡是隨機排序的,但你每次重新整理頁面,看到的順序卻往往一模一樣——這不是錯覺,而是快取在作用。
WooCommerce 為了效能,把相關商品的運算結果存進了暫存資料(transient),預設保留一天。資料庫的隨機排序查詢(ORDER BY RAND)本身非常吃資源,命中商品一多就會拖慢頁面,所以系統選擇先算一次、把結果快取起來,後續的訪客都直接讀快取,而不是每次載入都重跑一次隨機運算。這就是為什麼順序看起來被「凍住」了。
這個機制帶來兩個實務影響。第一,當你新增了商品、改了分類或標籤,相關商品區塊可能不會馬上更新,因為它還在讀舊的快取。第二,如果你套用了下面會講到的程式碼修改,卻發現前台沒反應,多半也是快取沒清。
清快取的方式是進到後台「WooCommerce → 狀態 → 工具」,找到「清除暫存資料(Clear transients)」按下去。改完任何相關商品的設定或程式碼,這一步幾乎是必做的驗證動作,否則你會誤以為自己改錯了。
不寫程式,靠分類與標籤規劃間接控制相關商品
既然相關商品的來源是分類與標籤,那麼把商品的分類結構規劃好,就是最不需要技術門檻的控制方式。這是每個店家都該先做的功課。
做法是回到商品編輯頁,在右側的「商品分類」與「商品標籤」欄位,重新整理每件商品的歸類。原則有三個。
第一、分類要依商品本質劃分,例如「女裝上衣」「廚房家電」「戶外裝備」,讓同類商品自然聚在一起。一件商品可以同時歸到多個分類,這會擴大它在不同區塊被推薦的機會。
第二、標籤用來補充分類描述不到的特徵,例如材質「棉質」「防水」、功能「可調節」「可攜帶」、或情境「節慶禮品」「夏季新品」。標籤是跨分類串聯商品的橋樑。
第三、避免使用涵蓋過廣的萬用標籤。前面提過,一個貼在上百件商品上的「促銷」標籤,會把毫不相關的品項全拉進相關推薦裡,反而稀釋了精準度。如果你發現相關商品老是跑出不搭的東西,先檢查是不是有這種萬用標籤在作怪。
規劃分類標籤的好處是一魚兩吃:它不只決定 WooCommerce 眼中的商品關聯,也同時影響搜尋引擎對你商品的理解,以及顧客在站內篩選找貨的順暢度。把這層結構做扎實,往往比急著寫程式更有效。
用程式 hook 手動覆寫相關商品的四種做法
當分類規劃還是無法滿足需求,例如你想強制只推同一主分類、或乾脆指定固定幾件商品時,就得動用 WooCommerce 的 filter 與 action。以下程式碼都應該放進子主題的 functions.php,或包成獨立的站台外掛,不要直接改父主題,否則主題一更新就會被覆蓋掉。
調整相關商品的顯示數量與欄數
預設相關商品顯示 5 筆。想改數量與每列欄數,用 woocommerce_output_related_products_args 這個 filter:
add_filter( 'woocommerce_output_related_products_args', 'custom_related_products_count' );
function custom_related_products_count( $args ) {
$args['posts_per_page'] = 4; // 顯示 4 筆
$args['columns'] = 4; // 排成 4 欄
return $args;
}
posts_per_page 控制總數,columns 控制每列排幾欄,依你版面寬度調整即可。
讓相關商品只依分類比對,關掉標籤
如果標籤造成的雜訊太多,可以關掉標籤比對、只留分類。WooCommerce 提供兩個布林 filter 分別控制:
add_filter( 'woocommerce_product_related_posts_relate_by_tag', '__return_false' );
add_filter( 'woocommerce_product_related_posts_relate_by_category', '__return_true' );
這組設定告訴系統:別管標籤,只用分類來找相關商品。對於標籤貼得很亂、但分類規劃還算清楚的店,這是立竿見影的修法。
強制只推同一主分類的商品
更進一步,若一件商品同時屬於多個分類,你想限定相關商品只來自它的「主分類」,可以用 woocommerce_get_related_product_cat_terms 這個 filter 改寫系統採計的分類清單:
add_filter( 'woocommerce_get_related_product_cat_terms', 'force_related_products_main_category', 10, 2 );
function force_related_products_main_category( $categories, $product_id ) {
$product_categories = wc_get_product_term_ids( $product_id, 'product_cat' );
if ( ! empty( $product_categories ) ) {
$main_category = array( $product_categories[0] ); // 取第一個分類當主分類
return $main_category;
}
return $categories;
}
這段的邏輯是:抓出商品所有分類,只保留第一個當作主分類回傳,於是系統就只會從這個分類裡找相關商品。如果你的店有明確的主分類規則,把取第一個的那行改成你自己的判斷邏輯即可。
直接指定固定的相關商品清單
最徹底的覆寫,是繞過整套自動運算、回傳一組你親手挑的商品 ID。用 woocommerce_related_products filter:
add_filter( 'woocommerce_related_products', 'custom_related_products_list' );
function custom_related_products_list( $related_products ) {
return array( 25, 32, 48 ); // 換成你要推的商品 ID
}
陣列裡填你想顯示的商品 ID,系統就不再自己算,永遠顯示這幾件。這等於把自動的相關商品變成手動指定,補上了原生欄位的缺口。要注意這是全站套用,所有商品頁都會顯示同一組,若要做到「每件商品各自指定」,就得在函式裡依 $product_id 分流,或改用外掛處理。
如果你想做的只是把整排相關商品移除,一行就夠:
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 );
不想碰程式,外掛能做到哪些原生做不到的事
對不想寫程式的店家,相關商品管理類的外掛把上面那些 hook 包成了後台介面,並補上幾個原生與單純改 code 都難以達成的功能。
這類外掛通常提供三種運作模式:完全自訂(用外掛的規則接管推薦)、沿用 WooCommerce 原生邏輯(只能改標題)、以及整個關閉。在自訂模式下,常見的進階能力包括:替「每一件商品」單獨指定推薦清單而不影響其他商品、設定排序方式(依價格、人氣、評分、相關性或隨機)、排除缺貨或缺貨可預購的品項、以及把相關商品以輪播(slider)而非格狀呈現。
其中兩項特別實用。一是「相關性排序」,它會優先顯示來自同一子分類的商品,再往上回到母分類,比原生的隨機排序更貼近顧客當下的瀏覽脈絡(這個排序要生效,得先在外掛裡開啟「依同分類顯示」)。二是「排除缺貨商品」,原生相關商品不會自動濾掉沒貨的品項,靠外掛勾一個選項就能避免顧客點進去才發現買不到。
外掛還常附帶短代碼(shortcode),讓你把相關商品塞進一般頁面或文章裡,這在做促銷落地頁時很方便。要不要為了這些功能裝外掛,取決於你需要的精細度:只是想換數量、關標籤,前面幾段程式碼就夠;若需要逐件商品客製、排序與庫存過濾,外掛會省下不少自己維護程式的成本。
相關商品沒出現,或出現不相關品項時怎麼查
相關商品區塊空白、或推薦的東西牛頭不對馬嘴,通常是三類原因,照順序排查最快。
第一類,沒有可比對的分類或標籤。 如果這件商品根本沒被歸到任何分類、也沒貼標籤,或者它的分類標籤是獨一無二的、沒有別的商品共用,系統自然找不到相關商品,區塊就會空著。解法是回頭補上分類與標籤,並確認至少有其他商品共用。
第二類,佈景主題把區塊拿掉了。 有些主題為了自訂版面,會移除或覆寫 WooCommerce 的相關商品輸出。判斷方法是暫時切換到官方預設主題(例如 Storefront 或 Twenty 系列)看區塊有沒有回來;若回來了,問題就出在原本的主題,得檢查它的模板覆寫或設定。
第三類,被程式碼關掉或快取卡住。 檢查 functions.php 或外掛裡,是不是有人加了 remove_action 把相關商品移除了。若設定看起來都對卻還是沒更新,回到前面講的「WooCommerce → 狀態 → 工具 → 清除暫存資料」清一次快取,讓系統重新運算。
至於「出現不相關品項」,幾乎都指向標籤。回去檢查有沒有萬用標籤把雜訊拉進來,必要時用前面那組 filter 關掉標籤比對、改成只依分類,或強制只推主分類。
把運作邏輯摸清楚之後,相關商品就從一個你管不動的黑盒子,變成可以調校的銷售工具。先從分類與標籤的結構規劃下手,這是零技術門檻又影響最廣的一步;真的需要更精準的控制,再依需求選擇程式 hook 或管理外掛。每次改完別忘了清一次暫存資料,確認前台顯示的就是你預期的那組推薦,這套機制才算真正握在你手裡。