找我們做網站
↑
WooCommerce · WooCommerce 客製

WooCommerce「我的帳號」選單客製教學:新增、刪除、排序會員分頁

WooCommerce 客製發布 2026.10.27閱讀約 13 分鐘
WooCommerce「我的帳號」選單客製教學:新增、刪除、排序會員分頁

重點整理
WooCommerce「我的帳號」左側選單可以用 woocommerce_account_menu_items 篩選器刪除、改名與排序;要新增一個全新的分頁,則要用 add_rewrite_endpoint() 註冊端點,再掛上 woocommerce_account_{端點}_endpoint 輸出內容。程式放好之後一定要到「設定 → 永久連結」按一次「儲存設定」,否則新分頁會顯示找不到頁面。這篇用一個約 60 行的小外掛,三個步驟做完。

WooCommerce 內建的「我的帳號」頁面有控制台、訂單、下載、地址、帳戶詳細資料與登出六個項目。對多數台灣商店來說,「下載」用不到(沒有賣數位商品),「地址」這個名稱也不夠直白;有些商店則想多一個分頁,讓會員看到自己的點數、專屬優惠或買過的商品。這篇示範如何不用外掛、只靠幾段程式碼,把會員選單調整成適合自己商店的樣子,並說明最常見的「新分頁 404」問題該怎麼處理。

修改前:預設的「我的帳號」選單長什麼樣子?

先用一般會員的角度登入,打開前台的「我的帳號」頁面。繁體中文版的 WooCommerce 預設會顯示以下六個項目:

修改前的 WooCommerce 我的帳號頁面,左側選單依序為控制台、訂單、下載次數、地址、帳戶詳細資料、登出
修改前的 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:換佈景主題或主題更新時,程式碼才不會跟著消失。做法很簡單:

  1. 在電腦上建立一個檔案,命名為 xue-account-menu.php。
  2. 把下面三個步驟的程式碼依序貼進去,最上面加上外掛標頭。
  3. 用 FTP 或主機的檔案管理員,上傳到 wp-content/plugins/ 資料夾。
  4. 到後台「外掛 → 已安裝的外掛」啟用「我的帳號選單客製」。

檔案開頭的外掛標頭如下,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 筆訂單,訂單很多的老會員也不會拖慢頁面。

步驟四:一定要重新儲存永久連結

三段程式碼都放好、外掛也啟用之後,直接點「買過的商品」,多半會看到下面這個畫面:

外掛啟用但還沒重新儲存永久連結時,點新分頁 /my-account/purchased/ 會出現「找不到符合條件的頁面」
外掛啟用但還沒重新儲存永久連結時,點新分頁 /my-account/purchased/ 會出現「找不到符合條件的頁面」

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

WordPress 後台「設定 → 永久連結」頁面,不用修改任何選項,捲到最下方按儲存設定即可重新產生網址規則
WordPress 後台「設定 → 永久連結」頁面,不用修改任何選項,捲到最下方按儲存設定即可重新產生網址規則

以後只要新增或修改端點代碼,都要再做一次這個動作。如果要把程式交給客戶或做成正式外掛,可以在外掛啟用時自動處理,就不用依賴人工去按:

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 負責新分頁的內容。只要記得最後重新儲存一次永久連結,就能做出符合自己商店需求的會員中心。建議先在測試站完成,確認每個選單項目都點得開,再放到正式網站。

鵠學苑・鵠崙設計鵠崙設計 2014 年成立,專注 WordPress 網站開發,400 多個網站在我們自己的主機上運作。鵠學苑的文章由團隊實際操作後整理,工具與外掛的功能以撰文當時為準。
鵠崙設計

不想自己摸索,
就交給我們做。

外掛設定、主機效能、改版搬家,這裡寫的每一件事,都是我們每天在客戶網站上做的工作。留下需求,1 個工作天內回覆。