WooCommerce 出貨後給客人物流單號:後台填一次,完成信和會員中心都看得到

WooCommerce 出貨後給客人物流單號:後台填一次,完成信和會員中心都看得到

最後更新:2026/10/15

網店出貨之後,客服最常收到的訊息只有一種:「請問我的貨什麼時候到?」每回一次就要翻出貨單、找單號、貼連結,一天十幾次。WooCommerce 內建的「訂單已完成」通知信只寫了商品和金額,沒有地方放單號,很多店家只好在訂單備註貼單號,客人不一定看得到。

這篇用一段程式碼補上這個缺口:後台訂單頁多一個「出貨資訊」方塊,選物流公司、填單號,把訂單改成已完成按更新,客人收到的完成信裡就有單號和查詢連結,登入會員中心看訂單明細也有。訂單列表多一欄「物流單號」,哪幾張已完成卻沒填單號,一眼就看到。

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

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

我的網站是 WordPress,有裝 WooCommerce。我想照下面這篇文章,在後台訂單填物流公司和單號,讓客人在通知信和會員中心看到。
請先問我:我用哪幾家物流、它們的查詢頁網址是什麼、單號要放在哪一封通知信裡。
問清楚之後,再一步一步告訴我:要用哪一段程式碼、貼在哪裡、哪些地方要換成我自己的資料,以及改完怎麼測試。
如果文章的做法不適合我的網站,請直接告訴我原因和替代做法。
文章:(貼上這篇的網址,或整篇內容)

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

完整程式碼

// 第 77 篇:出貨後給客人物流單號

// 物流公司和查詢頁網址(客人點過去自己貼單號;物流公司如果支援在網址帶單號,寫成 ...?no={no})
function mimi_carriers() {
    return [
        'tcat' => ['name' => '黑貓宅急便', 'url' => 'https://www.t-cat.com.tw/Inquire/Trace.aspx'],
        'hct'  => ['name' => '新竹物流', 'url' => 'https://www.hct.com.tw/Search/SearchGoods_n.aspx'],
        'post' => ['name' => '中華郵政', 'url' => 'https://postserv.post.gov.tw/pstmail/main_mail.html'],
        'cvs'  => ['name' => '超商取貨', 'url' => ''],
    ];
}

function mimi_tracking_html($order) {
    $carrier = $order->get_meta('_mimi_carrier');
    $no      = $order->get_meta('_mimi_tracking_no');
    if (!$no || empty(mimi_carriers()[$carrier])) {
        return '';
    }
    $c    = mimi_carriers()[$carrier];
    $link = $c['url'] ? '<a href="' . esc_url(str_replace('{no}', rawurlencode($no), $c['url'])) . '" target="_blank" rel="noopener">查詢進度</a>' : '';
    return '<p class="mimi-tracking"><strong>出貨資訊:</strong>' . esc_html($c['name']) . ' 單號 <code>' . esc_html($no) . '</code> ' . $link . '</p>';
}

// 1. 後台訂單頁右側多一個「出貨資訊」方塊(新舊兩種訂單畫面都有)
add_action('add_meta_boxes', function () {
    $screen = class_exists('Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController')
        && wc_get_container()->get(Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController::class)->custom_orders_table_usage_is_enabled()
        ? wc_get_page_screen_id('shop-order') : 'shop_order';
    add_meta_box('mimi_tracking', '出貨資訊', function ($post_or_order) {
        $order = $post_or_order instanceof WC_Order ? $post_or_order : wc_get_order($post_or_order->ID);
        $carrier = $order->get_meta('_mimi_carrier');
        echo '<p><label>物流公司<br><select name="mimi_carrier" style="width:100%">';
        foreach (mimi_carriers() as $key => $c) {
            echo '<option value="' . esc_attr($key) . '"' . selected($carrier, $key, false) . '>' . esc_html($c['name']) . '</option>';
        }
        echo '</select></label></p>';
        echo '<p><label>單號<br><input type="text" name="mimi_tracking_no" style="width:100%" value="' . esc_attr($order->get_meta('_mimi_tracking_no')) . '"></label></p>';
        echo '<p class="description">填好單號、把訂單改成「已完成」再按更新,客人會在完成信裡收到。</p>';
    }, $screen, 'side', 'high');
});

// 2. 儲存(優先順序 5:要在 WooCommerce 處理「訂單狀態」之前存好,完成信才帶得到單號)
add_action('woocommerce_process_shop_order_meta', function ($order_id) {
    $order = wc_get_order($order_id);
    if (!$order || !isset($_POST['mimi_tracking_no'])) {
        return;
    }
    $order->update_meta_data('_mimi_carrier', sanitize_key($_POST['mimi_carrier'] ?? ''));
    $order->update_meta_data('_mimi_tracking_no', sanitize_text_field(wp_unslash($_POST['mimi_tracking_no'])));
    $order->save();
}, 5);

