WooCommerce 商品頁加客製欄位:讓客人填刻字內容、自動加價、寫進訂單

WooCommerce 商品頁加客製欄位:讓客人填刻字內容、自動加價、寫進訂單

最後更新:2026/10/13

賣皮件、木作、銀飾的手作品牌,常常有「可以刻字」的服務。很多臺北的工作室做法是:客人先下單,再私訊告訴你要刻什麼。結果訂單一多,私訊和訂單對不起來,刻錯字只能自己吸收。

比較好的做法,是讓客人在商品頁就把刻字內容填好,跟著訂單一起進來。這篇用刻字當例子,一步一步在 WooCommerce 的商品頁加一個欄位。同樣的做法也能用在賀卡內容、指定送達日期、印在杯子上的名字。

不想自己改?把這篇交給 AI

把這篇的網址(或全文)連同下面這段話貼給 AI:

我的網站是 WordPress,有裝 WooCommerce。我想照下面這篇文章,在商品頁加一個客製欄位(例如刻字),客人填的內容要檢查字數、有填才加價,並寫進購物車和訂單。
請先問我:欄位要叫什麼、字數限制、要加價多少、哪些商品要有這個欄位。
問清楚之後,再一步一步告訴我:要用哪一段程式碼、貼在哪裡、哪些地方要換成我自己的資料,以及改完怎麼測試。
如果文章的做法不適合我的網站,請直接告訴我原因和替代做法。
文章:(貼上這篇的網址,或整篇內容)

改之前先備份,密碼不要貼給 AI。

整個流程要做哪幾件事

一個客製欄位要能用,要照顧到客人走過的每一站:商品頁要有欄位可以填;按加入購物車時要檢查內容合不合規定;內容要跟著這件商品進購物車;有刻字的要加價;購物車和結帳頁要讓客人看到自己填了什麼;最後寫進訂單,你在後台和通知信裡才看得到。

下面的程式碼就是照這六站寫的,每一段開頭都有編號。程式碼放在 Code Snippets 這類外掛或子主題,放法和備份方式見〈WooCommerce 結帳頁改成台灣習慣〉。

先決定哪些商品可以刻字

不是每件商品都能刻。我們用「商品標籤」來標記:到「商品 > 標籤」新增一個「可刻字」標籤,代稱填 engrave,再把可以刻字的商品都貼上這個標籤。之後要增減,只要在商品編輯頁勾或不勾,不用改程式碼。

完整程式碼

// 哪些商品可以刻字:有「可刻字」標籤(代稱 engrave)的商品
function mimi_can_engrave($product_id) {
    return has_term('engrave', 'product_tag', $product_id);
}

// 1. 商品頁:加入購物車按鈕前面放一個「刻字內容」欄位
add_action('woocommerce_before_add_to_cart_button', function () {
    global $product;
    if (!$product || !mimi_can_engrave($product->get_id())) {
        return;
    }
    echo '<p class="mimi-engrave"><label for="mimi_engrave">刻字內容'
       . '(選填,最多 10 個字,加 NT$100)</label><br>'
       . '<input type="text" id="mimi_engrave" name="mimi_engrave" maxlength="10"></p>';
});

// 2. 檢查字數
add_filter('woocommerce_add_to_cart_validation', function ($ok, $product_id) {
    $text = trim(wp_unslash($_POST['mimi_engrave'] ?? ''));
    if ($text !== '' && mb_strlen($text) > 10) {
        wc_add_notice('刻字最多 10 個字。', 'error');
        return false;
    }
    return $ok;
}, 10, 2);

// 3. 把刻字內容存進購物車
add_filter('woocommerce_add_cart_item_data', function ($data, $product_id) {
    $text = sanitize_text_field(wp_unslash($_POST['mimi_engrave'] ?? ''));
    if ($text !== '' && mimi_can_engrave($product_id)) {
        $data['mimi_engrave'] = $text; // 內容不同的同一個商品,會變成購物車裡分開的兩項
    }
    return $data;
}, 10, 2);

