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.6.0
LatestRead the 1.6 release post: Find and fix catalog problems before Black Friday
New
14
- The Title filter has a match dropdown like the SKU filter: Contains, Is exactly, Does not contain, Starts with and Ends with. With two or more words, “Does not contain” uses the same All words / Any word / Exact phrase choice as Contains and shows the titles Contains would leave out.
- The Title filter can match a regular expression: pick “Matches regex” in its match dropdown. Patterns use the same syntax as RegExp Find & Replace and ignore case. An invalid pattern is flagged before you apply it, and the grid, export and bulk edit show an error rather than an empty result when a pattern can’t be matched.
- A “See regex examples” link next to the Title filter’s “Matches regex” option opens a guide with ready-made patterns.
- The Export dialog now reopens as you last used it. Columns you ticked or unticked stay that way, and a new Reset link goes back to the columns shown in the grid. Every other column still follows the grid or your saved view. If you chose All filtered with rows selected, that choice is remembered too.
- Added a “Check our other plugins” page, linked from the Settings menu in the toolbar. It shows WPMelon’s other plugins and whether each one is already installed.
- Added a keyboard shortcut for Paste from Excel: Alt+P (⌥P on Mac) opens the paste wizard.
- SKU generator: new {attr:…} tokens insert a variation’s attribute values, so {parent_sku}.{attr:size}.{attr:color} gives SHIRT.XL.Red. Pick one from the “Insert attribute…” dropdown under the template. Products that aren’t variations keep their SKU.
- Added keyboard shortcuts for the main tools: Alt+F shows or hides Filters and Alt+B shows or hides Bulk Edit (⌥F and ⌥B on Mac). Both work while a grid cell is selected and are listed in the keyboard shortcuts help.
- Added a Catalog Health widget to the WordPress Dashboard: your catalog score, the three problems that matter most, when the catalog was last checked, and a link to Catalog Health.
- Added “Fix in bulk” to Catalog Health: it opens Bulk Edit with a suggested fix for every product that has the problem. Only rows with the problem are changed, and the preview shows what will change before you apply it. After the fix, that check is counted again. Closing the health filter returns the grid to the filters you had before.
- Added Catalog Health: a screen that checks your catalog for common problems (missing prices, negative stock, missing images, SKUs or weights, duplicate SKUs, sales that ended without the price going back, and more), gives it a score from 0 to 100, and shows the affected products in the grid with one click. Open it from the toolbar or from WooCommerce → Catalog Health. Checks that do not fit your store can be muted.
- Added Feed readiness to Catalog Health: five checks for shopping feeds (missing GTIN, missing brand, titles over 150 characters, main images under 500 × 500 px, and variations with an “Any” attribute), a check for images without alt text (listed under SEO and accessibility), and a Feed readiness score next to the catalog score and on the Dashboard widget. “Fix in bulk” on Missing SKU now opens the SKU generator. On multilingual stores (WPML with WooCommerce Multilingual), translations that share a SKU are no longer reported as duplicates.
- Added watched views to Catalog Health: in a saved view’s menu, choose “Watch in Catalog Health” and the view’s products are counted with the checks, listed on the Catalog Health screen with “Show products”, and included in the weekly summary. Renaming or deleting the view updates or removes it. On multilingual stores, a view saved in another language says so, with a link to switch to that language.
- Added a weekly Catalog Health email: turn on “Email me a weekly summary” on the Catalog Health screen, and every Monday at 08:00 (site time) your store is checked and you get a short email with your score, what changed since last week and any new problems. It goes to the site’s admin email by default; you can change the address. The screen shows when the last summary was sent, or tells you when it could not be sent so you can check your site’s email setup. The screen also shows how your score has moved over the last 12 days it was checked.
Fixed
6
- The permanent-delete dialog now shows what to type to confirm, and accepts the word DELETE in any case.
- Permanently deleting products now shows live progress and can be cancelled partway. Products already deleted stay deleted, and the rest stay selected. Deleting more than 500 products at once no longer fails.
- Fixed the product grid shrinking to a sliver on shorter screens (such as 1366×768 laptops) when the Filters and Bulk Edit panels were open. The grid now always keeps room for about six rows, and the page scrolls instead.
- Fixed the stock-lock hint, the image and gallery cell menus and the image preview staying in place, detached from their cell, when the page scrolls: they now close, as they do when the grid scrolls. The fill handle no longer jumps away from its cell after a page scroll.
- Fixed keyboard shortcuts (Alt+F, Alt+B, Ctrl+A, ?) acting behind an open menu, cell popup or confirmation dialog, and Esc clearing the row selection when it closed a category, tag or dropdown cell editor. Ctrl+S now waits until you close a cell editor, as it already did while typing in one.
- Fixed a price filter with 0 as its minimum or maximum showing every variation of a matching variable product, instead of only the variations at that price. Bulk edits on “All matching products” and CSV exports with that filter now use the same, correct rows.
Version 1.5.0
Read the 1.5 release post: Bulk edit every WooCommerce product that matches a filter
New
13
- ACF checkbox and multi-select fields can now be edited in the grid, and with Bulk Edit (Replace all, Add, Remove, Clear) and bulk-edit presets. Values a product already has that are no longer among the field’s choices are kept. New values must be one of the choices. Paste from Excel skips these columns for now.
- Added a short line under the grid inviting you to rate the plugin on WordPress.org.
- Added “All matching products” to Bulk Edit. Instead of the selected rows, you can now edit every product that matches the current filters, across all pages. Preview changes checks each product first and shows how many will change, along with which ones are skipped or invalid and why. Nothing is saved until you click Save changes. While the changes are saved, a progress bar appears in the dialog and a banner above the grid, and the work continues if you close the dialog. When it finishes the grid refreshes, and if you were away, a notice shows the result the next time you open the grid. If a product changed after the preview, it is skipped and listed rather than overwritten. A bulk edit that stopped with an error or that you cancelled can be resumed for 7 days.
- Bulk Edit’s “All matching products” now works with Pro’s operations and fields: price rounding, RegExp Find & Replace, the SKU generator (including the parent SKU and per-variation numbering), and ACF, custom meta and custom taxonomy fields. New taxonomy terms are created once, before any product is saved. A few regular-expression patterns can’t run on all matching products exactly as they do in the grid; those are refused with a message that names the part of the pattern, so you can adjust it or use Selected rows instead.
- The “All matching products” preview now shows before and after examples for up to 20 products, and how many products each field will change, already matches, skips or refuses. The whole bulk edit is recorded in Operation History as one entry, labelled “All matching products”, that you can restore like any other, however long it runs. If the bulk edit stops before it finishes, that entry is kept while it can still be resumed, so the resumed run adds to the same entry. While recording is off, the preview warns that the bulk edit can’t be undone and lets you turn recording on right there.
- Bulk Edit: a new “Change settings only” operation for attributes sets “Visible on product page” and “Used for variations” on products that already have the attribute, without adding, removing or replacing its terms.
- New setting under Settings → SKU of duplicated products: choose whether duplicated products and their variations get a SKU based on the original (ABC-1, ABC-2) or are left without one, as before version 1.4.0. The default stays “Based on original”.
- The Filter panel has a GTIN, UPC, EAN, or ISBN filter with the same match modes as the SKU filter (contains, is exactly, does not contain, starts with, ends with). It matches products and their variations, accepts several comma-separated codes, ignores spaces in a typed code, and applies to CSV export, “All matching products” bulk edits and saved views.
- The visual description editor has an Add image button that inserts an image from the media library at the cursor, as WordPress’s classic editor does.
- Added a Help menu to the toolbar. It links to the step-by-step tutorials on wpmelon.com and to docs & support, and it opens the keyboard shortcuts list (still also on the ? key). It replaces the keyboard shortcuts button.
- Added a Purchase Note column (WooCommerce’s Product data > Advanced > Purchase note). It’s editable on every product type except grouped and external products, which don’t use a purchase note. Edit it in the HTML / Visual editor, bulk edit it with Set, Prepend, Append, Find & Replace or Clear (for example, to swap old links in every note at once), and include it in CSV exports with its links intact. Like WooCommerce, the plugin removes HTML that isn’t allowed in purchase notes and tells you what it removed.
- The Selection Manager can now select products by Purchase Note, Button Text, Product URL, Menu Order and Published on.
- You can now add a value to a variation’s attribute straight from its grid cell: type a new name and choose Create, or search to pick a value the attribute has but the product doesn’t use yet. The value is also added to the parent product’s values, shown as a pending change on the parent’s cell, and both are saved together.
Improved
12
- Selected products now stay selected after saving, so you can make several edits in a row on the same products without selecting them again. To clear the selection after each save as before, turn off the new “Keep selection after saving” option under Settings.
- Sorting by an ACF select, radio or button group column is faster, most noticeably for fields with many choices.
- The description filter with “Include Variations” on loads faster on large catalogues, for both the page and the “Across all pages” row count.
- The SKU and GTIN filters with “Include Variations” on load faster on large catalogues, for both the page and the “Across all pages” row count.
- The Save button now stays in one place in the toolbar, next to Include Variations, with Discard beside it, so it no longer moves when other buttons appear. The Columns button moved next to Views.
- A slug with no URL-safe characters (for example “!!!”) and a slug of “0” are now rejected with the same error message, which names both cases.
- Bulk Edit: setting the Slug to a value now works on one product at a time, for selected rows as well as for all matching products, instead of giving every product after the first a “-2”, “-3” … slug and slowing the save down. Use Prepend, Append or Find & Replace to change many slugs at once; “Set to” with an empty value, or Clear, still regenerates slugs from the product titles.
- On phones, the toolbar’s tool buttons and page controls now sit in rows you can swipe sideways, so the product grid keeps most of the screen. On touch screens the New, Actions and page-size menus now open when tapped, so a swipe that starts on one of them no longer opens it.
- The “Deselect all variations” button on variable products now shows an empty checkbox instead of a crossed-out box, and no longer turns red on hover, so it doesn’t look like a delete action.
- The Edit mode toolbar button is now called Edit all selected, and an info button next to it explains what it does.
- The tag, category, attribute and other term pickers in the grid now put the cursor in their search field as soon as they open, so you can start typing right away. If you open a picker by typing a letter on the cell, that letter starts the search. Pressing Enter still confirms your selection and closes the picker.
- If you had added
_purchase_noteas a custom meta column, it is replaced by the new native Purchase Note column, which saves the note the way WooCommerce does. Show it from the column picker.
Fixed
14
- Fixed controls around the grid showing at different sizes. Dropdowns and text fields in the toolbar, filters, pagination, bulk edit and dialogs were taller than the buttons next to them and used WordPress’s grey borders and arrows. Every control now has the same compact height and style, and buttons show a focus outline when you move to them with the keyboard. The toolbar, Filters panel, Bulk Edit panel and grid are now evenly spaced, so the Bulk Edit panel no longer touches the grid. In Bulk Edit, the field, operation and value controls line up from row to row, and date and text values no longer stretch across the whole panel.
- Fixed the “Save as preset…” and other preset buttons looking like plain text when they can’t be used. They now keep their button outline when greyed out, and hovering the greyed-out Save button now shows why it is unavailable.
- Error messages on a Bulk Edit operation row move to their own line below the row when they don’t fit beside the value, instead of pushing the panel wider than the screen.
- Prices in the grid, the CSV export and the Bulk Edit preview are now the prices stored for your store’s base currency, even when a currency switcher (such as FOX) or a pricing plugin changes the prices visitors see. Before, bulk price changes could save a converted price, and the price filter could match variations on their converted price.
- Fixed the bulk edit screen going blank when typing in the search box of an ACF select, radio or button group filter whose choice labels are numbers (for example choices added from code).
- Fixed the gallery editor opening empty, and Add replacing the existing images, for products whose stored gallery list has gaps or repeated images (for example after an import). Fixed reordering in the Upsells / Cross-sells picker when a product’s stored list repeats a product.
- Pasting into an ACF select, radio or button group column now accepts choice labels that are numbers (for example choices added from code), instead of reporting them as an unknown option.
- Fixed toolbar buttons being cut off on phones and narrower windows. The toolbar now wraps onto more rows so every button stays reachable, and a long saved view name is shortened with an ellipsis.
- Fixed Stock Status changes that looked saved but were quietly undone by WooCommerce. Stock Status can no longer be edited where WooCommerce sets it automatically: products with Manage stock on, variable products, variations that use their parent’s stock, and external products (always in stock). Double-clicking such a cell, or pressing Enter or typing on it, explains why and offers a shortcut, such as editing Stock Qty or turning on Manage stock. Stock Qty and Backorders explain the same way when Manage stock is off. Bulk Edit skips those products and says why. If WooCommerce still overrides a saved Stock Status, the save now shows a warning.
- Fixed scheduled sales ending a day early. A Sale Date To set in the grid or through Bulk Edit now keeps the sale running until the end of that day, as in WooCommerce’s product editor. Before, the sale stopped as that day began, so a sale that started and ended on the same day never ran.
- Fixed layout and wording in the Create Variations wizard. A long product name no longer widens the dialog past its edge, where it scrolled sideways and cut off the Create Variations button. The Select All / Deselect All link next to each product in the preview is no longer cut off. The preview summary no longer reads “4 new variations across 1 products”.
- Fixed attribute and taxonomy term pickers saying “Search tags…” in the grid and in Bulk Edit. They now name the attribute or taxonomy, for example “Search color…”.
- Operation History now names the Purchase Note, Button Text, Product URL, Menu Order, Published on, Featured Image, Gallery Images, Upsells, Cross-sells and Cost of Goods fields instead of showing their internal keys.
- Fixed the product grid not loading (“Failed to load products”) on sites that use Plain permalinks.
Security
1
- Only administrators can now open the License & Updates page, which shows the license key and the debug log controls. Shop managers no longer see the link to it or the license warning on the Bulk Edit screen.
Version 1.4.0
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.