前言
在使用 MemberPress 這類會員付費外掛時,預設的貨幣格式通常會包含小數點,像是「$123.00」。有些商業需求或設計風格希望價格以整數顯示,去除小數點部分。本文示範如何透過 WordPress 的 filter 機制,將 MemberPress 的貨幣格式調整成無小數點的整數顯示,並保留貨幣符號原本的位置。
這篇文章適合對 WordPress 外掛開發有基礎認識,並且需要自訂 MemberPress 付款顯示格式的工程師或自學者。
透過 filter 自訂貨幣格式
MemberPress 提供 mepr_format_currency 這個 filter,可以攔截並修改貨幣字串的輸出。這段程式碼利用匿名函式接收三個參數:
$rstr:原始格式化後的貨幣字串$number:數字部分$show_symbol:是否顯示貨幣符號
接著使用 MemberPress 內建的 MeprUtils::format_currency_float 函式,將數字四捨五入到 0 位小數,轉成字串。
$no_decimals = (string) MeprUtils::format_currency_float((float) $number, 0);
保留貨幣符號原本位置
為了不破壞原本貨幣符號的位置(有些貨幣符號在前,有些在後),程式碼判斷原字串 $rstr 是否以貨幣符號開頭:
if (strpos($rstr, $symbol) === 0) {
return $symbol . $no_decimals;
} else {
return $no_decimals . ' ' . $symbol;
}
這樣可以維持「$123」或「123 $」的格式一致性。
實務應用與注意事項
- 適用於價格不需要小數點顯示的場景,例如整數金額訂閱方案。
- 若未來有多種貨幣符號,需確認
MeprOptions::fetch()取得的符號是否正確。 - 由於是使用匿名函式,若需移除此 filter,需注意無法直接使用
remove_filter。
延伸優化方向
- 可根據不同貨幣類型動態調整小數位數。
- 加入千分位分隔符號增強可讀性。
- 支援多語系貨幣格式。
完整程式碼
<?php
// functions.php 或自訂外掛
add_filter('mepr_format_currency', function($rstr, $number, $show_symbol) {
$mepr_options = MeprOptions::fetch();
// 將數字改成 0 位小數(四捨五入)
$no_decimals = (string) MeprUtils::format_currency_float((float) $number, 0);
if (!$show_symbol) {
return $no_decimals;
}
// 簡單依據原字串是否以貨幣符號開頭,維持原有符號位置
$symbol = $mepr_options->currency_symbol;
if (strpos($rstr, $symbol) === 0) {
// 原本是「$123.00」這種前置符號
return $symbol . $no_decimals;
} else {
// 原本是「123.00 $」這種後置符號
return $no_decimals . ' ' . $symbol;
}
}, 10, 3);