BEAR - WooCommerce Bulk Editor and Products Manager Professional

Bulk edit prices per currency in WooCommerce multi-currency shops

To bulk edit prices per currency in WooCommerce, first check whether there is anything to edit. Most multi-currency plugins store one price per product, in the shop's base currency, and convert it for each visitor by exchange rate: the dollar or pound price exists only on the screen. What is stored are fixed prices, the ones you set per product for a currency to override the rate. They are product meta, and BEAR edits them as meta fields: set them, raise them by a percentage, or calculate them from the base price with rounding. The second half of this article covers the opposite problem: the editor showing prices in a converted currency, and why that matters before any percentage run.

Which per-currency prices are stored, and where

PluginWhere fixed prices are storedHow to edit them in BEAR
FOX (WOOCS), fixed prices_woocs_regular_price_USD and _woocs_sale_price_USD, one pair per currency codeNumber meta fields
FOX, GeoIP rules per product_woocs_price_geo_countries, _woocs_regular_price_geo, _woocs_sale_price_geo (arrays)Array view: edit and copy, no percentages
WooCommerce Multilingual (WPML), custom pricesKeys with the currency code at the end, such as _regular_price_EUR, _sale_price_EUR and _price_EURNumber meta fields; keep the active price key in step
Price Based on CountryA regular, a sale and an active price key per pricing zone, named after the zone IDNumber meta fields; keep the active price key in step
Plugins that keep all currencies in one fieldA JSON text or an array per productNot editable with number operations

Confirm the keys on your shop before you attach them. Enter fixed prices by hand on one product, then in BEAR's Meta Fields tab enter its ID in Get meta keys from any product by its ID. For prices set per variation, use the ID of a variation: those prices are stored on each variation, not on the parent. Attach the keys as fields of the type number, give them short titles such as USD regular, save, and switch their columns on in the Settings tab, as the Meta Fields documentation describes.

FOX: bulk edit fixed prices per currency

FOX stores fixed prices only when Is multiple allowed and Individual fixed prices rules for each product are both on in its settings; the product editor then shows a price pair for each currency on simple products and on each variation. The keys are _woocs_regular_price_ and _woocs_sale_price_ followed by the currency code in capitals. The FOX compatibility FAQ shows the same setup step by step.

How FOX reads the values decides what you write:

  • A value above 0 is a fixed price for that currency.
  • An empty value or -1 means no fixed price: FOX converts the base price by the rate. FOX itself saves -1 when the field is left empty in the product editor, which is why the column shows -1 on many products, and set new -1 is the clean way to remove fixed prices in bulk.
  • If a product is on sale in the base currency but has no fixed sale price for USD, FOX uses the fixed regular USD price, and USD visitors see no discount. When you start a sale, set the fixed sale prices too.

Useful runs, each with only one row ticked. For the second and third, filter USD regular from 0.01 first, so that products without a fixed price are left alone.

  • Fix USD prices from the base price. Tick USD regular, set new 1.08 (your rate), and in Selected num fields choose * and regular price. With 99 in the rounding drop-down, a product at 46.00 gets a fixed USD price of 49.99. The price rounding page lists the other endings.
  • USD sale price 20% below the USD regular price. Tick USD sale, set new 0.8, and choose * with USD regular. The formula reads the other field of the same product, so this takes one run.
  • Raise all fixed USD prices by 5%. Tick USD regular and use increase by % 5; repeat with USD sale if sale prices should follow.

For variable products switch on variations on the tools panel, because the fixed prices live on the variations. FOX's GeoIP rules are arrays: attach them with the view array and edit or copy them as described in bulk edit of serialized meta data. FOX's prices per user role are not per currency at all; they are covered in bulk editing wholesale and role prices.

WooCommerce Multilingual and Price Based on Country: keep the active price in step

