WooCommerce 相關商品怎麼運作?演算邏輯與手動覆寫

打開任何一個 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 或管理外掛。每次改完別忘了清一次暫存資料,確認前台顯示的就是你預期的那組推薦,這套機制才算真正握在你手裡。

相關文章
標籤: WooCommerce, WordPress 電商, 相關商品, 商品推薦, functions.php