// 4. 有刻字的品項加價 100(每次都從原價算,不會越加越多)
add_action('woocommerce_before_calculate_totals', function ($cart) {
    foreach ($cart->get_cart() as $item) {
        if (!empty($item['mimi_engrave'])) {
            $base = (float) wc_get_product($item['data']->get_id())->get_price();
            $item['data']->set_price($base + 100);
        }
    }
});

// 5. 購物車、結帳頁顯示刻字內容
add_filter('woocommerce_get_item_data', function ($rows, $item) {
    if (!empty($item['mimi_engrave'])) {
        $rows[] = ['key' => '刻字', 'value' => $item['mimi_engrave']];
    }
    return $rows;
}, 10, 2);

// 6. 存進訂單(後台訂單、通知信都看得到)
add_action('woocommerce_checkout_create_order_line_item',
    function ($line, $cart_key, $values) {
        if (!empty($values['mimi_engrave'])) {
            $line->add_meta_data('刻字', $values['mimi_engrave']);
        }
    }, 10, 3);

幾個容易出錯的地方

欄位上的 maxlength 擋不住所有人。 它只是請瀏覽器幫忙限制,有心人一樣能送出更長的內容,所以第 2 段在伺服器這邊再檢查一次。中文字要用 mb_strlen 算,用一般的 strlen 算,一個中文字會被當成 3 個字。

加價要從原價重新算。 第 4 段每次都先把商品原本的價格抓回來再加 100。購物車在客人改數量、套折價券的時候會重算好幾次,如果寫成「現在的價格加 100」,就會越加越貴。

同一件商品刻不同的字,要分開算。 第 3 段把刻字內容存進購物車之後,WooCommerce 會把「刻 Amy」和「刻 Ben」的同一個商品當成兩項,各自有自己的數量,不會疊在一起。

客人填的內容要先清理。 第 3 段的 sanitize_text_field 會把 HTML 標籤和多餘的空白拿掉,避免有人在欄位裡塞程式碼。

測試結果

我們用一個 450 元的禮盒測試:先填一段超過 10 個字的內容,商品頁跳出「刻字最多 10 個字。」,沒有加進購物車。接著分兩次加入「Amy 生日快樂」和「Ben」,購物車出現兩項禮盒,每一項都是 550 元,下面分別寫著刻字內容。結帳後,後台訂單的兩個品項各自帶著「刻字」這一欄。

傳統購物車和新版的區塊購物車、區塊結帳頁,結果都一樣。區塊購物車也會讀第 5 段的資料,所以不用另外處理。

選項很多的話,用外掛比較省事

刻字只有一個欄位,自己寫很划算。如果你的商品有一長串選項:顏色、尺寸、包裝、加購配件、上傳照片,每一項還有不同的加價,用「商品附加選項」這一類的外掛會比較快,大多可以在後台用表單設定,還能依商品分類套用。挑外掛的時候,記得確認它支援你正在用的購物車類型。

把私訊的工作交給網站

客製化商品最怕溝通出錯。客人自己填、自己確認、跟著訂單一起進來,你出貨前只要對照訂單,就不會再有「我明明說要刻 Amy」的爭議。

如果你的商品有更複雜的客製流程,例如要先看設計稿才付尾款,可以先看〈IG 帳號不是你的資產〉想想網站要做到什麼。MIMI 專做客製化網頁設計,客製功能網站、購物車電商網站都能照你的接單流程規劃。MIMI 提供臺北網頁設計服務,臺北的品牌、工作室可以用電話、Email 直接和設計師討論;費用可以先看首頁的製作費用參考,歡迎聯絡 MIMI。

WooCommerce 訂單通知信怎麼改:每封信什麼時候寄、加一段出貨說明、通知倉庫
WooCommerce 價格改成台灣習慣:去掉小數點、寫成「450 元」、標示含稅

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

我的車
願望清單
最近瀏覽過的
類別