自訂 MemberPress 貨幣格式為無小數點整數顯示

前言

在使用 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);