Change the Currency Symbol in WooCommerce: Custom Signs and Position
To change the currency symbol in WooCommerce when FOX is active, change it in FOX, not in WooCommerce. FOX decides which symbol every price shows, for the base currency too, so a snippet or a WooCommerce setting has no visible effect. Below is how to pick a symbol for a currency, add one that is missing from the list (US$, CA$, HK$, S/, plain text like AED), move it to the left or right of the amount, use an image for signs that have no character yet, and fix a symbol that a theme or a translation plugin keeps replacing.
Where FOX takes the currency symbol from
Every currency in the Currencies tab of the FOX settings (WooCommerce → Settings → Currency) is one row, and two of its columns control the sign: Symbol and Position. On the site, FOX answers WooCommerce's woocommerce_currency_symbol and woocommerce_price_format filters at priority 9999 with the values of the currency the visitor has selected. That has three consequences:
- The symbol and the Currency position in WooCommerce → Settings → General no longer matter. The base currency gets its symbol and position from its FOX row like every other currency.
- A
woocommerce_currency_symbolsnippet with the default priority runs before FOX, and FOX overwrites its result. You do not need that snippet at all. - Everything that prints prices through WooCommerce (product pages, cart, mini cart, checkout, emails sent in that currency) shows the same symbol automatically.
The Symbol column is a drop-down, not a text field. It offers the built-in list of world symbols plus your own custom symbols, so a sign that is not in the list has to be added first.
Add a currency symbol that is not in the list
The built-in list has one sign per currency, which is often not enough: $ means the Argentine peso in Argentina and the US dollar elsewhere, the Indian and Pakistani rupees look alike in many fonts, and some markets prefer a code such as AED or SAR to the local sign. Add your own:
- In the Currencies tab, click Add custom currency symbols. It opens the Options tab at the Custom currency symbols field.
- Type the symbols separated by commas, without spaces after the commas, for example
US$,CA$,HK$,S/,AED. A space after a comma becomes part of the next symbol. - Save the settings. The new symbols are added at the end of every Symbol drop-down only after this save.
- Go back to the Currencies tab, choose the new symbol in the row of the currency (or add the currency first with Append Currency), and save again.
The field takes plain text. Letters, Unicode signs and short codes work; HTML is escaped, so an <img> tag cannot be used as a symbol (see the image method below). Keep a custom symbol in the field as long as a currency uses it: the drop-down offers only listed symbols, so after removing it the next save would give that currency the first symbol of the list instead.
Developers can add symbols in code with the woocs_currency_symbols filter, which receives the whole list:
/*
* FOX: add symbols to the Symbol drop-down of the currency rows.
* Child theme functions.php or a code snippets plugin.
*/
add_filter('woocs_currency_symbols', function ($symbols) {
$symbols[] = 'US$';
$symbols[] = 'CA$';
return $symbols;
});
A currency without an ISO code (a loyalty unit, Telegram Stars) needs more than a symbol, because WooCommerce validates currency codes. That case is covered in custom currency codes.
Currency symbol position: left or right, with or without a space
The Position column of each row has four options:
| Option | Result for 129.99 in PLN |
|---|---|
| $P - left | zł129.99 |
| P$ - right | 129.99zł |
| $ P - left space | zł 129.99 |
| P $ - right space | 129.99 zł |
The space is a non-breaking space, so the symbol never wraps to the next line apart from the amount. Each currency keeps its own position, so one shop can show $1,299.00 and 1 299,00 € side by side. Decimals and separators are set in the same row; see world currency symbols for the conventions of different markets.
If the position is right in FOX but one type of price still shows the sign on the wrong side (often variable product ranges or prices in a page builder widget), that price is not built by WooCommerce's formatter: a theme template or another plugin assembles the string itself. Switch to a default theme such as Storefront on a staging copy, or deactivate the price-related plugins one by one, to find which one. Two settings are often mistaken for the symbol position. The Side tab positions the floating switcher. The Custom price format field in the Options tab wraps the whole formatted price: __PRICE__ (__CODE__) prints the price with its symbol and then the currency code, for example 129.99 zł (PLN), but it does not move the symbol.
Show a different symbol without converting prices
Sometimes the goal is only a different sign for a region, with the same numbers. Add the currency, set its rate to 1, and enter 1 in both the Floor and Ceiling fields of its Rate floor/ceiling column. Automatic rate updates then cannot move the rate away from 1, and switching to that currency changes only the symbol (and the currency code, if the shop lets customers pay in the selected currency).
Symbols without a character: the new dirham sign and other images
Some signs, such as the dirham sign the UAE introduced in 2025, are not yet available as a character that common fonts can display. They exist only as an image. The reliable setup is a text symbol that works everywhere (AED, Dhs) and a small script that replaces that text with the image in the visitor's browser:
/*
* FOX: show an image instead of a text currency symbol.
* Child theme functions.php or a code snippets plugin.
*/
add_action('wp_footer', function () {
?>
<script>
(function () {
var symbolText = 'AED'; // the text symbol selected for the currency in FOX
var imageUrl = '/wp-content/uploads/dirham-sign.svg'; // your image in the Media Library
function swapSymbols() {
document.querySelectorAll('.woocommerce-Price-currencySymbol').forEach(function (el) {
if (el.textContent.trim() === symbolText) {
el.innerHTML = '<img src="' + imageUrl + '" alt="' + symbolText + '" class="fox-symbol-img">';
}
});
}
swapSymbols();
// prices added later: mini cart, checkout updates, AJAX product lists
new MutationObserver(swapSymbols).observe(document.body, {childList: true, subtree: true});
})();
</script>
<style>
.fox-symbol-img { display: inline-block; height: 0.8em; width: auto; margin: 0; vertical-align: baseline; }
</style>
<?php
}, 999);
The script changes every woocommerce-Price-currencySymbol element, which is where WooCommerce puts the sign in every formatted price. The text symbol remains where no browser script runs or where prices are drawn differently: order emails, PDF invoices, the admin, the switcher drop-down (a drop-down option cannot hold an image), and the block-based Cart and Checkout, which print the symbol as part of the amount text. That is why the text symbol should be one your customers understand on its own.
A different symbol per language
On a multilingual site you may want د.إ on the Arabic version and AED on the English one. FOX passes the currency data through the woocs_currency_data_manipulation filter on the front end, so the symbol can be changed per request. The settings page reads the currencies without this filter, so your saved symbols stay untouched.
/*
* FOX: currency symbol per site language (WPML).
* With Polylang use: $lang = function_exists('pll_current_language') ? pll_current_language() : '';
* Child theme functions.php or a code snippets plugin.
*/
add_filter('woocs_currency_data_manipulation', function ($currencies) {
$lang = apply_filters('wpml_current_language', null);
if ($lang === 'ar' && isset($currencies['AED'])) {
$currencies['AED']['symbol'] = 'د.إ';
}
return $currencies;
}, 20);
To switch the currency itself when the language changes, see how to switch currency with language in WPML.
The wrong symbol appears on the site
A translation plugin rewrites the symbol
FOX does not translate symbols. Machine translation plugins and the browser's own translation do: they read SEK as a word and turn it into kr, or translate a text symbol into another language. Exclude prices from translation in the translator's settings (most have a "do not translate" or exclusion option that takes CSS selectors): .woocommerce-Price-amount covers every price WooCommerce prints, .woocs_price_code is the FOX wrapper around product prices, and .woocs_price_info is the FOX price info block.
The symbol shows as an empty box or a different sign
The theme's font has no glyph for that character, and the browser falls back to another font or draws a box. This is common with newer signs and with the rupee and hryvnia. Choose a font that contains the character, or switch the currency to a text symbol such as Rs or UAH through the custom symbols field.
The symbol does not change at all
- The new symbol was typed in the custom symbols field but not selected in the currency row, or the settings were not saved after selecting it.
- A page cache still serves the HTML generated before the change. Purge the site cache and any CDN cache, then check in a private window.
- The theme or a plugin prints prices from its own template with a hard-coded sign. If the sign is right with a default theme, the theme is the cause.
If the symbol is right in the FOX settings and still wrong on a default theme with other plugins disabled, describe the page and the currency on the FOX support forum.