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.2.0
Latest
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.