WooCommerce keeps three price keys per product: _regular_price, _sale_price and _price, the price actually charged, which it recalculates when a product is saved. Plugins that copy this scheme per currency or per zone have their own active price key and update it in their own save routine, in the product editor. When another tool writes only the regular price key, the active key keeps the old number, and the shop and the product edit screen can show different prices.

So change both, in two runs:

  1. Change the regular price key, for example EUR regular with set new or increase by %.
  2. Copy it into the active key: tick EUR price, set new 0, and choose + with EUR regular. For products on sale in that currency, copy from the sale key instead, on a filter EUR sale from 0.01. That filter works for simple products; meta field filters look at parent products only, so check variations on sale by hand.

Then compare one edited product with one you saved by hand, using Get meta keys from any product by its ID for both. If the hand-saved product has an extra key that the edited one lacks, such as WooCommerce Multilingual's _wcml_custom_prices_status, which switches custom prices on for a product, attach it and set it the same way. If the shop also has several languages, remember that each translation is a product with its own meta; bulk editing prices in all WPML languages explains which language BEAR edits and how to carry changes to the translations.

The editor shows converted prices instead of the base currency

Sometimes the Regular price column shows prices in another currency, while a number you type is saved in the base currency. The cause is in how prices are read. BEAR reads the regular and sale price through WooCommerce's product functions, and currency switchers convert prices in exactly those functions. BEAR loads the table and runs bulk edits through admin-ajax.php, and many switchers convert prices in such requests, because the shop's own cart uses them too. Many also remember the currency you last chose on the shop front, in a cookie or session that your admin requests carry, which is why the column can switch currency one day without any settings change.

With FOX this is handled: on the editor page BEAR switches FOX back to the base currency and removes FOX's conversion filters. With other switchers it depends on the switcher. It is not only a display problem: increase by % and decrease by % on the regular and sale price start from the number BEAR reads, so a converted price plus 10% would be saved as the new base price. Meta fields, including fixed prices, are not affected, and neither are the values read by Selected num fields: both come straight from the stored meta.

Before a percentage run, compare two or three products in the Regular price column with the General tab of their edit pages. If they differ:

  1. Open the shop front in the same browser, select the base currency in the switcher, and reload BEAR.
  2. If the column still shows converted prices, add the snippet below. It removes price filters only during BEAR's own requests, the same way BEAR's MCP server does for its connections, and leaves the shop and the rest of wp-admin untouched. It has the same effect on B2B plugins that show role prices in the editor.
/*
 * BEAR: read product prices without conversion or role-price filters during
 * the bulk editor's own requests, so the price columns and percentage
 * operations use the stored base prices.
 * Child theme functions.php or a code snippets plugin.
 */
add_action('admin_init', function () {
    if (!wp_doing_ajax() || empty($_REQUEST['action'])) {
        return;
    }

    $action = sanitize_key(wp_unslash($_REQUEST['action']));
    if (0 !== strpos($action, 'woobe_')) {
        return;
    }

    $hooks = array(
        'woocommerce_product_get_price',
        'woocommerce_product_get_regular_price',
        'woocommerce_product_get_sale_price',
        'woocommerce_product_variation_get_price',
        'woocommerce_product_variation_get_regular_price',
        'woocommerce_product_variation_get_sale_price',
    );

    foreach ($hooks as $hook) {
        remove_all_filters($hook);
    }
}, 999);

Reload BEAR and compare again. If a switcher still converts, it applies its rates somewhere else; ask its authors how to turn conversion off on admin pages.

Before a bulk run on per-currency prices

  • The keys are confirmed with Get meta keys from any product by its ID, on a variation for variation prices.
  • The fixed price columns have the type number and are switched on.
  • For WooCommerce Multilingual and Price Based on Country, the active price key is updated in a second run.
  • The Regular price column matches the product edit pages before any percentage run.
  • A wrong run is reverted in the History tab rather than corrected with an opposite percentage.

If your currency plugin stores prices in a way not listed here, post its name and a product ID on the BEAR support forum.