WooCommerce 秤重賣:每 100 克標價、數量可以填小數、訂單寫清楚單位

WooCommerce 秤重賣:每 100 克標價、數量可以填小數、訂單寫清楚單位

最後更新:2026/10/15

茶行的烏龍茶一斤多少錢,肉舖的梅花肉一百克多少錢,五金行的電線一公尺多少錢。這些店搬到網路上,第一個卡住的地方是 WooCommerce 的商品只有「數量」,數量只能填整數,一件就是一件。客人想買 150 克,店家只好在備註欄寫「請填 1.5」,然後人工改金額。

這篇用一段程式碼,讓有需要的商品改成「以單位計價」:商品頁的價格顯示成「NT$120/100 克」,數量欄可以填 1.5,購物車、結帳頁、訂單通知信都標出「100 克 × 1.5」。其他商品不受影響,照常一件一件賣。

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

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

我的網站是 WordPress,有裝 WooCommerce。我想照下面這篇文章,讓一部分商品改成秤重計價:價格顯示「每 100 克多少錢」、數量可以填小數、訂單上標清楚單位。
請先問我:哪些商品要這樣賣、計價單位是什麼、數量要不要允許小數、我的購物車是傳統的還是新版區塊的。
問清楚之後,再一步一步告訴我:要用哪一段程式碼、貼在哪裡、哪些地方要換成我自己的資料,以及改完怎麼測試。
如果文章的做法不適合我的網站,請直接告訴我原因和替代做法。
文章:(貼上這篇的網址,或整篇內容)

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

先決定你的「一個單位」是什麼

做法的核心很簡單:把商品的價格當成「一個單位的價格」,數量就是「幾個單位」。所以第一件事是替每種商品決定單位。茶葉可以是 100 克,肉品可以是 100 克或半斤,電線可以是 1 公尺,布料可以是 1 碼。單位選得小一點,客人就不太需要填小數;100 克的茶葉,客人填 3 就是 300 克,填 15 就是一斤半。

真的需要小數的情況,例如一公斤一個單位、客人要買 1.5 公斤,這篇也有做,只要替那件商品填一個「數量間隔」。

完整程式碼

// 第 73 篇:秤重賣、每 100 克標價、數量可以填小數

// 1. 商品編輯頁多一格「計價單位」(例如 100 克、1 公斤、1 台尺),填了才啟用
add_action('woocommerce_product_options_pricing', function () {
    woocommerce_wp_text_input([
        'id'          => '_mimi_unit',
        'label'       => '計價單位',
        'placeholder' => '例如:100 克',
        'desc_tip'    => true,
        'description' => '填了之後價格會顯示成「NT$120/100 克」,數量就是幾個單位。',
    ]);
    woocommerce_wp_text_input([
        'id'                => '_mimi_qty_step',
        'label'             => '數量間隔',
        'placeholder'       => '1',
        'type'              => 'number',
        'custom_attributes' => ['step' => '0.01', 'min' => '0.01'],
        'desc_tip'          => true,
        'description'       => '例如 0.5 代表可以買 0.5、1、1.5 個單位;留空就是整數。',
    ]);
});
add_action('woocommerce_process_product_meta', function ($post_id) {
    update_post_meta($post_id, '_mimi_unit', sanitize_text_field(wp_unslash($_POST['_mimi_unit'] ?? '')));
    update_post_meta($post_id, '_mimi_qty_step', wc_clean(wp_unslash($_POST['_mimi_qty_step'] ?? '')));
});

function mimi_unit_of($product) {
    $id = $product->get_parent_id() ?: $product->get_id();
    return get_post_meta($id, '_mimi_unit', true);
}

// 2. 價格後面加上單位:NT$120/100 克
add_filter('woocommerce_get_price_html', function ($html, $product) {
    $unit = mimi_unit_of($product);
    return $unit && $html ? $html . '<span class="mimi-unit">/' . esc_html($unit) . '</span>' : $html;
}, 10, 2);

// 3. 數量欄位:依「數量間隔」允許小數,並在欄位前面加「數量(單位)」
add_filter('woocommerce_quantity_input_args', function ($args, $product) {
    $unit = mimi_unit_of($product);
    if (!$unit) {
        return $args;
    }
    $step = (float) get_post_meta($product->get_parent_id() ?: $product->get_id(), '_mimi_qty_step', true);
    if ($step > 0) {
        $args['step']      = $step;
        $args['min_value'] = $step;
    }
    return $args;
}, 10, 2);

// 4. 讓 WooCommerce 接受小數的數量(預設會無條件捨去成整數);沒有設數量間隔的商品還是只能填整數
add_action('init', function () {
    remove_filter('woocommerce_stock_amount', 'intval');
    add_filter('woocommerce_stock_amount', 'floatval');
});
add_filter('woocommerce_add_to_cart_validation', function ($ok, $product_id, $quantity) {
    $step = (float) get_post_meta($product_id, '_mimi_qty_step', true);
    if ($step <= 0 && (float) $quantity != (int) $quantity) {
        wc_add_notice('這件商品的數量只能填整數。', 'error');
        return false;
    }
    return $ok;
}, 10, 3);