// 3. 「訂單已完成」通知信裡,商品表格前面加出貨資訊
add_action('woocommerce_email_before_order_table', function ($order, $sent_to_admin, $plain_text, $email) {
    if ($email && $email->id === 'customer_completed_order' && !$sent_to_admin) {
        echo $plain_text ? wp_strip_all_tags(mimi_tracking_html($order)) . "\n\n" : mimi_tracking_html($order);
    }
}, 10, 4);

// 4. 我的帳戶的訂單明細頁、謝謝頁也顯示
add_action('woocommerce_order_details_after_order_table', function ($order) {
    echo mimi_tracking_html($order);
});

// 5. 後台訂單列表多一欄,一眼看到哪些還沒填單號
add_filter('manage_woocommerce_page_wc-orders_columns', 'mimi_tracking_column');
add_filter('manage_edit-shop_order_columns', 'mimi_tracking_column');
function mimi_tracking_column($cols) {
    $cols['mimi_tracking'] = '物流單號';
    return $cols;
}
add_action('manage_woocommerce_page_wc-orders_custom_column', 'mimi_tracking_column_value', 10, 2);
add_action('manage_shop_order_posts_custom_column', 'mimi_tracking_column_value', 10, 2);
function mimi_tracking_column_value($col, $order_or_id) {
    if ($col !== 'mimi_tracking') {
        return;
    }
    $order = $order_or_id instanceof WC_Order ? $order_or_id : wc_get_order($order_or_id);
    $no    = $order->get_meta('_mimi_tracking_no');
    echo $no ? esc_html((mimi_carriers()[$order->get_meta('_mimi_carrier')]['name'] ?? '') . ' ' . $no) : ($order->has_status('completed') ? '—' : '<span style="color:#b32d2e">未填</span>');
}

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

五段各做了什麼

最上面的 mimi_carriers 是物流公司清單:代稱、名稱、查詢頁網址。黑貓、新竹物流、中華郵政的查詢頁都是客人自己貼單號查,所以連結只到查詢頁;有些物流公司支援在網址後面直接帶單號,把網址寫成 ...?no={no},程式會自動把 {no} 換成單號。超商取貨這種沒有單一查詢頁的,網址留空,客人只會看到單號。

第 1 段在後台訂單編輯頁的右側加一個「出貨資訊」方塊,裡面是物流公司的下拉選單和單號欄位。WooCommerce 的訂單畫面有新舊兩種(新的「高效能訂單儲存」和舊的文章型訂單),這段兩種都支援。

第 2 段負責存檔。這裡有一個順序的細節:WooCommerce 處理「訂單狀態」的那一步排在第 40 順位,狀態一改成已完成,完成信就寄出去了;我們把存單號排在第 5 順位,確保單號先存好、信才寄。我們在測試站第一次是排在後面,結果客人收到的完成信裡沒有單號,調整順序後才正常。

第 3 段把出貨資訊放進客人的「訂單已完成」通知信(繁體中文介面這封信的主旨是「訂單商品已出貨!」),在商品表格的前面;寄給管理員的信不加。純文字版的信也處理了。

第 4 段讓客人登入「我的帳戶」看訂單明細時,表格下面也有同一段出貨資訊,下單完成的謝謝頁也用同一個位置,不過那時候通常還沒填單號,所以謝謝頁多半是空的。

第 5 段在後台「訂單」列表多一欄「物流單號」:填了就顯示「黑貓宅急便 9012345678」,還沒完成的訂單顯示紅字「未填」,已完成卻沒填的顯示「—」。出貨日下午掃一眼這一欄,就知道哪幾張還沒處理。

測試結果

我們在本機測試站建了一張處理中的訂單,用管理員登入後台:

  • 訂單列表多了「物流單號」欄,處理中的訂單顯示紅字「未填」。
  • 訂單編輯頁右側有「出貨資訊」方塊,選黑貓宅急便、填 9012345678、狀態改成已完成、按更新,重新整理後欄位還在。
  • 客人收到主旨「訂單商品已出貨!」的信,內文有「黑貓宅急便 單號 9012345678」和「查詢進度」連結。
  • 客人登入會員中心看那張訂單,表格下面有同一段出貨資訊,連結指到黑貓的查詢頁。
  • 回到訂單列表,那一列顯示「黑貓宅急便 9012345678」。

單號填對地方,客服問題少一半

客人問「貨到哪了」,多半只是想要一個單號和一個可以查的地方。這兩樣東西在出貨那一刻就寫進訂單,客人收信看得到、登入看得到,問的人自然就少。如果你一天出貨幾十件、幾百件,手動填單號也會嫌慢,那時候再考慮接物流公司的系統自動回填;量還小的時候,這一個方塊就夠用。

通知信還能改哪些地方,什麼時候寄哪一封,可以看〈WooCommerce 訂單通知信怎麼改〉;會員中心的訂單頁怎麼整理,看〈WooCommerce「我的帳戶」頁整理〉。

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

WooCommerce 價格跟著匯率、金價自動更新:每天排程抓台銀牌告
WooCommerce 會員資料和通知信的細節:顯示名稱用真名、主旨帶名字、少寄一封信

發佈留言

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

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