Pro Changelog
What’s new in Advanced Bulk Edit Pro
Every release of WPMelon Advanced Bulk Edit for WooCommerce Pro — new features, improvements, and fixes.
Using the Free version? Its changelog lives on WordPress.org.
Version 1.4.0
Latest
New
11
- The Bulk Edit panel can now save its full set of fields, operations and values as a named preset — including rounding, regex find & replace, attribute options and new categories or terms you typed in — and load it later for any selection. Loading a preset lists anything that no longer exists on the site (removed fields, deleted terms, options no longer offered) instead of silently applying part of it. Presets can be updated, renamed and deleted, and are saved per user.
- New Edit mode toolbar toggle: switch it on, select products, and any cell you edit on one of the selected products is applied to the same field on every other selected product — inline edits, descriptions, images and galleries, categories, tags, attributes, linked products, ACF and custom meta, and custom taxonomies. Products where the field is not editable (for example prices on a variable parent) are skipped and counted in the toast; SKU, slug and variation attributes never fan out. Everything lands as pending changes, so Save, Discard and Operation History work exactly as before.
- Sorting now takes variations into account: a variable product is ranked by the lowest (ascending) or highest (descending) value across itself and its variations, so sorting by Stock Status puts every product with an out-of-stock variation at the top, and a sale price or weight sort no longer drops variable products to the end. Under each product the variations are ordered by the same column, including when a product is expanded and in CSV exports.
- Added a visual editor for Description and Short Description, with Visual and HTML tabs. Format text, lists, headings, links and alignment without touching HTML. Tables, embedded videos and other advanced HTML appear as locked blocks and are kept exactly as they are. The editor opens on the tab you used last.
- Paste from Excel: after applying, every value that could not be pasted is listed with its row, column and reason, and can be copied or downloaded, so you can fix them in your spreadsheet. The paste wizard shows the list on a new Result step; pasting straight into the grid opens a Paste report. After the report closes, the cursor is back on the grid, so you can paste again right away.
- Paste from Excel: the preview now lists every pasted row (200 per page), can show only the rows that could not be matched to a product, and can copy or download them with the reason for each, so you can fix them in your spreadsheet. Rows replaced by a later duplicate are now labelled as such instead of “no key”.
- SKU generator: new {child_num} and {child_alpha} tokens number each product’s variations from 1 / A, restarting for every parent product, e.g. {parent_sku}-{child_alpha} gives 137871-A, 137871-B, …
- The Category filter can now exclude categories: choose “Is none of” in the Category filter to show every product except those in the selected categories. CSV export and saved views keep the choice.
- Custom meta field filters can now find products where the field is empty or not empty. Pick “is empty” or “is not empty” in the field’s filter. A field counts as empty when it has no value saved, or only spaces.
- New “GTIN” column for WooCommerce’s GTIN, UPC, EAN, or ISBN field, on products and variations. Edit it inline or in Bulk Edit, sort by it and include it in CSV exports. Spaces are dropped, and values WooCommerce would silently strip or reject (letters, “N/A”, a GTIN another product already uses) are flagged on the cell instead of saving. Bulk “Set to” only sets a GTIN on one product at a time, since each GTIN must be unique. In Pro, the field is also available in the Selection Manager and Operation History.
- The Selection Manager’s Quick Selects now have “All Products” and “All Variations”. One click selects every product, or every variation, on the current page and replaces the current selection.
Improved
2
- The Stock filter with “Include Variations” on loads faster for “Out of stock” and “On backorder” on large catalogues, for both the page and the “Across all pages” row count.
- Pages load faster with “Include Variations” on, most noticeably with the Stock filter. The “Across all pages” row count in the toolbar’s info popover now loads separately after the page, and it is no longer recounted when you change page or sort.
Fixed
42
- Fixed bulk edits to Cost of Goods reporting success without saving anything when WooCommerce’s Cost of Goods Sold feature is disabled. The save now completes for the other fields and shows a warning that the cost value was skipped because the feature is off.
- Fixed Paste from Excel skipping the Description and Short Description columns as “not editable” — both can now be filled by pasting directly into the grid and by mapping them in the Paste wizard. The wizard’s “Also update loaded variations” option never copies a description onto variations — each variation’s description is only filled when its own row is matched.
- Fixed the grid’s category, stock status, stock quantity, search, description, ID, Cost of Goods, stock-management and sale-date filters leaking into product queries that other plugins run while the grid loads (for example multilingual or membership plugins), which could make those plugins see a wrongly filtered product list. If a plugin rewrites the product query so the grid’s filters and sort can no longer be applied, the grid now shows an explicit error instead of silently listing the whole catalogue.
- Fixed variations with no SKU of their own showing the parent product’s SKU in the grid and in CSV export. Clearing a variation SKU no longer looks like it failed to save, and a variation SKU of “0” is shown as “0”. Pro: in the SKU generator, the
{sku}token on a variation without its own SKU now resolves to an empty string instead of the parent’s SKU. Use{parent_sku}to include the parent product’s SKU. - Creating a new category (or a term in a hierarchical custom taxonomy) from the grid or Bulk Edit with the same name as an existing one under a different parent now creates it under the parent you chose instead of silently reusing the other one.
- Fixed reopening a category, tag or attribute cell that already had an unsaved edit and closing it without changes discarding that unsaved edit. Likewise, applying an unchanged description, image, gallery or linked-products picker no longer stages anything.
- Fixed CSV export labelling attribute columns “(attr) Product Color” while the grid shows “(attr) Color”. Exported attribute headers now match the grid column headers exactly.
- Fixed Paste from Excel leaving attribute columns on “Ignore” in the Map columns step. Attribute columns are now auto-mapped, including sheets exported before this fix with the old “(attr) Product …” headers (English headers only). A saved mapping preset created on such an older sheet still applies to it, but needs re-saving once to match a fresh export.
- Saving a new category (or a term in a hierarchical custom taxonomy) under a parent that was deleted in the meantime now reports an error for that product instead of silently dropping the term and reporting success. A term that still cannot be created at save time is reported as a warning on the saved product. A category or term that was deleted after the grid loaded is likewise reported as a warning on the saved product instead of being dropped silently.
- Fixed attribute cells showing no value for attributes whose name uses non-Latin characters (for example “Цвет”). Parent rows now list the attribute’s terms, variation rows show the selected term instead of “Any”, and CSV exports include these attributes’ values. Clearing such an attribute on a parent product now removes it, and editing it no longer moves it to the end of the product’s attribute list.
- Fixed inline edits to a variation’s attribute not being saved when the attribute name uses non-Latin characters, and duplicate variation combinations on such attributes not being detected. Operation History now captures these attributes correctly too.
- Fixed Paste from Excel presets losing backslashes in column headers or names when saved, renamed or deleted.
- Fixed saved views and the remembered filter draft losing backslashes in filter values (for example a name search for
C:\temp) when saved. Creating, renaming or deleting one view also no longer strips backslashes from the other saved views. - Bulk Edit no longer marks products as edited when an operation leaves their value unchanged (e.g. setting Status to Published on products that are already published), so Save only writes products that actually change.
- Fixed variation names showing a post category’s name instead of the attribute value for custom attributes named like a WordPress taxonomy (for example “Category”).
- Fixed variation names showing the attribute value’s URL slug instead of its name for attributes whose name uses non-Latin characters (for example “Цвет”).
- Fixed the Create Variations wizard failing with an “Invalid combination” error for attributes whose name uses non-Latin characters (for example “Цвет”).
- Variation attribute edits and the Create Variations wizard are now refused with an error when WooCommerce cannot reliably resolve the parent product’s attributes (for example after a plugin changed how slugs are transliterated), instead of overwriting another attribute’s value or creating variations that lose their attribute values.
- Attribute edits and product duplication are now refused with an error when WooCommerce cannot reliably resolve a product’s attributes (for example after a plugin changed how slugs are transliterated), instead of silently converting or dropping them.
- Duplicated products now behave like WooCommerce’s own Duplicate: a copy starts with no star rating or review count instead of showing the original’s, fields that other plugins mark as “don’t copy” (such as sync IDs linking a product to an external catalogue) are no longer copied, and plugins that adjust a duplicate before it is saved now get the chance to — on WooCommerce 10.0–10.2 this also keeps the original’s brands on the copy. Plugins that react to a duplicate (translation or SEO plugins, for example) are now told once a variable product’s copy has its variations, and plugins that ask WooCommerce’s Duplicate to leave variations out are respected.
- When another plugin runs into an error while a duplicate is being finished, the copy is no longer reported as “failed” (which invited duplicating it again) — it shows up in the grid as created, with a warning to check it before duplicating again.
- Duplicated products and variations now get a SKU based on the original (for example ABC-1, ABC-2), the same way WooCommerce’s own Duplicate works, so a copy stays in your results when you search SKUs with “Contains” or “Starts with” — and if no such SKU can be made (for example, when the original’s SKU is too long), the duplicate message tells you. Duplicates also no longer copy the original’s GTIN/EAN, which WooCommerce requires to be unique.
- Duplicating a variable product no longer gets slower with every copy — each duplicated variation used to step past the web address of every earlier copy one at a time, which added up quickly with “Duplicate X times” or a product duplicated again and again.
- Fixed Paste from Excel reporting some values as applied that Save then rejected. A Draft or Pending status pasted onto a variation (including one copied down by the “Also update loaded variations” option), a time pasted into Sale From / Sale To or an ACF date field, a date without a time in an ACF date & time field, and dates or times that don’t exist (such as 2026-02-31 or 25:00) are now skipped and listed in the paste report instead. A Published date pasted with hours and minutes (2026-07-18 10:30) is now accepted, and a Published date pasted without a time keeps the product’s current time instead of resetting it to midnight. “no” and “inactive” pasted onto a variation’s status now disable it.
- Fixed ascending sorts failing with “The response is not a valid JSON response” on sites where another plugin redirects requests that contain an
orderparameter. - Fixed embedded videos, iframes and other HTML being removed from product descriptions and short descriptions when an administrator edited them. Descriptions are now filtered the same way as in WordPress’s own editor. Users who are not allowed to save unfiltered HTML get a warning that lists what was removed.
- Fixed the Description and Short Description grid cells showing codes such as
and running paragraphs together. Bulk edit’s Set, Prepend and Append for these fields now take multi-line text, so line breaks can be entered. - Fixed sorting by price taking minutes to load right after a large product import on big catalogues.
- Fixed the Stock quantity filter with Include variations on showing products that don’t track stock and variable products with no variation in the range, and hiding variations that were in range when their parent product’s own stock was not.
- Paste from Excel and pasting into the grid now work out each pasted column’s decimal separator from its other values. When a column contains a value like 45,89, a value like 17,847 in that column is read as 17.847, not 17847. If a column gives no clue, the decimal separator from your WooCommerce settings is used. If a column mixes comma and dot decimals, values that could be read either way are skipped and reported. Values such as 0,600 are now read as 0.6.
- ACF select, radio and button group fields whose choice values are numbers, such as 92240 or 0 / 1, can now be saved. Before, Save rejected the value as invalid, whether it came from the grid, bulk edit or a paste.
- Searching by description with variations included no longer shows a variable product with no variations under it when the only match was a draft, pending or trashed variation.
- Pressing Esc to close a popover, menu or dialog no longer deselects your rows. Press Esc again to deselect all rows.
- Custom meta and ACF text filters now find values that contain _ or \, and values with a % such as “50%_off” or “100% cotton”. Before, a search containing any of these characters never matched.
- Paste from Excel and pasting into the grid now accept the choice label you see in ACF select, radio and button group columns, such as “Supplier X”, as well as the stored value. If two choices share the pasted label, the cell is skipped and reported instead of guessed.
- The Selection Manager now shows its confirmation messages, such as “Selected 12 products.” after Apply or “No duplicates found by SKU.” after Find Duplicates. Before, these messages never appeared.
- The Stock filter with “Include Variations” on now finds variations that have the selected status even when their parent product has a different one. For example, “Out of stock” now shows the out-of-stock variations of a product that still has other variations in stock. Before, those variations were hidden.
- Fixed the grid still showing values from before a save after reloading, on sites where a page cache (such as LiteSpeed Cache) had already stored the plugin’s responses. The grid now requests fresh data on every load, so no cache purge or URL exclusion is needed.
- Fixed the grid showing values from before a save, after saving or reloading, on sites where LiteSpeed Cache (or another page cache plugin) caches REST API responses for logged-in users.
- Fixed filtered CSV exports ignoring the ID, Description and Short Description filters, so the file could include products the grid did not show.
- Fixed category pickers checking every subcategory when you check a parent category. Each category now checks on its own, so a product can get just the parent, just a subcategory, or any mix. Alt+click (Option+click on a Mac) checks or unchecks a category together with all its subcategories. The category filter is unchanged: ticking a parent still includes its subcategories.
- Fixed slugs being rejected as too long when the only characters past WordPress’s slug length limit are ones WordPress removes anyway, such as a trailing space or punctuation.
Security
1
- Visitors without permission to manage products no longer see the list of sortable column names (including custom field names) in the plugin’s REST API error messages.
Version 1.3.0
New
15
- The CSV export popover now lets you choose the field delimiter — comma (default), semicolon, or tab. Semicolon suits Excel in many European locales; tab-delimited exports download as a .tsv file so spreadsheet apps recognize the format. Your last choice is remembered per user. Multi-value cells (upsell SKUs, attribute terms, gallery URLs) keep their existing separators for WooCommerce importer compatibility.
- While editing a text or number cell, the ↓ and ↑ arrow keys now save the value and move to the cell below or above, spreadsheet-style — landing on an editable cell opens it for typing right away. Pressing Enter also no longer gets stuck when the next row’s cell can’t be edited.
- Flat-price YITH Product Bundles products can now be edited like other products: prices, sale dates, stock, shipping class, cross-sells and other standard fields are editable inline and with the bulk-edit panel. (Bundle contents and YITH-specific settings are still managed in the YITH product editor; bundles using the premium per-item pricing mode keep calculating their price from the bundled items.)
- Added a Save batch size setting (Adaptive / 25 / 50 / 100). Adaptive speeds up large saves by growing the batch size while the server responds quickly, and backs off when it slows down.
- Applying bulk edits to a large selection now shows a busy indicator on the Apply button and over the grid, and repeated clicks can no longer apply the same edits twice.
- Category, tag, attribute and custom taxonomy pickers now have a “Checked / Show all” button that narrows the list to the terms already selected, as in the legacy plugin. It combines with the search box, and newly created terms appear in the checked view.
- The field picker in Bulk Edit (and in the Selection Manager in Pro) can now be driven from the keyboard: arrow keys and Home/End move through the results, Enter picks the highlighted field, and Tab moves on to the next control.
- The Selection Manager’s field dropdown can now be searched by typing, and ACF, custom meta, taxonomy and attribute fields are listed under their own headings instead of one long list.
- Added the product Slug (permalink) field. Show the new Slug column from the column picker (hidden by default), edit slugs inline or with the bulk-edit panel (set, prepend, append, find & replace, clear), and include them in CSV exports. WordPress keeps published slugs unique, so a published product given a slug another product already uses gets a numeric suffix (drafts are not uniquified until they are published), and clearing a slug regenerates it from the title on published products (drafts stay blank until published). Slugs with non-Latin characters are shown in their readable form, and a Find & Replace that would leave a slug empty is rejected rather than silently regenerating the permalink. Slugs that would be too long after URL encoding are rejected with an error instead of being silently cut by WordPress.
- Category, tag, attribute and custom taxonomy pickers now have All / None shortcuts that check or clear every visible term, respecting the active search and Checked-only filter.
- Paste from Excel can now update WooCommerce attribute columns. Map a pasted column onto an
(attr) …column (or paste straight into an attribute cell) with term names such asRed | Blue— the same format the CSV export writes — and the values are matched against the attribute’s existing terms. Unknown terms are reported rather than created, the product’s visibility and “used for variations” settings are kept, variation rows accept a single term from the parent’s options, and attribute columns are never copied to variations by the cascade option. - Paste from Excel now flags Stock Qty values with decimals whose decimal part WooCommerce will drop on save, with a count in the paste report so you know which pasted cells to double-check.
- When a Stock Qty value with decimals (like
30.9) won’t be preserved on save — WooCommerce stores stock as whole numbers unless your store is set up for decimal stock — the grid now highlights the cell and shows a tooltip explaining why, and Bulk Edit shows the same note next to the value and in the applied summary. The change is informational only: your edit still saves, WooCommerce just drops the decimal part. - The Paste from Excel mapping step has new Ignore all and Auto-map buttons. On a wide spreadsheet you can now set every column to Ignore in one click and then pick only the few you actually want to update, and bring the automatic matches back if you change your mind.
- Paste from Excel can now save the column mapping as a named preset. On the mapping step, map your columns once and choose Save as preset…; next time you paste a sheet with the same headers, pick the preset and the key column, every column target and the Format choices are restored — even if the columns are in a different order or the sheet has extra ones. Columns the sheet no longer has are set to Ignore and listed in a note. Presets can be updated, renamed and deleted, and are saved per user.
Improved
12
- Sorting the Regular price column now orders your entire catalogue across every page, instead of only re-ordering the products on the current page. Products are ranked by the price customers actually pay — the sale price while a product is on sale, and the cheapest (or, sorting high to low, the most expensive) variation for variable products. Products with no price set stay at the very end whichever direction you sort.
- Variation rows now show each attribute value in parentheses after the parent product name — e.g. “Nona Fitness Tank (Blue)(L)” — restoring the scannable format from the legacy Advanced Bulk Editor. The name is always built from the variation’s attributes, so all variations display consistently regardless of how many attributes they have or what title WooCommerce stored. CSV exports use the same format.
- After applying a Paste from Excel, the grid now scrolls to the first updated cell and selects all updated rows, so you can immediately see what the paste changed — even on pages with hundreds of rows.
- The Paste from Excel wizard now reads your data the moment you paste it — an instant summary shows how many rows and columns were found, with a preview of the first rows, before you continue to column mapping.
- Saving many products at once is faster — repeated cache and term-count updates are now consolidated once per batch instead of running for every product.
- The Title and SKU filter boxes now grow to fit the search term you type, so longer titles and SKUs are no longer cut off. They start wider than before and stop growing at a sensible width, after which the text scrolls inside the box.
- With “Include variations” on and a stock, backorders, manage-stock, sale-date, cost-of-goods, menu-order or image-uploaded filter active, the grid and the CSV export now load only the variations that can match, instead of every variation of every product on the page. Pages that used to run out of memory on catalogs with many variations load lighter and faster; the rows shown are unchanged. Grid loads, including expanding a product’s variations, also run under the same raised memory and time limits as the CSV export, so raising
WP_MAX_MEMORY_LIMITnow helps large pages. Hosts can switch the pre-filter off with thewcabe_g2_sql_narrow_variationsfilter. - Deleting a saved view now opens a confirmation dialog that names the view, with Delete and Cancel buttons, instead of the two-click “Are you sure?” menu item.
- Sorting any built-in column now orders your entire catalogue across every page, instead of only re-ordering the products on the current page. Previously only Regular price, SKU and Menu order did this, and there was no way to tell which columns did — so an empty-looking first page could mean “not on this page” rather than “no such product”. Products with no value in the sorted column stay at the end whichever direction you sort, and a zero (zero stock, a 0 weight, an unfeatured product) counts as a value, not as empty. Variable products keep showing “Varies” for per-variation fields such as Sale price and sort as empty there; Regular price still ranks them by their variation prices. Because only one column can order the catalogue at a time, holding Shift to stack a second sort is no longer offered, and a saved view that carried more than one sort keeps its primary sort.
- Sorting an ACF or custom-field column now orders your entire catalogue across every page, the same way the built-in columns do, instead of only re-ordering the products on the current page. Choice fields (select, radio, button group) sort by the label you see in the cell, and a choice whose option no longer exists now shows its stored value instead of an empty cell. In a numeric column, anything that is not a number sorts together with the empty values at the end whichever direction you sort. A true/false column ranks a field that was never set, or was left empty by an import, together with the unchecked rows, and a colour or URL value the grid cannot display sorts with the empty cells. Image, file, multi-choice, checkbox, taxonomy, relationship and post-object columns, whose values have no meaningful order, are no longer offered for sorting; a sort saved on one of them earlier is cleared when the layout loads. If you disable a field the grid is currently sorted by, the sort returns to the default order instead of the product list failing to load, and the load-error screen now offers a “Reset sort” button.
- CSV export now lists products in the same order as the grid. Sort a column, then export, and the file follows that order (blank values last, as in the grid); exporting selected rows follows the on-screen order rather than the order the rows were ticked. All-filtered exports without an explicit sort are unchanged.
- Paste from Excel now accepts decimal Stock Qty values such as
30.9or30,9, matching the main grid — useful for stores selling by length, weight or volume. Note that WooCommerce itself stores stock as whole numbers unless your store is set up for decimal stock, so30.9saves as30on a default install. A related change: in a stock column, a value with a single separator is now always read as a decimal, so1,000means one, not a thousand. Grouped values such as1,234,567and1.234,5are unchanged.
Fixed
18
- Fixed price, stock and dimension columns sorting alphabetically instead of numerically — 1001 no longer appears before 11. Rows with no value now stay at the bottom whichever direction you sort.
- Fixed ACF number and range columns, and custom field columns holding numbers, sorting alphabetically instead of numerically.
- Fixed the Product URL filter leaking into product queries run by other plugins during the same request, which could make those plugins see wrongly filtered results.
- Sorting the SKU column now orders the entire catalogue across all pages, matching WooCommerce’s native product list, instead of only re-ordering the products on the current page. Products without a SKU sort last in both directions.
- Fixed variation names showing a raw “–” code instead of the dash when the product title contains ” – ” (e.g. “Fishing hooks – 5pk”). Variation names now use the product title exactly as written, matching the parent row.
- If a save fails part-way through, the editor now checks which changes actually reached the server before offering a retry — avoiding retries of changes already confirmed as saved. Changes that cannot be verified are held back from saving until a “Check again” confirms their state.
- Custom taxonomy, ACF and custom meta columns no longer go missing from the Columns list (and their cell editors no longer fail) when the Pro script finishes loading after the grid has already rendered — e.g. on sites using JS-delay/defer optimization plugins or a slow CDN. Their saved position, width and pinning are restored too, and updating or saving a view before the Pro script has loaded no longer drops those columns from the view. On the same kind of load, saved custom taxonomy / ACF / custom meta filters are now applied to the product list instead of showing unfiltered results (including when the first product request is still running when the Pro script arrives), and the WPML language check that drops filters saved in another editing language still runs — without discarding a view or filter you chose in the meantime, and without marking filters changed in that moment as belonging to an unknown language.
- Filtering by an attribute with “Include variations” on now shows only the variations that have one of the selected values, instead of every variation of each matching product. Variations set to “Any” for that attribute still appear, and attributes that are not used for variations keep showing all variations. CSV export follows the same rule.
- Filtering by an attribute whose name uses non-Latin characters (for example “Цвет” or “尺寸”) now works in the grid and the CSV export. Previously such a filter was silently ignored and every product was shown.
- The Backorders and Manage Stock filters now find variations whose parent product has a different setting when “Include variations” is on. Previously a variation set to “Allow, but notify” was never found if its parent was “Do not allow”. Only the variations that match are shown, and CSV export follows the same rule.
- Fixed size adjustments on text inputs being ignored: the ID filter box, for example, was rendering at the browser’s default width instead of its intended width.
- Fixed the Export popover showing a horizontal scrollbar and clipping its left edge because the Delimiter row was wider than the popover.
- Operation History previews now show stock status, catalog visibility, backorders, product type and yes/no fields with the same readable labels as the grid, instead of raw internal values.
- The CSV export (and now grid loads) raise the PHP execution time limit to 5 minutes only when the host’s limit is shorter. A host that had configured a longer or unlimited execution time for heavy loads keeps that setting instead of being cut back to 5 minutes.
- Fixed the Views menu showing a horizontal scrollbar and cutting off the Save button when creating a new view. The menu is also slightly wider so long view names have more room before truncating.
- Fixed the display-label field in Meta Field Columns becoming invisible for custom meta keys and taxonomies with long names. Each field now shows its controls on a second line, long names are truncated with the full name shown on hover, the dialog is wider, and the field list no longer shows a permanent horizontal scrollbar.
- When loading, duplicating, trashing, deleting or exporting products fails, or a Pro settings or operation-history request fails, the error panel or notice now shows the message returned by the server instead of a generic “An error occurred” or “Failed to …” text. A request the server rejects for an invalid parameter (for example a sort on a column that is no longer available) now names the parameter and the reason.
- Fixed dialogs opening partly off-screen when conflicting admin styles disrupted their positioning, making action buttons difficult to reach.
Version 1.2.0
New
34
- Added Cost of Goods (COGS) as an editable product column when WooCommerce’s Cost of Goods Sold feature is enabled. Edit it inline or with the bulk-edit panel, filter products by a Cost of Goods range, and include it in CSV exports.
- Added a Published on column — show it in the grid, edit its full date and time inline, and bulk-edit it — plus a read-only Modified on column. Both are available in CSV export.
- Products with a future Published on date now appear in the grid as “Scheduled” (and can be filtered by that status) instead of being hidden from the default view.
- Added a PublishPress revisions filter. When the PublishPress Revisions plugin is active, the Filters panel shows a “PublishPress revisions” option (Pending, Scheduled, and Draft revisions) that surfaces your revision posts in the grid — so you can find them and bulk-edit them, including their Published-on dates. Selecting it shows only the matching revisions, without duplicating their published products. Note: while the revisions filter is active, the Type filter is not applied, and combining it with a Category filter may show no results, because revisions don’t always carry product type/category terms.
- The Title filter now matches all words by default, with a choice of how multi-word searches behave. When you type two or more words, a mode dropdown appears: “All words” (the default) finds titles containing every word in any order, “Any word” matches titles containing at least one word, and “Exact phrase” matches the words exactly as typed.
- You can now set a different attribute value for each variation, directly in the grid — for example, tag the smaller sizes as “Toddler” and the larger ones as “Kids”. Expand a variable product, then pick a value (or “Any”) from a variation’s attribute cell and save. Duplicate combinations are blocked. Plugins that read per-variation attributes (such as Google product feeds) pick up the values automatically, because they’re saved the standard WooCommerce way.
- You can now include product attribute columns (such as Color or Size) in the CSV export. Open the Export dialog and tick the attribute columns you want — each cell lists the product’s terms separated by ” | “.
- Your column layout and filters are now remembered automatically across page reloads and navigation — no need to save a view first. If you have a default view, it’s still applied on load; otherwise your last working layout is restored.
- Added a Default view at the top of the Views menu that resets your columns and filters to their defaults in one click. The old per-view “Set as default” star is retired — your working layout now persists on its own, and any existing default view is still applied on load.
- Switching views (or to Default) with unsaved column or filter changes now asks whether to Save, Disregard, or Cancel, so a modified layout isn’t lost by accident. On the Default view the prompt lets you name and save the changes as a new view before switching.
- The Views button now shows “· Modified” when your columns or filters differ from the selected view (or the Default). Use Update to save the changes back to the view, or Revert to discard them; on the Default view, “Save as new view” lets you keep them as a brand-new view.
- Added Menu order as a product column. View it in the grid, edit it inline or with the bulk-edit panel, filter products by a menu order range, sort the whole catalog by menu order, and include it in CSV exports.
- Bulk edits are now recorded locally in your site’s database (30-day retention, pruned automatically), laying the groundwork for the upcoming Operation History feature that will let you review and undo past bulk edits. Nothing is sent off-site.
- Recorded bulk edits can now be restored: preview exactly which fields would change, skip anything edited since the operation (or force it deliberately), and undo a restore itself. Restores go through the same validation as normal saves.
- Operation History: review your past bulk saves and restore previous values from a new History panel in the toolbar. Each save can be previewed field-by-field — before, current, and what restore will write — with fields that changed since the save flagged so you can skip or force them. Restore runs like a save (previewable, per-item, and re-runnable), and every restore is itself recorded so you can redo it. Configure recording, retention, and clearing from the History settings.
- Operation History is launching in beta with recording off by default. Turn it on from the History settings to start recording your bulk saves; anything recorded while it’s on can be restored.
- While Operation History recording is off, a dismissible reminder now appears above the editor so you can turn it on in one click (with the same beta confirmation). Dismiss it and it won’t come back.
- Added Upsells and Cross-sells as editable product columns. Pick linked products from a searchable modal (by title, SKU, GTIN, or product ID), reorder them — WooCommerce shows them in the order you set — and bulk-edit them across a selection with Replace all, Add, or Remove. Both columns are available in CSV export. Links pointing at deleted products are shown as a warning rather than silently discarded, so you decide when to remove them, and a link to a draft or disabled product is flagged so you know it won’t appear on your storefront. Cross-sells are editable on simple and variable products only, matching WooCommerce, which hides the field on grouped and external products because cross-sells are promoted in the cart.
- Paste from Excel: paste a copied spreadsheet block directly into grid cells (fills from the focused cell, skipping read-only cells), or use the new Paste wizard to match pasted rows to products by any column (SKU, a supplier code field, …) and update the mapped columns — including an option to apply the same values to each matched product’s loaded variations. In the wizard, custom number and text columns can be marked as prices (Format: Price), so supplier cost lists round to your shop’s price decimals. Everything lands as pending changes: review in the grid, then Save or Discard.
- More products-per-page choices (250, 500 and 1000), plus a “Custom…” option for any page size up to 10,000. Your page size is now saved as part of your views, so it comes back with a saved view and survives a reload.
- Added Sale From and Sale To date-range filters. Variable products are included when one of their variations matches the sale schedule you filtered for, and only the matching variations are shown.
- Added a Tags filter. Pick one or more product tags to narrow the grid to products carrying any of them; it combines with all other filters and applies to CSV exports too.
- Added the Button text field for External/Affiliate products. View and edit the add-to-cart button label inline, change it with the bulk-edit panel (set, prepend, append, find & replace, clear), and include it in CSV exports.
- Added an “Image uploaded” filter and grid/CSV column showing when each product’s featured image was uploaded. Filter by a date range to find products whose images changed since a given date — useful when syncing images between sites. Variations are matched on their own images, and the column is available in the column picker and CSV exports.
- Export any saved grid view as a JSON file or copyable text, and import a view exported from another account or site.
- Added a “Re-detect” button per custom meta field in Meta Field Columns that re-runs automatic type detection against the field’s current data — useful when a plugin changes what it stores in a key after you enabled it (for example, a field that started holding serialized arrays). If serialized data is detected the field becomes read-only again to protect it from corruption.
- Added support for third-party product types. WooCommerce Product Bundles products now appear in the grid with full inline and bulk editing (prices, stock, categories, images, and more), and other plugin-registered types (subscriptions, composites, etc.) show up with a safe set of editable fields. The Type filter and the grid’s type badges show every registered product type under its own plugin-provided name. Variable-style third-party products (such as variable subscriptions) expand to show their variations, just like native variable products.
- The Product Type condition in Advanced Conditional Selection now lists every product type registered on the site — including third-party types such as subscriptions and composites — under their plugin-provided names, so conditions can target those products directly.
- Added a “Refresh list after saving” setting. Turn it off to keep edited products visible in the grid after saving — even when they no longer match the active filters — until you reload the list.
- Added a Product URL column for External/Affiliate products — show it in the grid, edit it inline and in bulk (including find & replace for affiliate domain migrations), and export it to CSV. A new Product URL filter finds products by their link, with contains, does not contain, starts with, ends with, is empty and is not empty modes.
- The SKU filter now has a match-mode dropdown: Contains, Is exactly, Does not contain, Starts with, and Ends with. Comma-separate several SKUs to match any of them under the chosen mode (or none of them, for “Does not contain”), up to 200 values. The dropdown starts on Auto, which keeps the original behavior — a single SKU is a partial match, comma-separated SKUs are exact matches — so existing saved views and searches are unchanged. Also fixed: searching for the SKU “0” now filters products correctly instead of being ignored.
- Added a compatibility setting that triggers the standard WordPress save hooks after each save, so sync and integration plugins detect changes made in the editor. Find it under “Notify other plugins of changes” in Settings — it is off by default, and the info button beside it lists exactly which hooks are fired.
- Added Shipping class as a product column. View it in the grid, edit it inline or with the bulk-edit panel — including a “Same as parent” option on variations — filter products by shipping class, and include it in CSV exports.
- Added WPML support. The bulk editor now follows the language you pick in WPML’s admin language switcher — the product list, filter options, saves, bulk operations and CSV exports all stay within that language, and choosing “All languages” shows every translation. Switching between specific languages clears filters that point at language-specific items (categories, tags, attributes, shipping classes, custom taxonomies) and returns the editor to the Default view; text, status, price and date filters are kept. Switching to “All languages” keeps all your filters — though filters changed while in All languages are treated as unscoped and are cleared on your next switch to a specific language. In All languages mode, category, tag, attribute, shipping-class and custom-taxonomy edits are blocked with an inline message (other fields save normally), and requests for a language that isn’t active on the site are rejected.
Improved
6
- Renamed the Created product filter to Published on to align with WordPress/WooCommerce publishing terminology, and renamed Modified to Modified on for consistency.
- Operation History rows are now easier to read at a glance. Each row shows its own operation number, a friendly source label (“Bulk edit”, “API” or “Restore”) instead of a raw code, changed fields by their proper names (e.g. “Regular price, Sale price”), and the time in your site’s timezone with the exact timestamp on hover. Restore rows now read “Restored from Bulk edit #7”, naming the operation they came from.
- The Operation History panel now carries a Beta badge and, while recording is off with nothing recorded yet, an enable-focused empty state that gets you started. Turning recording on now asks for confirmation first (with a reminder to try it on a staging site), and the settings screen shows a persistent beta note beside the toggle.
- Refined the Operation History dialog header: the close button now sits on its own in the top-right corner, the Settings button moved into the filter row, and the settings view opens with a clear “Back to history” link.
- The Operation History beta now explains itself. The editing-screen reminder makes clear that turning recording on keeps your bulk edits undoable after they’re saved, and adds a Learn more link that opens the panel. When recording is off with nothing recorded yet, the panel now shows a plain-language explainer — what recording captures, what happens if you turn it on or leave it off, and a link to the full docs — instead of the previous one-line empty state.
- The Published on, Modified on, Sale from, and Sale to filters now appear in the filter panel only when their columns are shown in the grid, like the other filters. A date filter that has a value set stays visible even when its column is hidden.
Fixed
47
- Cost of Goods fields no longer appear in the custom meta field list, where editing them never saved. Use the dedicated Cost of Goods column to edit them instead.
- Fixed searching by a variation’s SKU returning no results. When variations are shown in the grid, a SKU search now matches variation SKUs and displays the matching variation under its parent. Searching a product’s own SKU keeps all of its variations visible.
- Fixed the Custom Meta field list offering WooCommerce’s internal product-attribute keys (like
attribute_pa_colororattribute_size) as if they were custom fields. They duplicate the built-in attribute columns and aren’t safe to edit directly, so they’re no longer listed, and any that were already enabled are dropped from the grid, exports, and filter options. Edit attributes using the attribute columns instead. - Fixed the active-filter badge counting a saved PublishPress revisions filter after the plugin was deactivated. The count now matches the filters actually applied.
- Fixed a saved filter view showing an active-filter count for a custom field, ACF field, or custom taxonomy that is no longer enabled (for example after disabling it in settings) — the phantom count had no visible control to clear it. Such stale filters are now ignored in the count and are no longer sent with product list or export requests. Disabled custom taxonomies are also no longer applied as filters when requested directly.
- Duplicate variation attribute combinations are now blocked even when a variation still uses a value that was later removed from the product’s attribute options. Previously such a duplicate could slip through when editing per-variation attributes in the grid.
- Fixed bulk-edit searches and saves failing after the page was left open for a long time. The page now refreshes its security token automatically, and shows a clear “session expired or permissions changed — reload” message in the rare case it can’t recover.
- Fixed several Default-view and layout issues: selecting Default now restores columns you had hidden back to their factory visibility; deleting the view you’re currently on returns you to Default and flags the layout as modified when it differs, instead of leaving a stale layout mislabeled as clean; and switching views no longer shows columns from your previous layout when “auto-load products” is turned off.
- Fixed the Views “· Modified” indicator disappearing when you chose “Update with current state” on a view other than the one currently selected.
- Fixed the Views “· Modified” indicator misbehaving: reverting a column change now clears it (previously it could stay stuck on), and re-selecting the same categories or filters in a different order no longer flags the layout as modified.
- Fixed the selected view being lost after a page reload — the active view is now correctly remembered instead of quietly reverting to Default on the next load.
- Fixed saving a new view before the product grid has loaded (with auto-load off) storing an empty column layout — a new view now captures your current columns in that case.
- Fixed column layout changes being silently discarded when updating a view while product auto-loading is turned off — the view now saves your columns, and the layout no longer keeps showing as modified afterward.
- Cancelling a bulk save (or restore) while a batch was mid-request no longer reports that in-progress batch as a failed save. For saves, the items in it are now shown as not attempted.
- Deleting the plugin now removes its settings and per-user interface preferences from the database, instead of leaving them behind.
- Clicking Stop during a save now cancels the in-progress request immediately, instead of only skipping the batches that hadn’t started yet. Rows that still finished saving on the server are reconciled afterward, so they no longer linger as unsaved.
- Fixed the Operation History panel showing the “recording is off” screen (and hiding the source/user filters) when a filter matched no operations. Filtering to an empty result now shows a “no operations match these filters” message with the filters still visible, so you can change or clear them.
- Operation History no longer attributes another plugin’s product save to one of your bulk-edit operations when an earlier save of that same product failed partway through the request. A failed history write also no longer leaves an empty phantom operation with zero changes in the history list.
- Operation History cleanup no longer deletes the recorded operation an in-progress restore is replaying from, so a restore can’t be left partially applied and unable to finish.
- Clearing or mistyping the “Keep history for” days field in Operation History settings no longer silently sets retention to 1 day (which pruned almost all recorded history on the next cleanup). An empty or out-of-range value is now rejected with an inline message and your last saved value is kept.
- Restoring an Operation History entry no longer silently skips category, tag, and custom product taxonomy changes. Routine edits like adding a category were being flagged as conflicts because the terms were compared in a different order, so restore dropped them while reporting success; term collections now compare as sets regardless of order. The same fix also stops fields WordPress rewrites when saving (such as certain characters in descriptions) from being reported as false conflicts.
- The Operation History list no longer strands you on an empty page. When retention pruning or deleting operations shrinks the list below your current page, it now snaps back to the last valid page with pagination intact instead of showing a blank page with no way back.
- The Operation History restore preview now links back to the original operation correctly. Previously, opening a restore’s preview always claimed the original operation was no longer in history, even when it was still there; the link now appears when the original exists and shows the “no longer in history” note only when it has actually been pruned.
- Operation History restore is more accurate and resilient. Restoring a category, tag, custom taxonomy, or attribute value whose term was deleted since the edit is now clearly skipped and labelled — in both the preview and the results — instead of reporting success while quietly dropping the value. The restore preview also warns when your selected fields would leave a product’s sale price higher than its regular price, so you can adjust before restoring (you can still proceed). And if the restore dialog can’t load an operation’s items, it now shows the error with a Retry button instead of a stuck “Restore 0 products” button.
- Operation History now presents restore details in a localized, site-aware way. In the restore preview, product statuses (Published, Draft, and so on) and field names display as translated labels instead of raw internal values, and the per-product restore outcome is translated too. History timestamps now follow your site’s configured date and time format as well as its timezone, instead of a fixed English format.
- Stopping an Operation History restore no longer hides a real login or permission failure. If your session expired or your permissions changed mid-restore, the preview now shows an auth error telling you to reload, instead of reporting the restore as simply “stopped.”
- Save-stopped notifications are now translatable. The messages shown when you stop a save part-way through — including the counts of what was saved, what’s still pending, and any per-product errors — now appear in your site’s language.
- “Remove all data on uninstall” now removes everything it should. Per-user dismissals of the Operation History notice are cleared along with the rest of the plugin’s data, and on multisite networks the removal runs on every site that opted in rather than only the primary site.
- Operation History: deleting a recorded operation — or clearing all history — while a restore is replaying from it no longer pulls the data out from under the restore. The single delete is refused with a clear message until the restore finishes, and Clear All keeps that operation and reports how many were kept.
- The Operation History retention setting is now validated on the server as well: API requests with a blank, non-numeric, zero, or negative “Keep history for” value are rejected and your previously saved retention is kept, instead of being silently saved as 1 day (which would have pruned almost all recorded history on the next cleanup).
- Operation History: two restores running at the same time could silently knock out each other’s cleanup protection, letting history cleanup delete an operation mid-restore. Each in-progress restore now holds its own protection record, renewed while it runs and expiring shortly after it stops, so overlapping restores can no longer interfere.
- Stopping an Operation History restore mid-request no longer assumes the interrupted batch never ran. Its items now show as “unconfirmed” (the server may have finished restoring them before the stop), the grid and the history list refresh with the latest saved values — best-effort, with a “Refresh now” action for a commit that lands late — and those items stay selected so you can safely run the restore again.
- When a save (or a Pro Operation History restore) is rejected because you are no longer authenticated and the site replies with an HTTP 401 error (e.g. Application Passwords or an authentication plugin), the session-expired warning now appears — including when Stop was pressed mid-operation — instead of the failure looking like a cancelled run. Rejected save/restore requests also now show the actual server error message instead of the generic “Unknown server error” text, which is now translatable.
- Operation History: restoring could write back display-formatted values instead of the real stored ones — with a translation or price-display plugin active, each restore cycle compounded the formatting into the product (“Original – translated – translated”), and restoring a variation whose SKU, weight, dimensions, or stock came from its parent hard-copied the parent’s values onto the variation. History now records exactly what is stored in the database, restores are byte-identical however often you repeat them, and renaming an attribute term no longer makes older operations report a false conflict. Recording is also much faster on large edits — it reads only the fields you actually changed. Note: the preview’s “current value” now shows the stored value, which can differ from the grid when a display filter is active (that is the value a restore writes), and history recorded before this update may show as conflicts — use Clear history to reset.
- Operation History: a restore starting at the same instant another request deleted its source operation could, on some database configurations, lose the source mid-restore. The database now enforces restore protection directly (an operation with an active restore cannot be deleted at the storage level), cleanup retries around it safely, and when that protection cannot be verified the affected actions stop with a clear retryable error instead of proceeding unprotected.
- Restore now shields Cost of Goods, ACF, and custom meta values from their write-side value filters, preserves numeric precision, and reports any remaining persistence mismatch instead of showing the item as restored.
- Turning off “Manage stock” now discards any staged Stock quantity / Backorders edits for that product no matter how the change is made — inline edit, fill handle, bulk edit, or paste — so stale stock values can no longer be saved once stock management is switched off.
- ACF fields created by importers or scripts often have non-standard field keys (no “field_” prefix, or containing hyphens). Such fields appeared in the Meta Field Columns dialog but silently failed to save when selected, so they could never be shown as grid columns. They now save and work correctly.
- Fixed an error thrown when clicking “Clear all filters” on the “No products match your filters” screen.
- Switching to another app or browser tab while editing a cell no longer closes the editor. When you come back, the cell is still in edit mode with the cursor where you left it — you can keep typing, or paste a copied value straight into the cell.
- Enter-to-edit-the-next-row and the variation Select/Deselect buttons no longer stop working after a load error, an empty filter result, or when auto-loading is disabled.
- Fixed a Cost of Goods filter issue where a product that had been converted from variable to simple could wrongly appear in the filtered results when a leftover hidden variation matched the filter.
- Fixed the Menu order filter, SKU search, and Description search wrongly including a product that had been converted from variable to simple when a leftover hidden variation matched the filter.
- Fixed date picker calendar popups following the operating system’s light/dark theme instead of the plugin’s selected theme.
- Custom meta columns no longer get locked to a number-only type. Automatic detection now only suggests the type when you first enable a field, and you can change it to Text or Number per field in Meta Field Columns — so a field like an MPN that happens to hold all-numeric values still accepts values like
7956GMS. Saving other settings no longer resets the types you chose. - Fixed toggling “Include Variations” reverting the grid’s column layout (hidden columns, widths, pinning) to an older state and incorrectly marking the loaded view as “Modified”. Also fixed Settings → “Reset layout” not restoring the default column visibility (previously hidden columns could stay hidden after a reset).
- Fixed CSV exports failing on large product sets with many columns selected. The file is now built page by page and caches are released as it goes, so the export uses far less server memory. When an export does fail, the error now names the cause and status (for example “Export failed (500): …”) instead of a generic “Export failed”.
Version 1.0.1
New
3
- Added support for five more ACF field types in the grid: Range, Button Group, oEmbed, Time Picker, and Date Time Picker — all editable inline and in bulk edit, and available in CSV export and conditional selection. ACF Number, Range, Date Picker, Date Time Picker, and Time Picker fields can now also be filtered by min/max value, date range, or time range in the filter panel.
- Added a Bulk Edit shortcut to the WordPress admin bar for quick access to the editor from anywhere in wp-admin. It can be turned off per user from the Settings menu and is on by default.
- Added an option to show admin-hidden product taxonomies — such as the “Sync with Square” status from the official WooCommerce Square integration — as editable, bulk-editable grid columns, each with a custom display name you choose. Enable it under Meta Fields → Taxonomies → “Include hidden taxonomies”.
Fixed
5
- Fixed tall popovers overflowing past the bottom of the screen on short browser windows; they now fit within the visible area and scroll internally.
- Fixed the bulk edit page not scrolling on short browser windows, which left the toolbar, pagination, and lower admin menu items clipped and unreachable.
- Fixed Selection Manager condition value inputs collapsing to unusably narrow widths when many fields are registered or a Between operator is used. The panel is now wider, value inputs keep a readable minimum width, and condition rows — including Between date ranges and the text case/regex toggles — fit on a single line.
- Fixed form fields rendering with light backgrounds in dark mode inside popover panels (filters, Selection Manager, dropdowns), and dark-mode styling for date and time inputs — native calendar/clock icons and picker popups now follow the dark theme too.
- Fixed the horizontal scrollbar floating in the middle of the grid instead of staying at the bottom after collapsing or expanding the Filters or Bulk Edit panel.
