
重點整理
WooCommerce「我的帳號」左側選單可以用 woocommerce_account_menu_items 篩選器刪除、改名與排序;要新增一個全新的分頁,則要用 add_rewrite_endpoint() 註冊端點,再掛上 woocommerce_account_{端點}_endpoint 輸出內容。程式放好之後一定要到「設定 → 永久連結」按一次「儲存設定」,否則新分頁會顯示找不到頁面。這篇用一個約 60 行的小外掛,三個步驟做完。
WooCommerce 內建的「我的帳號」頁面有控制台、訂單、下載、地址、帳戶詳細資料與登出六個項目。對多數台灣商店來說,「下載」用不到(沒有賣數位商品),「地址」這個名稱也不夠直白;有些商店則想多一個分頁,讓會員看到自己的點數、專屬優惠或買過的商品。這篇示範如何不用外掛、只靠幾段程式碼,把會員選單調整成適合自己商店的樣子,並說明最常見的「新分頁 404」問題該怎麼處理。
修改前:預設的「我的帳號」選單長什麼樣子?
先用一般會員的角度登入,打開前台的「我的帳號」頁面。繁體中文版的 WooCommerce 預設會顯示以下六個項目:

每個選單項目背後都有一個「端點」(endpoint)代碼,程式裡要用這些代碼來指定項目,而不是用中文名稱:
| 前台顯示名稱 | 端點代碼 | 網址範例 |
|---|---|---|
| 控制台 | dashboard | /my-account/ |
| 訂單 | orders | /my-account/orders/ |
| 下載次數 | downloads | /my-account/downloads/ |
| 地址 | edit-address | /my-account/edit-address/ |
| 帳戶詳細資料 | edit-account | /my-account/edit-account/ |
| 登出 | customer-logout | /my-account/customer-logout/ |
如果商店有啟用支援儲存卡片的金流,還會多一個「付款方式」(payment-methods)。端點的網址片段可以在「WooCommerce → 設定 → 進階」的「帳號端點」裡修改,這部分可以參考結帳端點、帳號端點設定教學;這篇要處理的是選單本身。
程式碼要放在哪裡?
建議做成一個獨立的小外掛,不要直接寫進佈景主題的 functions.php:換佈景主題或主題更新時,程式碼才不會跟著消失。做法很簡單:
- 在電腦上建立一個檔案,命名為
xue-account-menu.php。 - 把下面三個步驟的程式碼依序貼進去,最上面加上外掛標頭。
- 用 FTP 或主機的檔案管理員,上傳到
wp-content/plugins/資料夾。 - 到後台「外掛 → 已安裝的外掛」啟用「我的帳號選單客製」。
檔案開頭的外掛標頭如下,WordPress 靠這段註解辨識外掛名稱:
<?php
/**
* Plugin Name: 我的帳號選單客製
* Description: 新增「買過的商品」分頁,並調整 WooCommerce 我的帳號選單。
*/如果習慣使用 Code Snippets 這類程式碼片段外掛,也可以把步驟一到三的程式碼(不含外掛標頭)貼成一個片段,效果相同。
步驟一:用 add_rewrite_endpoint 註冊新分頁的網址
WooCommerce 的每個帳號分頁都是一個「端點」,網址長得像 /my-account/orders/。想新增一個「買過的商品」分頁,網址設為 /my-account/purchased/,就要先讓 WordPress 認得 purchased 這個端點:
// 一、註冊新的端點:/my-account/purchased/
add_action( 'init', function () {
add_rewrite_endpoint( 'purchased', EP_ROOT | EP_PAGES );
} );'purchased':端點代碼,同時也是網址片段,只能用英文小寫、數字和連字號。EP_ROOT | EP_PAGES:讓這個端點可以接在「頁面」後面。「我的帳號」本身是一個頁面,所以一定要包含EP_PAGES。
步驟二:用 woocommerce_account_menu_items 刪除、改名、新增與排序
woocommerce_account_menu_items 篩選器會把整個選單交給你,格式是「端點代碼 =>顯示名稱」的陣列。對這個陣列做什麼,前台選單就會變成什麼:
// 二、調整選單:刪除、改名、新增、排序
add_filter( 'woocommerce_account_menu_items', function ( $items ) {
unset( $items['downloads'] ); // 刪除「下載」
$items['edit-address'] = '收件地址'; // 「地址」改名
$items['purchased'] = '買過的商品'; // 新增分頁
// 依照指定順序排列,沒列到的項目(例如登出)接在最後
$order = array( 'dashboard', 'orders', 'purchased', 'edit-address', 'edit-account' );
$sorted = array();
foreach ( $order as $key ) {
if ( isset( $items[ $key ] ) ) {
$sorted[ $key ] = $items[ $key ];
unset( $items[ $key ] );
}
}
return $sorted + $items;
} );這段程式碼一次示範了四種操作:
- 刪除:
unset()拿掉不需要的項目。這裡刪掉「下載」;不想讓會員自己改地址,也可以刪掉edit-address。 - 改名:直接指定新的名稱,例如把「地址」改成「收件地址」。
- 新增:加入一筆「端點代碼 =>名稱」,代碼要跟步驟一註冊的一樣。
- 排序:PHP 陣列的順序就是選單順序。用
$order列出想要的順序,其他沒列到的項目(例如「登出」,或日後外掛新增的項目)會自動接在最後,不會不見。
只做刪除或改名的話,步驟二就夠了,不需要步驟一和步驟三。
步驟三:用 woocommerce_account_{端點}_endpoint 輸出分頁內容
選單有了新項目,還要告訴 WooCommerce 點進去之後要顯示什麼。掛載點的名稱是 woocommerce_account_ 加上端點代碼再加上 _endpoint,所以這裡是 woocommerce_account_purchased_endpoint。下面的範例會找出這位會員「處理中」與「完成」的訂單,列出買過的商品,並附上「再買一次」連結:
// 三、新分頁要顯示的內容
add_action( 'woocommerce_account_purchased_endpoint', function () {
$orders = wc_get_orders( array(
'customer_id' => get_current_user_id(),
'status' => array( 'wc-processing', 'wc-completed' ),
'limit' => 20,
) );
$products = array();
foreach ( $orders as $order ) {
foreach ( $order->get_items() as $item ) {
$product = $item->get_product();
if ( $product ) {
$products[ $product->get_id() ] = $product;
}
}
}
if ( ! $products ) {
echo '<p>目前還沒有購買紀錄。</p>';
return;
}
echo '<p>以下是你最近買過的商品,點「再買一次」就能直接加入購物車。</p><ul>';
foreach ( $products as $product ) {
printf(
'<li><a href="%s">%s</a>(%s) <a class="button" href="%s">再買一次</a></li>',
esc_url( $product->get_permalink() ),
esc_html( $product->get_name() ),
wp_kses_post( $product->get_price_html() ),
esc_url( $product->add_to_cart_url() )
);
}
echo '</ul>';
} );幾個寫法上的重點:
- 只查自己的訂單:
customer_id用get_current_user_id(),會員只會看到自己的資料。「我的帳號」頁面本身就需要登入,沒登入的訪客會看到登入表單。 - 輸出前要跳脫:網址用
esc_url()、文字用esc_html(),避免商品名稱裡的特殊字元破壞版面。 - 同一商品只列一次:用商品 ID 當陣列鍵,買過兩次的商品不會重複出現。
- 限制數量:
'limit' => 20只查最近 20 筆訂單,訂單很多的老會員也不會拖慢頁面。
步驟四:一定要重新儲存永久連結
三段程式碼都放好、外掛也啟用之後,直接點「買過的商品」,多半會看到下面這個畫面:

