{"id":291568,"date":"2026-06-14T07:16:49","date_gmt":"2026-06-14T07:16:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/variantninja-bulk-variation-price-editor\/"},"modified":"2026-09-12T09:55:11","modified_gmt":"2026-09-12T09:55:11","slug":"variantninja-bulk-variation-price-editor","status":"publish","type":"plugin","link":"https:\/\/arg.wordpress.org\/plugins\/variantninja-bulk-variation-price-editor\/","author":23468327,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.1","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Bulk Edit Variation Prices for WooCommerce - VariantNinja","header_author":"VariantNinja","header_description":"VariantNinja lets you bulk edit regular and sale prices across all variations of your WooCommerce variable products. Set fixed prices, apply percentage changes, or adjust by a fixed amount in seconds.","assets_banners_color":"1b2744","last_updated":"2026-09-12 09:55:11","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/variantninja-bulk-variation-price-editor\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":10,"downloads":260,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"variationxninja","date":"2026-06-14 07:16:22","revision":3571607},"1.0.1":{"tag":"1.0.1","author":"variationxninja","date":"2026-09-12 09:55:11","revision":3692538}},"upgrade_notice":{"1.0.1":"<p>Fixes successive price saves and adds product pagination and unsaved-change protection.<\/p>","1.0.0":"<p>First public release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3571607,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3571607,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3571607,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3571607,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3571607,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3692538,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"latest\"},\"features\":{\"networking\":true},\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=variantninja-bulk-variation-price-editor\",\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"woocommerce\"},\"options\":{\"activate\":true}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"variantninja-bulk-variation-price-editor\"},\"options\":{\"activate\":true}},{\"step\":\"runPHP\",\"code\":\"<?php\\n\\\/\\\/ For disposable local\\\/Playground sites only. Invoked explicitly, never by the plugin.\\nif ( ! defined( 'ABSPATH' ) ) {\\n    require '\\\/wordpress\\\/wp-load.php';\\n}\\nif ( get_option( 'vninja_demo_seeded' ) ) {\\n    return;\\n}\\n$attribute_id = wc_attribute_taxonomy_id_by_name( 'size' );\\nif ( ! $attribute_id ) {\\n    $attribute_id = wc_create_attribute( array( 'name' => 'Size', 'slug' => 'size', 'type' => 'select' ) );\\n}\\nif ( is_wp_error( $attribute_id ) ) {\\n    throw new Exception( $attribute_id->get_error_message() );\\n}\\nif ( ! taxonomy_exists( 'pa_size' ) ) {\\n    register_taxonomy( 'pa_size', array( 'product' ), array( 'label' => 'Size', 'public' => false ) );\\n}\\n$term_ids = array();\\nforeach ( array( 'Small', 'Medium', 'Large' ) as $name ) {\\n    $term = term_exists( $name, 'pa_size' );\\n    if ( ! $term ) $term = wp_insert_term( $name, 'pa_size' );\\n    if ( is_wp_error( $term ) ) throw new Exception( $term->get_error_message() );\\n    $term_ids[] = (int) $term['term_id'];\\n}\\nforeach ( array( 'Demo Cotton Tee' => 30, 'Demo Pullover Hoodie' => 60 ) as $name => $price ) {\\n    $attribute = new WC_Product_Attribute();\\n    $attribute->set_id( $attribute_id );\\n    $attribute->set_name( 'pa_size' );\\n    $attribute->set_options( $term_ids );\\n    $attribute->set_visible( true );\\n    $attribute->set_variation( true );\\n    $product = new WC_Product_Variable();\\n    $product->set_name( $name );\\n    $product->set_status( 'publish' );\\n    $product->set_attributes( array( $attribute ) );\\n    $product->save();\\n    foreach ( array( 'small', 'medium', 'large' ) as $size ) {\\n        $variation = new WC_Product_Variation();\\n        $variation->set_parent_id( $product->get_id() );\\n        $variation->set_attributes( array( 'pa_size' => $size ) );\\n        $variation->set_status( 'publish' );\\n        $variation->set_regular_price( (string) $price );\\n        if ( 'large' === $size ) $variation->set_sale_price( (string) ( $price - 5 ) );\\n        $variation->save();\\n    }\\n    WC_Product_Variable::sync( $product->get_id() );\\n}\\nupdate_option( 'woocommerce_onboarding_profile', array( 'completed' => true ) );\\nupdate_option( 'woocommerce_coming_soon', 'no' );\\nupdate_option( 'vninja_demo_seeded', true );\\n\"},{\"step\":\"writeFile\",\"path\":\"\\\/wordpress\\\/wp-content\\\/mu-plugins\\\/vninja-demo.php\",\"data\":\"<?php\\nadd_action( 'admin_enqueue_scripts', function () {\\n    wp_add_inline_script( 'vninja-admin', \\\"jQuery(function ($) { $(document).on('ajaxComplete.vninjaDemo', function (event, xhr, settings) { if (typeof settings.data === 'string' && settings.data.indexOf('action=vninja_get_terms') !== -1) { $(document).off('ajaxComplete.vninjaDemo'); $('#vninja-term').val('large'); $('#vninja-load-attr').trigger('click'); } }); $('#vninja-attr').val('pa_size').trigger('change'); });\\\" );\\n}, 100 );\\n\"},{\"step\":\"login\",\"username\":\"admin\"}]}"}},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3571607,"resolution":"1","location":"assets","locale":"","width":2880,"height":1804},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3571607,"resolution":"2","location":"assets","locale":"","width":2880,"height":2080},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3571607,"resolution":"3","location":"assets","locale":"","width":2880,"height":1804}},"screenshots":{"1":"Load variations by attribute or by product from a single screen.","2":"Edit regular and sale prices in the grid, with bulk actions for percentage changes and fixed values.","3":"Filter by attribute to edit matching variations across the whole catalog."}},"plugin_section":[],"plugin_tags":[11143,140536,65874,280350,286],"plugin_category":[45],"plugin_contributors":[267036],"plugin_business_model":[],"class_list":["post-291568","plugin","type-plugin","status-publish","hentry","plugin_tags-bulk-edit","plugin_tags-sale-price","plugin_tags-variable-products","plugin_tags-variation-prices","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-variationxninja","plugin_committers-variationxninja"],"banners":{"banner":"https:\/\/ps.w.org\/variantninja-bulk-variation-price-editor\/assets\/banner-772x250.png?rev=3571607","banner_2x":"https:\/\/ps.w.org\/variantninja-bulk-variation-price-editor\/assets\/banner-1544x500.png?rev=3571607","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/variantninja-bulk-variation-price-editor\/assets\/icon.svg?rev=3571607","icon":"https:\/\/ps.w.org\/variantninja-bulk-variation-price-editor\/assets\/icon.svg?rev=3571607","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/variantninja-bulk-variation-price-editor\/assets\/screenshot-1.png?rev=3571607","caption":"Load variations by attribute or by product from a single screen."},{"src":"https:\/\/ps.w.org\/variantninja-bulk-variation-price-editor\/assets\/screenshot-2.png?rev=3571607","caption":"Edit regular and sale prices in the grid, with bulk actions for percentage changes and fixed values."},{"src":"https:\/\/ps.w.org\/variantninja-bulk-variation-price-editor\/assets\/screenshot-3.png?rev=3571607","caption":"Filter by attribute to edit matching variations across the whole catalog."}],"raw_content":"<!--section=description-->\n<p>Updating prices on variable products in WooCommerce means opening each product, expanding the variations panel, and editing one row at a time. With a few products that's fine. With a catalog full of sizes and colors it turns into an afternoon.<\/p>\n\n<p>Bulk edit variation prices with VariantNinja, a variation price editor for WooCommerce. It puts the prices you need to change into a single editable grid. Pick a product or an attribute, edit the cells, and save. The plugin only writes back the rows you actually touched.<\/p>\n\n<h4>Finding the variations<\/h4>\n\n<p>There are two ways to load variations into the grid:<\/p>\n\n<p>Filter by product searches for one variable product and lists all of its variations. Use this when you want to reprice a single item across its sizes and colors.<\/p>\n\n<p>Filter by attribute loads every variation in your store that matches an attribute term, such as Size: Large or Color: Navy. This is how you make catalog-wide changes without opening each product.<\/p>\n\n<h4>Editing<\/h4>\n\n<p>Prices open in a grid with a column for the regular price and a column for the sale price. Click a cell, type a value, move on. Rows you've changed stay highlighted so it's clear what will be saved, and nothing is written until you choose to save.<\/p>\n\n<h4>Bulk actions<\/h4>\n\n<p>When you want to move a lot of prices at once, the action bar applies to every row in the current view:<\/p>\n\n<ul>\n<li>Increase or decrease all regular prices by 10%<\/li>\n<li>Set every regular price to a fixed value<\/li>\n<li>Set every sale price to a fixed value<\/li>\n<li>Clear all sale prices<\/li>\n<\/ul>\n\n<p>You can still fine-tune individual cells afterwards before saving.<\/p>\n\n<h4>Good to know<\/h4>\n\n<ul>\n<li>Variations load 100 per page, so large catalogs stay responsive.<\/li>\n<li>Only changed rows are sent when you save, which keeps writes fast and avoids touching prices you didn't edit.<\/li>\n<li>WooCommerce price caches are cleared after a save, so the new prices show up on the storefront right away.<\/li>\n<li>Declares compatibility with WooCommerce High-Performance Order Storage (HPOS).<\/li>\n<li>Everything runs inside wp-admin over standard AJAX. No external services, no accounts, nothing leaves your server.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>, or install it from the Plugins screen in your WordPress admin.<\/li>\n<li>Activate it through the Plugins screen.<\/li>\n<li>Open WooCommerce &gt; VariantNinja and load a product or an attribute to start editing.<\/li>\n<\/ol>\n\n<p>WooCommerce must be installed and active.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20many%20variations%20can%20it%20handle%3F\"><h3>How many variations can it handle?<\/h3><\/dt>\n<dd><p>Both product and attribute filters load up to 100 variations per page over AJAX. Load and save times depend on your store and hosting. Page through the results or narrow the view with an attribute filter.<\/p><\/dd>\n<dt id=\"can%20i%20change%20prices%20across%20several%20products%20at%20once%3F\"><h3>Can I change prices across several products at once?<\/h3><\/dt>\n<dd><p>Yes. Use Filter by attribute and pick a term such as Color: Red. Every matching variation in the store loads into one grid, regardless of which product it belongs to.<\/p><\/dd>\n<dt id=\"if%20i%20only%20edit%20regular%20prices%2C%20will%20my%20sale%20prices%20change%3F\"><h3>If I only edit regular prices, will my sale prices change?<\/h3><\/dt>\n<dd><p>VariantNinja sends only the price fields you edited. WooCommerce still applies its normal price validation and sale rules. The grid refreshes with the saved values after each save.<\/p><\/dd>\n<dt id=\"how%20do%20i%20change%20variation%20prices%20in%20bulk%20across%20multiple%20pages%3F\"><h3>How do I change variation prices in bulk across multiple pages?<\/h3><\/dt>\n<dd><p>Load a product or attribute, apply a bulk action to the current page, and save. Repeat on the next page. Bulk actions affect only the visible page, not every matching variation in the catalog.<\/p><\/dd>\n<dt id=\"can%20i%20bulk%20update%20variations%20without%20losing%20unsaved%20edits%3F\"><h3>Can I bulk update variations without losing unsaved edits?<\/h3><\/dt>\n<dd><p>The changed-row count shows how many rows need saving. VariantNinja warns before switching pages, loading another selection, or changing filter tabs when edits are unsaved. Your browser also warns when you leave the page. Save first to keep your changes.<\/p><\/dd>\n<dt id=\"is%20hpos%20supported%3F\"><h3>Is HPOS supported?<\/h3><\/dt>\n<dd><p>Yes. The plugin declares compatibility with WooCommerce High-Performance Order Storage.<\/p><\/dd>\n<dt id=\"does%20it%20send%20any%20data%20off%20my%20site%3F\"><h3>Does it send any data off my site?<\/h3><\/dt>\n<dd><p>No. All editing happens in your WordPress admin through standard AJAX requests. There are no external API calls.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix successive saves restoring earlier price values.<\/li>\n<li>Send only edited price fields and refresh rows with saved values.<\/li>\n<li>Paginate product results at 100 variations per page.<\/li>\n<li>Add changed-row counts, save confirmation, and unsaved-change warnings.<\/li>\n<li>Report individual save errors and detect prices changed since loading.<\/li>\n<li>Clarify that bulk actions apply to the current page.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Load variations by product, or by attribute and term across the catalog.<\/li>\n<li>Editable grid for regular and sale prices with changed-row highlighting.<\/li>\n<li>Bulk actions: +\/-10% on regular prices, clear sale prices, set all regular or sale prices to a fixed value.<\/li>\n<li>Results paginated at 100 per page.<\/li>\n<li>Saves only changed rows and clears WooCommerce price caches afterwards.<\/li>\n<li>HPOS compatible.<\/li>\n<\/ul>","raw_excerpt":"Bulk edit WooCommerce variation prices by product or attribute. Update regular and sale prices in one screen.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/arg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/291568","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/arg.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/arg.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=291568"}],"author":[{"embeddable":true,"href":"https:\/\/arg.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/variationxninja"}],"wp:attachment":[{"href":"https:\/\/arg.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=291568"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/arg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=291568"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/arg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=291568"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/arg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=291568"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/arg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=291568"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/arg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=291568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}