Bulk price edit
The support doesn work on Saturdays and Sundays, so some Friday requests can be answered on Monday. If you have problems with registration ask help on contact us page pleaseIf you not got email within 24~36 business hours, firstly check your spam box, and if no any email from the support there - back to the forum and read answer here. DO NOT ANSWER ON EMAILS [noreply@pluginus.net] FROM THE FORUM!! Emails are just for your info, all answers should be published only here.
The support doesn work on Saturdays and Sundays, so some Friday requests can be answered on Monday.
Quote from info@zgruzie.cz on September 13, 2026, 18:35Hi, we use on our web Bundle products (via plugin https://wpclever.net/downloads/product-bundles/ )
But in Bulk Bear it is not possible to change their prices. Is it posisble to add support of this plugin as well and change discount % at least?
Hi, we use on our web Bundle products (via plugin https://wpclever.net/downloads/product-bundles/ )
But in Bulk Bear it is not possible to change their prices. Is it posisble to add support of this plugin as well and change discount % at least?
Quote from Alex Dev on September 14, 2026, 11:26Hello
Yes, this is possible right now, without any changes on our side. Let me explain how bundle pricing works, because it is the reason the standard price fields do not help you.
A bundle product does not store its own price while auto calculation is enabled. The bundle plugin computes the regular price from the bundled items on the fly, and the only things you can actually change are the discount settings, which are stored as ordinary product meta:
woosb_discount - discount in percent
woosb_discount_amount - discount as a fixed amount (it takes priority over the percent value, so keep it empty if you want to use percent)
woosb_disable_auto_price - on or off; when it is on, the bundle uses its own Regular price and Sale price, and then the usual BEAR price fields work as with any simple productSo for your case, open BEAR, go to the Meta Fields tab and add a field with meta key woosb_discount, title for example Bundle discount, type number. Save, and the column appears in the products table. From there you can edit it inline for a single bundle, or select bundles and use Bulk Edit on that column, including the percent and increase or decrease operations.
One important addition. The bundle plugin caches the calculated price in the _price meta and refreshes that cache only when one of the bundled child products is saved, not when the bundle itself is saved. This is their protection against recursion. As a result, after changing the discount in bulk the shop pages may keep showing the previous price until the bundle is re-saved.
To avoid that, add this small snippet to your site, for example as a mu-plugin file in wp-content/mu-plugins/, or through your child theme functions.php:
add_action('woocommerce_update_product', function ($product_id) { // Refresh cached bundle prices after the bundle itself has been edited if (!function_exists('WPCleverWoosb')) { return; } $product = wc_get_product($product_id); if (!$product || !$product->is_type('woosb') || $product->is_fixed_price()) { return; } WPCleverWoosb()->recalculate_bundle_price($product); }, 20);
BEAR fires woocommerce_update_product after every edit, single and bulk alike, so with this snippet in place the bundle price is recalculated and the product transients are cleared immediately after your bulk run.
Please test it on a staging copy first, and let me know how it goes.
Best regards,
Alex
Hello
Yes, this is possible right now, without any changes on our side. Let me explain how bundle pricing works, because it is the reason the standard price fields do not help you.
A bundle product does not store its own price while auto calculation is enabled. The bundle plugin computes the regular price from the bundled items on the fly, and the only things you can actually change are the discount settings, which are stored as ordinary product meta:
woosb_discount - discount in percent
woosb_discount_amount - discount as a fixed amount (it takes priority over the percent value, so keep it empty if you want to use percent)
woosb_disable_auto_price - on or off; when it is on, the bundle uses its own Regular price and Sale price, and then the usual BEAR price fields work as with any simple product
So for your case, open BEAR, go to the Meta Fields tab and add a field with meta key woosb_discount, title for example Bundle discount, type number. Save, and the column appears in the products table. From there you can edit it inline for a single bundle, or select bundles and use Bulk Edit on that column, including the percent and increase or decrease operations.
One important addition. The bundle plugin caches the calculated price in the _price meta and refreshes that cache only when one of the bundled child products is saved, not when the bundle itself is saved. This is their protection against recursion. As a result, after changing the discount in bulk the shop pages may keep showing the previous price until the bundle is re-saved.
To avoid that, add this small snippet to your site, for example as a mu-plugin file in wp-content/mu-plugins/, or through your child theme functions.php:
add_action('woocommerce_update_product', function ($product_id) {
// Refresh cached bundle prices after the bundle itself has been edited
if (!function_exists('WPCleverWoosb')) {
return;
}
$product = wc_get_product($product_id);
if (!$product || !$product->is_type('woosb') || $product->is_fixed_price()) {
return;
}
WPCleverWoosb()->recalculate_bundle_price($product);
}, 20);
BEAR fires woocommerce_update_product after every edit, single and bulk alike, so with this snippet in place the bundle price is recalculated and the product transients are cleared immediately after your bulk run.
Please test it on a staging copy first, and let me know how it goes.
Best regards,
Alex
Quote from info@zgruzie.cz on September 14, 2026, 12:02Thanks for such perfect answer!
And this will aplly change to another language product versions as well right? (WPML)
Thanks for such perfect answer!
And this will aplly change to another language product versions as well right? (WPML)
Quote from Alex Dev on September 15, 2026, 20:55Hello
Not automatically, no. With WPML every translation is a separate product with its own meta, so the discount on the English bundle and on the Czech one are two independent values.
There is also a reason why the standard WPML copying will not save you here. WPML copies custom fields marked as Copy when the post goes through the normal save_post process, and bulk editors write meta directly for speed, so that moment never happens. On top of that, WooCommerce Multilingual skips its own product synchronization when the request does not come from a standard product edit screen, which is the case for bulk operations.
Please remove the snippet I sent you yesterday and use this one instead. It does the same recalculation plus the translations part, so having both would just run the same work twice.
So the snippet needs to do that part itself. Please replace the previous version with this one, it now recalculates the bundle price and pushes the discount fields to all translations:
add_action( 'woocommerce_update_product', 'zg_sync_bundle_and_translations', 20 ); function zg_sync_bundle_and_translations( $product_id ) { static $busy = []; if ( isset( $busy[ $product_id ] ) || ! function_exists( 'WPCleverWoosb' ) ) { return; } $busy[ $product_id ] = true; // Fields that define the bundle discount and must be identical in all languages. $fields = [ 'woosb_discount', 'woosb_discount_amount', 'woosb_disable_auto_price' ]; $targets = zg_get_product_translations( $product_id ); // Copy the discount fields from the edited product to its translations. foreach ( $fields as $field ) { $value = get_post_meta( $product_id, $field, true ); foreach ( $targets as $target_id ) { update_post_meta( $target_id, $field, $value ); } // Let WPML handle any field the site owner configured itself. do_action( 'wpml_sync_custom_field', $product_id, $field ); } // Recalculate the bundle price for the product itself and for every translation. array_unshift( $targets, $product_id ); foreach ( $targets as $target_id ) { zg_recalculate_bundle( $target_id ); } unset( $busy[ $product_id ] ); } function zg_get_product_translations( $product_id ) { $result = []; // WPML is optional here, without it the function simply returns an empty list. if ( ! did_action( 'wpml_loaded' ) ) { return $result; } $trid = apply_filters( 'wpml_element_trid', null, $product_id, 'post_product' ); if ( ! $trid ) { return $result; } $translations = apply_filters( 'wpml_get_element_translations', [], $trid, 'post_product' ); foreach ( (array) $translations as $translation ) { if ( ! empty( $translation->element_id ) && (int) $translation->element_id !== (int) $product_id ) { $result[] = (int) $translation->element_id; } } return $result; } function zg_recalculate_bundle( $product_id ) { $product = wc_get_product( $product_id ); if ( ! $product || ! $product->is_type( 'woosb' ) || $product->is_fixed_price() ) { return; } WPCleverWoosb()->recalculate_bundle_price( $product ); // Keep the WooCommerce lookup table in sync, WooCommerce Multilingual does this for its own updates. if ( function_exists( 'wcml_product_data_store_cpt' ) ) { wcml_product_data_store_cpt()->update_lookup_table_data( $product_id ); } wc_delete_product_transients( $product_id ); }How to use it: edit bundles in one language only, normally your default one, and the translations will follow. Editing the same bundle in two languages separately is not needed anymore.
Two honest notes. First, this deliberately forces the same discount into all languages, because a bundle price is calculated from the same child products anyway, so a different discount per language is almost always a mistake. If you really need different discounts per language, remove the copying part and keep only the recalculation. Second, this is a bridge between two plugins that are not ours, so please keep the file where you can find it and re-test it after major WPML or bundle plugin updates.
As always, test on a staging copy first.
Best regards,
Alex
Hello
Not automatically, no. With WPML every translation is a separate product with its own meta, so the discount on the English bundle and on the Czech one are two independent values.
There is also a reason why the standard WPML copying will not save you here. WPML copies custom fields marked as Copy when the post goes through the normal save_post process, and bulk editors write meta directly for speed, so that moment never happens. On top of that, WooCommerce Multilingual skips its own product synchronization when the request does not come from a standard product edit screen, which is the case for bulk operations.
Please remove the snippet I sent you yesterday and use this one instead. It does the same recalculation plus the translations part, so having both would just run the same work twice.
So the snippet needs to do that part itself. Please replace the previous version with this one, it now recalculates the bundle price and pushes the discount fields to all translations:
add_action( 'woocommerce_update_product', 'zg_sync_bundle_and_translations', 20 );
function zg_sync_bundle_and_translations( $product_id ) {
static $busy = [];
if ( isset( $busy[ $product_id ] ) || ! function_exists( 'WPCleverWoosb' ) ) {
return;
}
$busy[ $product_id ] = true;
// Fields that define the bundle discount and must be identical in all languages.
$fields = [ 'woosb_discount', 'woosb_discount_amount', 'woosb_disable_auto_price' ];
$targets = zg_get_product_translations( $product_id );
// Copy the discount fields from the edited product to its translations.
foreach ( $fields as $field ) {
$value = get_post_meta( $product_id, $field, true );
foreach ( $targets as $target_id ) {
update_post_meta( $target_id, $field, $value );
}
// Let WPML handle any field the site owner configured itself.
do_action( 'wpml_sync_custom_field', $product_id, $field );
}
// Recalculate the bundle price for the product itself and for every translation.
array_unshift( $targets, $product_id );
foreach ( $targets as $target_id ) {
zg_recalculate_bundle( $target_id );
}
unset( $busy[ $product_id ] );
}
function zg_get_product_translations( $product_id ) {
$result = [];
// WPML is optional here, without it the function simply returns an empty list.
if ( ! did_action( 'wpml_loaded' ) ) {
return $result;
}
$trid = apply_filters( 'wpml_element_trid', null, $product_id, 'post_product' );
if ( ! $trid ) {
return $result;
}
$translations = apply_filters( 'wpml_get_element_translations', [], $trid, 'post_product' );
foreach ( (array) $translations as $translation ) {
if ( ! empty( $translation->element_id ) && (int) $translation->element_id !== (int) $product_id ) {
$result[] = (int) $translation->element_id;
}
}
return $result;
}
function zg_recalculate_bundle( $product_id ) {
$product = wc_get_product( $product_id );
if ( ! $product || ! $product->is_type( 'woosb' ) || $product->is_fixed_price() ) {
return;
}
WPCleverWoosb()->recalculate_bundle_price( $product );
// Keep the WooCommerce lookup table in sync, WooCommerce Multilingual does this for its own updates.
if ( function_exists( 'wcml_product_data_store_cpt' ) ) {
wcml_product_data_store_cpt()->update_lookup_table_data( $product_id );
}
wc_delete_product_transients( $product_id );
}How to use it: edit bundles in one language only, normally your default one, and the translations will follow. Editing the same bundle in two languages separately is not needed anymore.
Two honest notes. First, this deliberately forces the same discount into all languages, because a bundle price is calculated from the same child products anyway, so a different discount per language is almost always a mistake. If you really need different discounts per language, remove the copying part and keep only the recalculation. Second, this is a bridge between two plugins that are not ours, so please keep the file where you can find it and re-test it after major WPML or bundle plugin updates.
As always, test on a staging copy first.
Best regards,
Alex