這不是程式寫錯,而是 WordPress 的網址規則(rewrite rules)有快取。add_rewrite_endpoint() 只是登記新規則,要等規則重新產生才會生效。最簡單的方法是到後台「設定 → 永久連結」,什麼都不用改,直接捲到頁面最下方按「儲存設定」:

以後只要新增或修改端點代碼,都要再做一次這個動作。如果要把程式交給客戶或做成正式外掛,可以在外掛啟用時自動處理,就不用依賴人工去按:
register_activation_hook( __FILE__, function () {
add_rewrite_endpoint( 'purchased', EP_ROOT | EP_PAGES );
flush_rewrite_rules();
} );注意 flush_rewrite_rules() 很耗資源,只能放在啟用時這類「只執行一次」的地方,千萬不要直接寫在 init 裡,否則每次載入頁面都會重建規則。
完成:前台實際看看
重新儲存永久連結後,回到前台重新整理「我的帳號」。左側選單變成:控制台、訂單、買過的商品、收件地址、帳戶詳細資料、登出。「下載次數」已經拿掉,「地址」改名為「收件地址」,新分頁也排在「訂單」後面:

點「買過的商品」,就會顯示這位會員過去訂單裡的商品、價格與「再買一次」連結。示範帳號有兩筆已完成的訂單,三項商品都正確列出:

點「再買一次」會把商品加入購物車並留在原頁面,顧客可以一次加好幾樣再去結帳。
還可以怎麼延伸?
- 只給特定會員看:在步驟二的篩選器裡用
current_user_can()或判斷使用者角色,只有批發會員才加入「批發價目表」分頁。 - 改控制台的歡迎文字:控制台內容可以用
woocommerce_account_dashboard掛載點補上公告,例如會員活動或客服時間。 - 選單加連到外部頁面:用
woocommerce_get_endpoint_url篩選器,把某個選單項目的網址換成其他頁面,例如「聯絡客服」連到 LINE 官方帳號。 - 登出後導向:會員登出後要回到首頁或特定頁面,可以參考登出後導向指定頁面的做法。
常見問題
新分頁一直顯示 404 找不到頁面,怎麼辦?
先到「設定 → 永久連結」按一次「儲存設定」,大多數情況就會解決。如果還是 404,檢查步驟一的端點代碼和步驟二、步驟三是否完全一樣(大小寫、連字號都要相同),以及 add_rewrite_endpoint() 是否有包含 EP_PAGES。
選單改了,前台卻沒有變?
多半是頁面快取造成的。「我的帳號」屬於需要登入的頁面,快取外掛通常預設會排除;如果你的快取設定有快取到它,請把 /my-account/ 加進排除清單,並清除一次快取。
WooCommerce 更新後,這些修改會不見嗎?
不會。程式碼放在獨立的外掛裡,用的是 WooCommerce 官方提供的篩選器與掛載點,WooCommerce 或佈景主題更新都不會覆蓋。只有在直接修改 WooCommerce 外掛檔案的情況下,更新才會把修改洗掉,所以不要那樣做。
結語
「我的帳號」的選單調整可以拆成三件事:woocommerce_account_menu_items 負責選單的刪除、改名與排序;add_rewrite_endpoint() 負責新分頁的網址;woocommerce_account_{端點}_endpoint 負責新分頁的內容。只要記得最後重新儲存一次永久連結,就能做出符合自己商店需求的會員中心。建議先在測試站完成,確認每個選單項目都點得開,再放到正式網站。