// 5. 購物車、結帳頁的商品下面標出「計價單位:100 克 × 1.5」,下單後寫進訂單
add_filter('woocommerce_get_item_data', function ($rows, $cart_item) {
    $unit = mimi_unit_of($cart_item['data']);
    if ($unit) {
        $rows[] = ['key' => '計價單位', 'value' => $unit . ' × ' . wc_format_localized_decimal($cart_item['quantity'])];
    }
    return $rows;
}, 10, 2);
add_action('woocommerce_checkout_create_order_line_item', function ($item, $cart_item_key, $values) {
    $unit = mimi_unit_of($values['data']);
    if ($unit) {
        $item->add_meta_data('計價單位', $unit, true);
    }
}, 10, 3);

// 6. 商品頁多一行提醒:實際出貨以秤重為準
add_action('woocommerce_single_product_summary', function () {
    global $product;
    if ($product && mimi_unit_of($product)) {
        echo '<p class="mimi-unit-note">數量代表幾個「' . esc_html(mimi_unit_of($product)) . '」,實際重量以出貨秤重為準,多退少補。</p>';
    }
}, 25);

程式碼放在 Code Snippets 這類外掛或子主題,放法和備份方式見〈WooCommerce 結帳頁改成台灣習慣〉。

六段各做了什麼

第 1 段在商品編輯頁的「一般」分頁多兩格:「計價單位」和「數量間隔」。只有填了計價單位的商品才會啟用後面的功能,所以禮盒、課程這些一件一件賣的商品完全不用動。數量間隔留空就是整數;填 0.5 代表客人可以買 0.5、1、1.5 個單位,填 0.1 就能買到小數點後一位。

第 2 段把單位接在價格後面。商店列表、商品頁、相關商品都會經過同一個過濾器,所以到處都會顯示「NT$120/100 克」。

第 3 段處理商品頁的數量欄位:有數量間隔的商品,欄位的最小值和每次加減的量都改成你填的數字,瀏覽器的上下箭頭也會跟著一次加 0.5。

第 4 段是整篇的關鍵。WooCommerce 收到數量時,預設會先把它無條件捨去成整數,1.5 會變成 1。我們在測試站就先踩到這個坑:數量欄明明可以填 1.5,加入購物車卻只剩 1。這一段把預設的整數處理換掉,改成接受小數;同時為了不讓其他商品也被填成 2.5 件,沒有設定數量間隔的商品一律擋下小數,並顯示「這件商品的數量只能填整數」。

第 5 段讓購物車和結帳頁在商品名稱下面多一行「計價單位:100 克 × 1.5」,客人一眼看得懂自己買了多少;下單後這個單位也寫進訂單項目,店家出貨、客人收通知信都看得到。

第 6 段在商品頁加一句提醒。秤重商品出貨時多半不會剛好是整數克,先寫清楚「以出貨秤重為準,多退少補」,可以少掉很多客服往返。

測試結果

我們在本機測試站用兩種商品測過:

  • 「手工皂禮盒」設定單位 100 克、數量間隔 0.5:商品頁價格顯示「NT$450.00/100 克」,數量欄的最小值和間隔都是 0.5;用 1.5 加入購物車,新版區塊購物車顯示 1.5、小計 675 元,傳統購物車的數量欄也是 1.5,商品下面都有「計價單位:100 克 × 1.5」。
  • 「精油組合」設定單位 1 公斤、數量間隔留空:價格顯示「NT$980.00/1 公斤」,數量欄還是整數;故意用 2.5 加入購物車,會被擋下來,購物車裡沒有這件商品。

兩種購物車都測過,區塊購物車的加減按鈕一次會加 1 個單位,要填小數的客人直接在欄位裡打字就可以。

價格的小數點和「每公斤多少錢」

台灣的店家多半不想看到「NT$450.00」這種尾數,想改成「450 元」可以看〈WooCommerce 價格改成台灣習慣〉,兩篇的程式碼可以一起用。另外有些客人習慣比「每公斤多少錢」,你可以在商品說明直接寫一行換算,例如「100 克 120 元,等於每公斤 1,200 元」,比再寫程式自動換算省事。

秤重商品的運費通常也跟重量有關,1 公斤和 5 公斤的運費不一樣,這部分看〈WooCommerce 運費依重量、件數、地區計算〉。

論斤賣的店,網站要替你把帳算清楚

實體店的客人說「幫我切 300 塊」,老闆秤一秤、算一算就好;網店沒有老闆站在旁邊,每一步都要讓客人自己看懂。單位寫清楚、數量能填對、訂單上有紀錄,才不會每張單都要打電話確認。

如果你的店賣的是這種論斤論兩的商品,想一次把商品頁、運費和出貨流程規劃好,可以先看〈IG 帳號不是你的資產〉想想網站要做到什麼。MIMI 專做客製化網頁設計,購物車電商網站可以依你的商品設計計價方式。MIMI 提供台灣網頁設計服務,全台灣的店家都可以用電話、Email 直接和設計師討論;費用可以先看首頁的製作費用參考,歡迎聯絡 MIMI。

WooCommerce 商店頁四個小調整:轉到自己做的頁面、型錄商品不給點、顯示價格區間、拿掉重複的小計
WooCommerce 依尺寸計價:客人填寬高,價格自動算、寫進訂單

發佈留言

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

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