Super Speedy Imports changelog

Easy to use. Built for speed.

Latest version2.85
Released6 August 2026
Tested up toWordPress 7.0

2.856 August 2026

  • Fixed larger variable-product imports failing at Finalizing fix-attributes with "Error: timeout"
  • The attribute filter table build now refreshes the database's optimizer statistics first, fixing multi-minute Finalizing fix-attributes waits on a brand-new or freshly restored store
  • Every stage's finalize now has the same timeout recovery as the stages themselves, so work that outruns the browser's request timeout is watched to completion and re-run automatically where safe
  • The After Import "Attribute filter table" choice is now radio buttons, with the fast bulk rebuild selected by default
  • Deleting an import's products no longer starts WooCommerce's background attribute-lookup rebuild, because the delete already removes those rows in bulk
  • With the option set to WooCommerce's own rebuild, a rebuild already in progress when an import finishes is restarted so it covers the newly imported products
  • "Leave the table alone" now also applies when deleting an import's products
  • Fixed term images and other term data not reaching hierarchical terms that already existed on the site, such as the leaf of a Clothing > Hoodies category path
  • A product attribute's type, such as a colour swatch, now survives exporting your taxonomies and importing them again
  • The term data mapper offers product_attribute_color, the swatch colour key the Variation Swatches plugins read, alongside the Super Speedy Filters one
  • The bundled product demos carry colour swatches on their colour terms and icons on their category, brand, colour and size terms, and the variable products demo has gained brands
  • New superspeedyimports_stage_finalized action for add-ons whose work depends on a stage's finalize results rather than its body

2.845 August 2026

  • Fixed imports failing at setup with "specified key was too long; max key length is 1000 bytes" on hosts whose default storage engine is MyISAM
  • Every table the plugin creates now specifies ENGINE=InnoDB ROW_FORMAT=DYNAMIC, and an import stops with a clear message if the server hands back anything else
  • Preview and Run now tells you when your WordPress tables are still MyISAM, and gives you the SQL to convert every table in the database to InnoDB
  • Imports on MyISAM tables now use a single worker, because MyISAM locks a whole table while writing and extra workers only queue behind each other
  • The plugin now refuses to activate on a MySQL server with no InnoDB support, explaining why, instead of activating and then reporting missing tables
  • Fixed "Failed to insert or find term" during load-csv on category paths longer than 500 characters, which also left the affected branch of the tree built twice
  • Fixed simple products being left without a product type, which made them invisible to wc_get_products() and anything built on it until save-posts was run
  • Imported products now carry WooCommerce's own default settings (tax status, virtual, downloadable, sold individually, backorders and the rest), so a product created by an import is complete without running the optional save-posts job
  • Fixed an update run overwriting total sales, average rating and review count with zero, and clearing the virtual and downloadable flags, on products the CSV said nothing about
  • A product whose feed supplies a download URL is now correctly marked downloadable
  • Stock quantity and low-stock amount are now cleared on products that do not manage stock, matching WooCommerce, instead of leaving a quantity that reads as "zero in stock"
  • Variation names now use only the attributes the parent product actually varies on, so a size that only the variation rows mention no longer appears in the name
  • Fixed an update-only import replacing a variation's name with the raw name from the CSV instead of keeping the "Parent - Red, Small" form WooCommerce uses
  • Fixed variable products being invisible to the shop's price filter and sorted wrongly under "sort by price", because the parent product was never given a price built from its variations
  • Variable parents now get their price range rebuilt from their variations on every import, including on a prices-only run and after variations are deleted, so a daily price feed keeps the shop's price filter and price sorting correct
  • Variations that are out of stock are now left out of the parent's price range when "Hide out of stock items from the catalog" is switched on, matching WooCommerce
  • Fixed two strings in the InnoDB activation notice that could not be picked up for translation
  • Moved the parallel worker engine into functions/spawn-workers.php so the wp.org Lite edition ships with no subprocess code at all

2.83.04 August 2026

  • New After Import options group, listing the rebuild tasks that other plugins on your site need once an import has written to the database directly
  • New WooCommerce's attribute filter table is now rebuilt in bulk during the import instead of by its own background process, which took over a day on a million products and left layered-nav filtering degraded until it finished
  • Choose per import whether that table is rebuilt in bulk, left to WooCommerce's own rebuild, or left alone
  • Third-party rebuild tools are never run inside the import process; they start as separate background tasks where the host allows it, and are otherwise reported with the exact command to run
  • An unfinished third-party rebuild no longer affects whether your import succeeded, and the completion output names each outstanding task with its command
  • Back In Stock Notifier restock notifications are now delivered by the import itself rather than relying on WP-Cron, so a site with cron disabled still sends them
  • Fixed wp ssi <id> save-posts leaving WooCommerce's attribute filter table empty
  • Add-ons can add their own after-import tasks with the superspeedyimports_after_import_tasks filter
  • Stock notifications are now sent in bounded batches by up to four parallel workers, so an import with a very large number of restocks no longer loads every pending notification into memory at once
  • New wp ssi deliver-events <id> command finishes any outstanding notification delivery, and is safe to run repeatedly or alongside itself
  • Fixed save-posts and the post-save triggers passing the wrong arguments to WooCommerce's woocommerce_update_product hook, which could fatal with plugins that listen to it
  • Stock notification delivery can be switched back to running in the background with the superspeedyimports_change_event_deliver_inline filter, if you would rather imports finished without waiting for it
  • Tested up to WordPress 7.0

2.82.13 August 2026

  • Updated the shared Super Speedy settings module: AI agents can check your licence and install other Super Speedy plugins over MCP, now also exposed on AI Engine's MCP endpoint when AI Engine is active
  • New Check frequency setting - cap licence, update and changelog checks to once a day or once a week, and see when the licence was last checked
  • Licence and changelog checks fail fast when superspeedyplugins.com cannot be reached, instead of hanging the settings page
  • The newest installed copy of the shared Super Speedy settings code now runs site-wide, whichever plugin loads first - previously the alphabetically-first plugin's often-older copy won

2.82.03 August 2026

  • Fixed simple-product imports not assigning the product_type taxonomy term, which wc_get_products() based tools and WooCommerce's attribute-lookup regeneration rely on; existing catalogues are backfilled automatically on their next import
  • New Back In Stock Notifier for WooCommerce compatibility, on by default when that plugin is active, so products an import genuinely restores to stock notify their subscribers through the notifier's own checks and mail queue
  • New a Follow-up tasks panel on the import complete screen shows how many products came back in stock, live progress as notifications hand over, a Run now button, and links to the notifier queue and background jobs
  • New Import History shows the same follow-up counts for past runs
  • New wp ssi changes and wp ssi retry-events show and drain the integration queue for a history or import
  • Only genuine out-of-stock to in-stock transitions notify, so blank or missing stock values in a CSV never count as a restock
  • A restock reversed by a later import or edit before its notification goes out is superseded and never mailed
  • The integration waits with an explanation while the notifier's own periodic third-party scanner or keep-subscribed setting is enabled
  • Undo restores never trigger customer notifications

2.81.031 July 2026

  • The CSV is now opened by the load-csv stage rather than at the start of every run, groundwork for add-ons and templates that generate their own import file
  • A run that does not need the CSV, such as --delete-all, no longer stops with "CSV file not found"
  • Worker segment row numbers and ID ranges are integers rather than floats
  • Save Import now sits next to Preview & Run at the top of the Config tab instead of at the foot of the form
  • The Config tab's run panel stays pinned to the top while you scroll, so Save Import and Preview & Run are always reachable

2.80.029 July 2026

  • Every function, class, hook, option and AJAX action now uses the superspeedyimports_ prefix instead of ssi_, required by the WordPress.org plugin review
  • Your existing imports, settings and licence data migrate automatically the first time you open the admin or run an import, so no action is needed
  • Custom code hooking the old ssi_* filters and actions must be updated to superspeedyimports_*, for example ssi_filter_updates is now superspeedyimports_filter_updates
  • The Houzez add-on needs its matching update, or it will fail to activate
  • Database table names and the wp ssi command are unchanged
  • Replaced the bundled select2 library with a built-in dropdown, so the plugin no longer ships any third-party JavaScript
  • Table and column names in the fix-attributes stage and the bulk insert are now bound through wpdb::prepare() placeholders
  • Fixed the config import endpoint storing a configuration without sanitising it or applying the Lite edition restrictions
  • Attribute order on imported products now follows the order the taxonomies appear in your import config, with terms inside one attribute ordered by name
  • The demo data browser that downloads samples from GitHub, and lifting the PHP execution time limit, are now paid-edition only

2.79.025 July 2026

  • Row counts in the GUI are now the real row count of your CSV (previous was estimate for performance reasons). The upload receipt, the "Row 1 of N" label on the CSV preview and the Rows line in the "Ready to import?" summary were all capped at 5,000, so a 100,000-row file was reported as 5,000 rows
  • The count is taken by streaming the file and counting line breaks at the byte level rather than parsing every row, so it is about 10 times faster than the old capped count and uses about 1MB of memory whatever the file size. Line breaks inside quoted values are not counted as rows
  • Updated super-speedy-settings (shared across all Super Speedy plugins): added a settings-version report to the licence-check and download requests for better licence and update-download debugging

2.78.023 July 2026

  • Fixed saving an import in the admin HTML-encoded the taxonomy separator, turning > into >. Hierarchical categories such as Parent > Child > Grandchild (as in the demo catalogue's Categories column) then failed to import: the terms were created but the finalize step matches the built hierarchy path against a literal >, so nothing matched, every term was left unresolved, and the run aborted with "Failed to import hierarchical terms". The config save ran every value through wp_kses_post during the wp.org compliance pass, which entity-encodes bare <, > and &. Config values are now sanitised without encoding those literal characters, so separators (and any source or template value containing them) round-trip intact while scripts are still stripped.

2.77.022 July 2026

  • Added auto-mapping now works in the Lite editions too, not just Pro. The recognition engine was split out of the export file into functions/import-recognition.php so every edition can auto-configure an import from its CSV.
  • Improved auto-mapping is now instant on large files. It samples the first rows to detect column shapes rather than streaming the whole CSV; identity uniqueness and parent references are still validated when the import runs.
  • Added product attributes are recognised from the data (short repeating values, and any _Description/_Image sibling columns) and offered as one-click accepts in the setup checklist. The attribute taxonomy is created when the import runs.
  • Added creating an import streams a live discovery list - each column and its destination prints as it is recognised, ending with a mapped/to confirm/unmatched summary. The popover stays up until the mapping form and CSV preview are fully rendered, so nothing loads in behind it.
  • Improved selecting a CSV in the create dialog is instant. The receipt shows cheap facts only (rows, columns, type guess); all recognition happens once, after Create. Row counts on huge files are capped at 5,000 ("5,000+ rows") in both the receipt and the preview panel's row navigator instead of streaming the whole file.
  • Fixed clicking Create before the CSV type detection had returned could run the auto-mapper against the wrong import type (posts instead of WooCommerce products), mapping only a handful of columns. The server now derives the import type itself via ssi_suggest_template_for_csv unless the user explicitly chose one.
  • Fixed recognised-but-unregistered product attributes with _Description/_Image sibling columns now auto-map fully (attribute plus term data) instead of waiting in the accept list.
  • Fixed the CSV preview panel's mapped-column colouring no longer depends on load timing; it is recomputed once the mapping form has finished rendering.
  • Fixed the Create Import button can no longer be double-submitted into an "import already exists" error.
  • Fixed term-data columns (term descriptions, images) auto-mapped onto a taxonomy or attribute now show as mapped in the setup checklist instead of reading as unmapped.
  • Fixed term data mapped onto a pa_ product attribute (image, description, swatch colour) was dropped on save; it now persists like taxonomy term data.
  • Fixed when a stage hit a hard error mid-run (for example a taxonomy term that could not be created), the buffered progress text was flushed ahead of the JSON error, so the browser runner reported an opaque "non-JSON response" instead of the real cause. The runner now discards buffered progress before the error and carries it in the response, so the actual error message is shown.

2.76.422 July 2026

  • Fixed loading an import configuration (including Demo Data and freshly-mapped imports) failed with a "not valid JSON" error after the 2.76.2 wp.org compliance pass switched the AJAX handlers to wp_send_json. The JavaScript now accepts both string and pre-parsed object responses.

2.76.322 July 2026

  • Improved WordPress.org Plugin Check compliance - the runner's stage and file request parameters are unslashed and sanitised, and web callers can only name an alternate CSV inside the plugin's imports folder (WP-CLI keeps absolute paths).
  • Improved all debug logging (error_log, backtraces, deprecation-warning suppression) moved to Pro-only files, so the Lite editions ship no development functions at all. Error detail in import logs is formatted with wp_json_encode instead of print_r. Lite user-facing error reporting is unchanged.
  • Improved the wp.org build now truncates the shipped readme changelog to the most recent releases (the full history stays in the repo) and refuses to build if any development function creeps back in.

2.76.222 July 2026

  • Improved WordPress.org review compliance - inline admin scripts and styles moved to the enqueue API, all AJAX responses sent via wp_send_json, JSON config intake is unslashed and sanitised on arrival, AJAX action names and the import history classes are ssi_ prefixed, and a stray development SQL file no longer ships. No behaviour changes.

2.76.122 July 2026

  • Improved WordPress.org Plugin Check compliance pass - file cleanup now goes through wp_delete_file, disabled form controls are rendered with the disabled() helper, and the import history, import issues and staging-table cleanup queries use prepared identifier placeholders. No behaviour changes.

2.76.021 July 2026

  • New the auto-mapper now detects term data. Columns like Color_Image, Color_Description and Color_Hex alongside a mapped Color column are recognised (by name AND by their data) and mapped to the term's thumbnail image, term description and swatch colour. It also works backwards: an unrecognised column with term-data siblings, such as Pattern with Pattern_Image, is mapped as that product attribute.
  • New when the External Images plugin is active, image columns are automatically mapped to its URL fields (external_image_url and gallery_urls) instead of the media library - products get their images served straight from the URLs and nothing is downloaded during the import.
  • Improved variation attributes are now observed from your data rather than assumed. Only attributes whose values actually differ between a parent's variations (typically colour and size) are marked as variation attributes; material, pattern and the like stay as plain attributes.
  • Improved the auto-mapper recognises more columns - manage stock, rating, review count and MPN - and the product type column is reported as driving the simple/variable detection instead of showing as unrecognised.
  • New the auto-mapper understands the standard WooCommerce exporter CSV format. Punctuated headers ("Weight (lbs)", "In stock?"), the "Meta: key" convention, tax status/class, backorders, sold individually, sale price dates, purchase note, shipping class, download limits, external URL and pivoted attribute columns ("Attribute 1 name" + "Attribute 1 value(s)") all map automatically when the attribute is consistent, with clear explanations for anything that genuinely needs a human (per-row pivoted attributes, upsell/cross-sell references, source-site IDs).
  • New the auto-mapper now understands Magento, Squarespace, Wix, PrestaShop, Etsy and BigCommerce export formats. Magento gets its category paths configured automatically ('/' separators, 'Default Category' root stripped) and its enabled/disabled flags translated; Squarespace and Wix variant groupings synthesise variable products the same way Shopify's Handle does, including Squarespace's space-separated image lists; PrestaShop's semicolon lists, tax-excluded prices and EAN13 map directly; Etsy's variation pairs and materials become attributes. Structural columns each platform carries (Magento's configurable_variations, BigCommerce's row-order variants, SKU reference lists, store-scoping flags) are explained in plain English rather than left unrecognised.
  • New a raw Shopify product export now imports with zero manual mapping. The auto-mapper recognises the Handle grouping, switches on the variations-only import mode (one variable product synthesised per Handle, Options become the variation attributes) and translates Shopify statuses.
  • New value transforms. When a column's meaning is clear but its values speak another tool's vocabulary - the WooCommerce exporter's 1/0/-1 publish flags, Shopify's active/archived statuses, TRUE/FALSE flags - the auto-mapper attaches a translation instead of refusing the column. Hand-written configs can use them too (additional_options.value_transforms), and the registry is filterable for custom transforms.
  • New Shopify and WebToffee exports are understood too - Handle, Body (HTML), Vendor, Option1/2 Name+Value pivots, Variant columns with correct Compare At Price semantics (it is the regular price, Variant Price is the selling price), and the tax:/attribute:/meta: prefixed-header conventions. A Shopify file with no parent column gets a plain-English note explaining the Handle grouping.

2.75.021 July 2026

  • New (Pro) import term metadata alongside your items. Each taxonomy row on the mapping screen gains a "+ Term data" control for mapping term descriptions, custom term meta and term images from CSV columns. Image URLs are detected automatically and sideloaded into the media library. In Lite the control is visible but locked.
  • Improved Lite now shows the Beta features and Performance Options panels on the Settings tab greyed out with a PRO Only badge, instead of hiding them, so you can see what Pro adds. Their engine and saves remain Pro-only.
  • Fixed clicking "+ New Import" with unsaved changes to the current import config now shows the Unsaved Changes popover instead of silently discarding the edits. Refreshing or leaving the page with unsaved changes now triggers the browser's leave confirmation too.
  • Changed the Lite builds no longer ship the term metadata engine (term-metadata.php, term-metadata-writer.php) or the unused undo helper files (undo-change-detection.php, undo-chunked-restore.php).
  • New bundled demo data "Variable products with term images" - 10 variable products with 90 colour/size variations, with images on the colour, size and category terms.
  • New handle-slug-duplicates stage. Duplicate slugs for NEW items are resolved in their own stage (between match-existing and insert/update), gated so imports with no collisions skip the work entirely. On large sites the old approach scanned the whole posts table on every import; numbering is now also aware of which slugs the site actually occupies, fixing a rare collision.
  • Changed duplicate unique identifiers now stop the import with clear instructions instead of quietly importing renamed copies. This covers both directions - two CSV rows sharing an identifier, and an identifier that matches more than one existing item on the site. Where a differing column can be found (e.g. variations sharing their parent SKU), the message suggests the composite identifier to use, such as {SKU} {Colour}.
  • Improved the load-csv finalisation on large imports is much faster - all batch-table indexes are built in a single pass instead of nine - and every statement in it now records its own duration in import history.
  • Improved post-import tasks (WooCommerce term recounts, cache clears, lookup table regeneration) now appear in import history as their own stage with per-task durations.
  • Fixed a successful large import no longer shows "Import failed" when completion arrives via the recovery poll after a client timeout.
  • Fixed exporting and re-importing taxonomies no longer accumulates duplicate WooCommerce attribute labels.
  • Fixed the imports-list row icons (schedule, configure, history) now update the URL hash, so refreshing the page keeps the tab you were on.
  • Fixed run-screen buttons keep proper padding when their labels wrap to two lines.

2.74.218 July 2026

  • Updated super-speedy-settings to the latest version

2.74.018 July 2026

  • New Undo is now a site-wide Beta setting (Settings > Beta features, off by default) rather than a per-import option. When it is on, imports snapshot their target post type first so the whole run can be reverted from the Imports tab or wp ssi undo <id>. The Preview & Run popover gains a "Take snapshot" toggle (on by default) so you can skip the snapshot for a single run. It adds IO to every run, so test on a staging copy first and keep a backup.
  • New you can now delete an import from the Imports tab. The row actions are icons - delete, history, config and schedule - each with a tooltip. Deleting shows a confirmation popover that can also drop the import's staging tables and remove any header-compatible CSV files it no longer needs. CSV removal is opt-in and off by default, and each file lists how many other imports share it.
  • Improved the mapping screen now loads an import even when its original CSV file has been moved or deleted. The CSV column headers are stored with the import - captured when it is created, on save, and before a shared CSV is deleted - so the source fields still populate from a header-compatible sibling, or from the stored headers alone.
  • Fixed listing compatible CSV files no longer fatals on hosts using musl libc (Alpine, many Docker images). The get_compatible_csvs and get_csv_files file listings used GLOB_BRACE, a glibc-only flag, and now use a portable two-pass glob instead.

2.73.118 July 2026

  • New the Setup checklist is now an opt-in Beta feature (Settings > Beta features), off by default. When enabled it sits above Import Fields on the mapping screen, styled to match it.
  • Fixed dragging a column from the Setup checklist onto a field inserted {undefined} instead of the column name - the checklist pills were missing their header data.
  • Improved Import Fields cards now use fixed-width columns with ellipsis, so the ignore button stays visible however long the column name or value.
  • Improved the Import Fields hover now shows the full content of the currently-selected preview row (newlines and all, capped), rather than a fixed three-row sample.

2.73.017 July 2026

  • Fixed re-importing trashed items now restores them from the trash. Deleting products - through the WordPress trash or the plugin's delete-all - and then re-running the import used to match the trashed items, update every field and report a clean run while the store stayed empty, because nothing set post_status back. The update-posts stage now lifts matched posts out of the trash as part of the same update, so a re-import brings a trashed catalogue back. Verified at 500,000 rows.
  • Improved the process-variable-products stage is dramatically faster on large catalogues. A 500,000-row import could sit in this stage for 40 minutes or more; the columns its self-joins use are now indexed before the joins run. Applies to variable-product imports (Pro).
  • New after a run that moves items to the trash, the import shows how many of its items are in the Trash with a "Delete trashed items permanently" link, and the product count is split live versus trashed so a delete-to-trash run no longer looks like it did nothing. The permanent delete runs through the normal runner as a process-deletes pass rather than the WordPress trash screen, which is per-item and unusable at scale. A new --trashed-only flag does the same from WP CLI.
  • Fixed a long-running stage made of many quick statements is no longer misreported as a dead or timed-out run. The stage-status check now treats a heartbeat from the last 30 seconds as still running, so polling or re-opening a live import - process-variable-products in particular, now that its joins are indexed - shows "running" instead of falsely offering to recover it.

2.72.017 July 2026

  • New email alerts. The Schedule tab now has an Email alerts panel with two checkboxes - an email after every import completes (browser, CLI or scheduled) with the run's counters and any row issues, and a daily summary at a time you choose listing every run from the last 24 hours, which also emails when nothing ran so a broken schedule cannot fail silently. You choose the address alerts go to (defaults to the site admin email). All editions.
  • New ssi_import_run_complete action for developers - fires exactly once for every completed run on all three runners (browser, CLI and scheduled), passing the import id, the history row id and the run's summary counters. The panel also documents the existing ssi_scheduled_import_complete hook and links to a worked example in the knowledge base.
  • New (shipped quietly in 2.71, announced now): automatic column mapping for CSVs from anywhere - Shopify exports, supplier feeds, spreadsheets you made yourself. The auto-mapper reads your column names against a large alias list and then reads the first rows of actual data to work out what each column really is - prices, GTINs and EANs, stock statuses, image URLs, weights, slugs, category paths and their separators - and only maps a column when name and data agree. It also picks the best match key (SKU over slug over GTIN over title), detects whether your file contains variations and sets the parent linkage up, and reports everything it could not decide as suggestions you accept or dismiss on the mapping screen. Previously only CSVs exported by Super Speedy Imports itself were configured automatically. Pro feature.
  • Changed the field mapping screen has been rebuilt. Every mapping is now one row - a drag handle, the destination field, an arrow, then the CSV columns as pills you can add, remove or drag onto - so the whole import reads top to bottom in one list. Typing in the source box searches your columns and never creates text. Anything more than plain columns (merge templates like {title} by {brand}, the rich editor for Description, custom PHP) lives behind the row's cogwheel, which shows a blue dot when a row is more than pills. The mapping is saved in exactly the same shapes as before, so existing imports load, save and run unchanged.
  • Changed the mapping has two views of the same list. Ungrouped is the new default - one flat list you can reorder by dragging, with your order saved on the import. Group fields shows the identical rows under group headings (Main, Inventory, Taxonomies, Attributes, Images, Post Meta and so on), reorderable within their group. The old Advanced view is gone and Drag & Drop is now Grouped; imports reopen in whichever view you saved them in.
  • New attributes, gallery images and ACF/SCF custom fields are now rows in the same list instead of separate panels. Attribute rows keep their Used for variations / Is visible / Is taxonomy checkboxes and separator underneath; Featured Image and each gallery image carry their alt text, title, caption and description underneath as label plus source. Type an attribute name and it is matched to a registered pa_ taxonomy where one exists, otherwise it is created as a custom attribute - no need to know about the pa_ prefix.
  • New required fields are enforced. The match field (plus the parent linkage fields when your file structure needs them) and at least one field to import are marked REQUIRED, pinned to the top of the destination picker, and listed in the checklist. Preview and Run stay disabled until they are mapped, so an import that cannot do anything can no longer be started.
  • New ghost suggestion rows. Columns the auto-mapper nearly matched appear as dashed rows ("Colour -> Product colour?") with Accept and Dismiss, so near misses are one click rather than a hunt.
  • Changed the CSV Preview sidebar is now Import Fields - a wider column of chip cards, one line each: the column name and its first sample value, with the full name and first three rows on hover. A card fills green as soon as a mapping uses that column, so unmapped columns stand out, and each card can be ignored in place.
  • Changed the set-up checklist is now a collapsed card under Import Fields with its progress on the header ("15 of 20 columns handled"), so it is there when you want it and out of the way when you don't. The match-key confirmation moved to the match-field selector, which is now the one place matching is chosen and reviewed.
  • Changed the New Import dialog is down to what it needs: a name (filled in from your filename), a drop zone for your CSV, and the receipt. The import type is guessed from your file ("Looks like WooCommerce products") and the two behaviour questions moved to the Ready to import popover, where they were already editable. Import type, behaviour, separator and decimal point all sit behind a cog on the dialog, pre-filled by detection - nothing is asked, everything is correctable.
  • New import from URL. Paste a link to a CSV and Super Speedy Imports downloads it server-side (with the same checks as an upload) and sets the import up from it. No size cap of ours - your server's PHP limits apply, same as an upload.
  • Changed the WordPress image sizes to create moved into Additional Options, and the Images panel is gone now that featured and gallery images are rows in the list.
  • Changed the configuration file (JSON) tools are always visible and are now just Export and Import - Import opens the file browser and applies the JSON you pick, instead of a separate Browse step.
  • Changed changing a row's destination keeps the row where it is in your list instead of moving it to the bottom, and converts the row properly in both directions - move a mapping onto an attribute and its checkboxes appear, move it off and they go.
  • Removed the technical-details toggle. The configuration JSON tools are simply always shown, file paths are on hover, and the WP CLI command moved to the Schedule tab.
  • Changed the Scheduled tab is now Schedule, and shows the WP CLI command for the selected import plus a ready-made crontab line for the cadence you chose - so if you would rather run it from a real server cron than the built-in scheduler, the line is written for you.
  • Improved the config screen is quicker. Closing a cogwheel now keeps its editor alive so reopening is instant, the PHP editor only loads when you click into it, the mapping list reuses rows instead of rebuilding them, and around 100 hidden dropdowns are no longer initialised behind the scenes. On a 60 column import on a mid-range laptop, loading an import went from about 1.0s to 0.7s, reopening the Description editor from 140ms to 22ms, and opening the PHP tab from 99ms to 16ms.
  • Fixed the undo snapshot now runs on browser and scheduled imports. With Enable undo (BETA) on, only WP CLI runs were recording a snapshot, so undoing a GUI or scheduled run had nothing to restore.
  • Fixed browser imports now honour the import mode. Choosing "Only update prices" (or any preset) and pressing Run Now ran the full pipeline anyway; the browser runner ignored the mode presets and the ssi_filter_stages_to_run filter that CLI runs used. Browser and scheduled runs now also apply the unique-identifier pre-run guards that were CLI-only.
  • New running the same import twice at once is refused across all three runners. WP CLI and scheduled runs now claim, heartbeat and release the same run slot the browser uses, and the scheduled tick lock is atomic, so a cron tick can no longer start a second copy of a run that is already going.
  • Fixed "Only create new items" now links variations to parents that already exist. The preset was missing the parent and variation stages, so a top-up file of new variations imported them as unlinked simple products.
  • Improved Preview first item now previews the whole first item including all of its variations, straight from the real pipeline, and publishes the variations under the draft parent so the preview shows real dropdowns and prices instead of "out of stock". If the first item already exists it says so plainly and links to it, rather than reporting a configuration error. Preview drafts are isolated from your real data and discarded automatically before the next real run.
  • Fixed a race between browser workers could randomly fail four-worker runs by dropping and recreating the gallery images table underneath each other.
  • Fixed WP CLI worker failures now abort the run instead of warning and carrying on with the remaining rows.
  • Improved enable_db_tuning now applies per stage to scheduled runs (as it already did on the command line; deliberately never for browser runs).
  • Improved the imports lists, selectors and Export tab refresh in place after a demo-data load, a finished run or a beta-features save, instead of reloading the page and throwing away unsaved Config edits.

2.71.014 July 2026

  • Changed Undo (BETA) has been rebuilt from the ground up as a per-table raw snapshot with an exact-ID restore, replacing the old export-then-reimport approach. Before an import runs it now dumps one file per table (posts, postmeta, term relationships, terms, term taxonomy, attribute definitions) at one consistent instant. Undo then deletes the post type's rows and loads the snapshot back with their original IDs, all inside a single database transaction, so it is byte-identical, keeps every ID and link intact, and either fully applies or does nothing. It is far faster than the old re-import, cannot mangle serialized data or emoji, and correctly rolls back categories, attributes and product images the import created. Still BETA - test in staging and keep a database backup.
  • Changed the "Enable undo (BETA)" option is available again in Additional Options now that the new engine is in.
  • Improved the completion screen now leads with the outcome: "Import complete - 20,000 products imported in 13.8s", large tiles for items created, updated, removed and rows with issues, and an import-details strip (import name, file, match key, duration, finished time). The stage table, velocity stats and raw debug output moved under a collapsed "Technical performance details" section. A run with row problems says "Import completed with N issues" in amber and skips the confetti.
  • Improved a details-only run (prices, stock, categories) now reports how many products it actually updated instead of "0 posts updated". The engine counts the distinct items each run touched and the completion screen and import history carry it as items_affected.
  • New rows with problems are now recorded individually and reported. Rows skipped for a blank unique identifier and rows dropped because another row uses the same identifier (previously dropped silently) appear on the completion screen as issue classes with counts, and a "Download error report" button gives a CSV of row number, column and reason for the latest run.
  • Improved the failure screen leads with the plain-language error and a suggested next step; the full log and stack trace sit under a collapsed "Engine details" section. Mid-run fatals get the same calm treatment.
  • Improved the progress screen headline now shows real rows ("5,177 of 16,713 rows - 31%") with plain stage names ("Reading your file", "Finding existing products"), a live error count chip, and an honest "keep this tab open" note. The Live Engine Console starts collapsed under "Engine details" and remembers if you open it.
  • New a technical-details toggle (terminal icon in the top bar) reveals the WP CLI command, configuration JSON, full file paths, import IDs and the run screen's System Configuration panel. Off by default, remembered per browser, and nothing is removed from the page - support can always ask for it.
  • Improved the identity section now asks "How should existing products be matched?" in plain words, states the consequence ("rows with the same SKU update the existing product"), and surfaces the blank-identifier Stop/Skip choice inline instead of burying it in Additional Options.
  • New a "Ready to import?" review popover between Run Now and the run: file, row count, what the import will do in plain words, the match key, how many columns are mapped or ignored, warnings for important unmapped fields, and a red flag when delete-missing is on.
  • New a set-up checklist in the Config sidebar turns unmapped columns into a triage list: progress bar ("15 of 20 columns handled"), a one-click confirm for the match key, one-click Accept for near-miss auto-map suggestions, a searchable "Map..." destination picker (including a new custom field), per-column Ignore with a bulk ignore, and jump links that scroll to the real control. Ignores persist in the config and the auto-mapper respects them everywhere it runs.
  • New the New Import dialog asks the two behaviour questions up front: "What should this import do?" and "If an item is missing from your file..." (destructive choice flagged red), and shows an upload receipt after you pick a file: row count, column count and how many columns will be mapped automatically.
  • Improved pointing an import at a different CSV now refreshes its auto-map report against the new file, so the set-up checklist describes the columns you actually have.

2.70.013 July 2026

  • Security exported CSVs now neutralise spreadsheet formula injection (OWASP CSV injection). Any cell starting with =, +, -, @, tab or carriage return is prefixed with an apostrophe so Excel, LibreOffice and Google Sheets treat it as text instead of running it as a formula. Applies to the Export tab download, wp ssi export and the diagnostic exporter; plain numbers (like a -5 stock adjustment) and the undo snapshot are left untouched so restores stay byte-accurate. The importer strips the escape apostrophe again on load (the same convention Excel and the WooCommerce importer use), so an export from one site re-imports on another byte-identical.
  • Security image captions and descriptions coming from a CSV are now sanitised with wp_kses_post before being written to the attachment. Previously a <script> tag in a feed cell was stored verbatim (admins have unfiltered_html, so WordPress did not filter it) and could fire as stored XSS on any theme that renders attachment captions.
  • Security a batch of smaller hardening fixes from the security audit - an external/affiliate product's _product_url is now run through esc_url_raw so a javascript: value from a feed can't be stored verbatim; the CSV filename and per-stage metric values in Import History are now HTML-escaped before being rendered; the "products from this import" admin filter now casts the import ID with intval instead of accepting a raw string; the config-import JSON decode has a depth limit; a hard-error's full file-path stack trace is only included in the AJAX/REST response when WP_DEBUG is on (still logged in full either way); and the taxonomy JSON upload now checks is_uploaded_file, caps the file size and limits JSON nesting depth.
  • New the Demo Data tab can download larger sample imports on demand from GitHub. Browse demo data from GitHub lists a 100,000-post demo, a 100,000 simple-product demo and a 500,000-row variable-product demo (Pro); picking one downloads its CSV and config, checksum-verifies them and sets the import up ready for Run Now. Each also carries direct-download links so you can set it up by hand on shared hosting where a large server-side download would time out. The small demos stay bundled in the plugin.
  • New uploading or selecting a CSV that was made by the Export to CSV panel (or wp ssi export) now configures the whole import automatically - post fields, postmeta, taxonomies with the right hierarchy separators, featured image and gallery with their alt/title/caption/description text, and variation parent linkage. Export products on one site, create a new import on another site, choose the file and everything is mapped for you, with a banner confirming the auto-configuration. Works from the CLI too: wp ssi create mysite product export.csv with no config file.
  • Fixed undoing or re-importing an exported variable product no longer loses the "Used for variations" flag on its attributes. The config generated from a snapshot marked every attribute non-variable, so fix-attributes rewrote _product_attributes with is_variation off.
  • Fixed undoing or re-importing an exported variable product no longer blanks the variations' attribute selections (the "Any colour / Any size" symptom). Flat taxonomies such as pa_* attributes were being routed down the hierarchical import path, so process-variable-products could not rebuild the attribute_* selector postmeta.
  • Fixed re-importing an exported catalogue no longer doubles variation titles ("Shirt - Red, Small - Red, Small"). The attribute engine now leaves a title alone when it already ends with that variation's attribute names.
  • Changed Undo is now clearly marked as a BETA feature in the option, the Undo last run link and the confirmation dialog - test it in staging and do not rely on it until it is out of beta.
  • New scheduled imports now recover from crashes the same way browser runs do. A run whose PHP process dies (host max_execution_time, out-of-memory) is detected by the due scanner, diagnosed via the same SHOW PROCESSLIST fingerprint + stage-status logic as browser recovery, and continued: finished-but-unrecorded stages advance, idempotent stages re-run, insert-posts resumes from its checkpoint. Two failures with no progress abort with the real error in the schedule's last-result; recurring schedules stay armed for their next occurrence.
  • New scheduled imports run at a chosen time. Once takes a date and time, hourly a minutes-past-the-hour, daily a time plus day-of-week checkboxes, weekly a day and time - all in server time, with the current server clock shown live in the tab. A precise cron wake-up fires the run at the chosen time rather than up to an hour late on the hourly scanner.
  • Improved the Scheduled Imports tab has its own import selector (like the Config tab) instead of relying on the Config tab's selection, and drops the collapsible wrapper and heading.
  • Improved when a stage dies server-side, the failure banner and log now show the actual PHP fatal (for example "Allowed memory size exhausted" with file and line) instead of a generic "died server-side" message. A shutdown handler records the fatal against the run's history row and the recovery poll reads it back.
  • New browser imports now recover from bulk-stage timeouts instead of failing. If insert-posts, update-postmeta, insert-postmeta, match-existing, upsert-relationships or process-variable-products outlives the request, the runner polls the database every 15 seconds until the SQL settles, then continues: a stage that finished server-side is detected and skipped, idempotent stages re-run safely, and insert-posts resumes from immediately after its atomic INSERT when that committed - or retries it once if it rolled back. Every stage's statements are auto-stamped with an ssi:{import}:{stage} comment, so in-flight work is identifiable in plain SHOW PROCESSLIST.
  • Fixed re-importing variable products no longer adds a duplicate _default_attributes postmeta row per parent on every run. The stage now deletes-and-rewrites that key for the parents in the import (the same idiom as the variation-selector postmeta), so sites that accumulated duplicates from earlier versions self-heal on their next import. Values were never wrong - the old update path refreshed all copies - but postmeta bloated invisibly.
  • New a "DB Rows Processed" metric - the sum of inserted, updated and deleted rows on real WordPress tables across every stage (CSV staging excluded). Shown as a per-stage rows-per-second badge in the Run Now screen, a DB Rows figure and count breakdown on the completion screen, a DB Rows column in Import History (older runs show a dash), and a monthly total in the Imports tab stats. The existing Rows Processed remains and is labelled CSV Rows.
  • Improved browser imports now batch load-csv adaptively - each worker grows its rows-per-request while calls return quickly and backs off as they approach the PHP time limit, settling in a 20-25s band. On a 500,000-row CSV this cut the load-csv stage from around an hour to about a minute, since small fixed batches were dominated by HTTP round-trip overhead.
  • New the admin tabs are hash-routed - #imports, #config, #scheduled, #history, #settings open that tab directly, refresh keeps your tab, and with no hash the new Imports tab is the landing view. The Imports tab also shows live stats panels: rows processed this month, average import velocity with a per-run sparkline, and the engine version.
  • Fixed clicking the X on the "Import failed" banner now closes the Run Now dialog.
  • Improved the Imports tab's compatible-files count now includes the import's own CSV, so a healthy import always shows at least 1; zero only appears as the red "CSV missing" state. Actions are now Configure / Schedule / Run Now with a small Import History link underneath.
  • New browser runs support alternative CSV files without re-pointing the import - choosing a compatible file via Change File sets a per-run override, shown in the WP CLI command as --file=other.csv (the REST runner now honours a file parameter exactly like the CLI flag). The import's reference CSV is only permanently changed when recovering from a missing file.
  • Improved each row in the Taxonomies and Post Meta panels shows its X delete button in Drag & Drop mode (previously only visible in Advanced), and the Import History Reset button is now a small text link under Apply Filters.
  • New an Imports tab lists every import as a card - post-type icon, ID and created date, compatible-CSV count, last-run performance and total runs - with View History, Schedule and Run Now buttons wired to the existing flows.
  • New a "+ NEW IMPORT" button opens the Create New Import form in a popover (same blurred backdrop as the Run Now screen). It merges the old Create Import and Upload CSV panels - "Upload New" browses for a CSV and uploads it in one step, then selects it, so there's no separate Browse and Upload.
  • Changed the admin screen is organised into tabs - Import configuration, Scheduled imports, Import History and Settings. Import History now has its own tab (loading when opened) and Performance Options moved into a Settings tab.
  • New a Drag & Drop mapping mode for product imports, now the default view. The product-data fields are reorganised into a "Product Info" panel with vertical tabs in the standard WooCommerce order (General/Prices, Inventory, Shipping, Attributes & Taxonomies, Downloadable, External/Affiliate, Advanced), with Title/Description/Short description lifted into a Main section and Images, Taxonomies, Custom Fields and Post Meta as their own panels. Map a field by dragging a CSV column onto it, or type an Editor value mixing {Column} tokens and literal text - custom product attributes, Featured Image and Gallery included. Switch back to the flat Advanced layout at any time; the chosen view is saved with the import.
  • New an "Export to CSV" panel in the right-hand sidebar exports any post type to a CSV you can download and re-import - full taxonomy paths and hierarchy, all post meta, image URLs and dates. Also on the command line as wp ssi export <post_type>.
  • New scheduled imports. A "Scheduled imports" tab lets you set an import to run automatically on a cadence, in the background on a resumable, timeout-proof runner that records the same import history as a manual run. Chunkable stages (load-csv and the image stages) run in bounded batches so a run survives a host's max_execution_time; bulk-SQL stages run whole.
  • New a Pause button on the Run Now screen pauses an in-progress import and resumes it from where it left off.
  • Improved importing a product attribute (pa_*) that doesn't exist yet now creates it as a proper global WooCommerce attribute via wc_create_attribute, so it persists and appears under Products > Attributes. Previously the on-the-fly path only registered the taxonomy for the duration of the import, leaving orphaned terms.
  • New a "Need a taxonomy that isn't listed?" helper in the Taxonomies section generates a register_taxonomy snippet to paste into your theme's functions.php. Add it, save the import and refresh, and the custom taxonomy appears in the list to map against - so the taxonomy is owned by your own code, not this plugin. Points brands at WooCommerce's built-in product_brand where available.
  • Improved the attach-gallery-images stage now runs in parallel across workers.

2.68.211 July 2026

  • Updated super-speedy-settings refreshed the Super Speedy settings page with new plugin and service-panel icons (shared across all Super Speedy plugins).

2.68.110 July 2026

  • Updated super-speedy-settings (shared across all Super Speedy plugins): re-enabled TLS certificate verification on the licence/update check, escaped all dynamic output in the admin licence table, and added a capability check to the licence recheck handler.

2.68.010 July 2026

  • New an "Enable undo" option in Additional Import Options. When set, Super Speedy Imports snapshots the target post type before the import runs, so you can reverse that run in one click from the "Undo last run" link on the import summary (or with wp ssi undo <id>). Products the import created are deleted and products it changed are reverted to the snapshot, categories and their hierarchy included. One snapshot is kept per import, so Undo always targets the most recent run.
  • New wp ssi snapshot <id>, wp ssi undo <id> and wp ssi undo-list <id> commands to take, run and inspect undo points from the CLI.
  • Changed removed the last legacy in-process import runner (runStages) and its two unused entry points. Browser (REST) and CLI imports now share one execution path, so they cannot drift apart.

2.67.09 July 2026

  • New an "Editor" field-mapping method (in every edition) that builds a value from literal text plus {Column Name} merge tokens, so you can concatenate several CSV columns and fixed text into one field with no PHP. Works for post fields, post meta and taxonomies; the description field uses a full TinyMCE editor with an "Insert field" button on the toolbar.
  • New the product GTIN, UPC, EAN, or ISBN field (_global_unique_id) can now be mapped, in the renamed Stock Management/Inventory section.
  • New a Shipping section (PRO) for mapping Weight, Length, Width, Height and Shipping Class. Shipping Class is written to the product_shipping_class taxonomy, creating new classes as needed.
  • Changed the Stock Management section is now "Stock Management/Inventory", with SKU moved into it and shown first.
  • Fixed the destination hint under a mapping field now shows the correct target for computed fields - Shipping Class and the Featured/Catalog Visibility fields read Taxonomy: ... instead of wrongly saying "Posts column".
  • Fixed switching a field's mapping method no longer leaves an expanded PHP editor stuck on screen.

2.66.08 July 2026

  • New the Run Now screen has been redesigned. While an import runs you now see each stage with its own progress and worker activity, an overall percentage and elapsed timer, a system-configuration panel, live peak throughput, and a colour-coded live engine console.
  • New when an import finishes, the popover transitions to a completion screen with a per-stage efficiency table (duration, peak memory, throughput), a velocity panel showing average throughput and a full count breakdown (posts created and updated, post meta, terms, relationships, taxonomies), auto-fix and integrity totals, an Export Summary download and a link to view the updated posts/products.
  • New set Featured and Catalog Visibility on import - map a Featured column (1/yes) and a Catalog Visibility column (visible, catalog, search or hidden) in Publication Info. These combine with stock status into the product's product_visibility terms. Mapping the product_visibility taxonomy directly overrides them for the whole import.
  • Improved imported out-of-stock products now get WooCommerce's outofstock catalog-visibility term, improves performance and eliminates the need to run save-posts after run.
  • Fixed when the slug (post_name) is left unmapped, products sharing a title now get their -2/-3 slug suffixes in CSV row order every time, instead of an order that could vary between runs.

2.65.08 July 2026

  • New a "Load sample imports" button in the right-hand panel sets up ready-to-run sample imports in one click - it registers the product taxonomies (categories, brands, colours), copies the sample CSV into your uploads folder, and creates the import configuration. Pro includes a 1000-product simple import and a comprehensive import; the free edition includes the simple import. Nothing is imported until you pick one and press Run Now.
  • New once an import has been run, its summary shows a "Delete all products loaded by this import (x)" link, where x is the number that will be deleted. It moves every product that import created to the Trash (the same as the CLI --delete-all), alongside the existing "View products affected" link.
  • Fixed re-running an import through the browser no longer strips the products' categories, tags and attributes. The browser (AJAX) importer now runs the exact same per-stage code as the CLI, so the two can no longer drift apart.
  • Fixed the comprehensive (variable products) import no longer fails in the browser with an opaque "parsererror". Stage errors are now surfaced in the on-screen debug log so they can be diagnosed.
  • Fixed the per-section "Show All" buttons now respond immediately after creating a new import, without needing a page refresh.
  • Fixed browser (AJAX) imports now record the correct row count and run details in the import history - both the summary at the top of the page and the history list. Previously an AJAX run showed 0 rows (or "NA") while the same import run via CLI was correct.
  • Changed after a browser import finishes, the import summary at the top of the page updates automatically (last run date, rows and total runs) instead of needing a page refresh.
  • Changed the field mapping-method dropdown now reads "PHP" (or "PHP (PRO Only)" in the free edition) instead of the longer "PHP Function", which was overflowing the layout.
  • Changed database queries that reference plugin tables by name now run through $wpdb->prepare() using the %i identifier placeholder, to satisfy the WordPress.org Plugin Check for the free edition. This raises the minimum WordPress version to 6.2, where %i was introduced.
  • Fixed the sequence-helper table seed on activation now binds its row values through $wpdb->prepare() rather than building the SQL string by hand.

2.64.08 July 2026

  • New the automatic post-import maintenance now refreshes the whole WooCommerce storefront - it recounts terms (including product attributes), clears the product and shop transients, and regenerates the product and attribute lookup tables that drive shop sorting and layered-navigation filters. Previously only category and tag counts were updated. Runs for both CLI and browser (AJAX) imports.
  • New in the free edition, the top-level "Super Speedy" menu now shows a plugins overview page instead of an empty screen.

2.63.07 July 2026

  • New a free edition of Super Speedy Imports. Paid-only sections stay visible but are clearly marked "PRO Only" (with a link to upgrade) so you can see exactly what the Pro version adds.
  • Fixed category and tag counts are now recounted automatically at the end of every import, for both CLI and browser (AJAX) runs. Previously they could show 0 until you ran a manual wp term recount.
  • Fixed a runtime error in one of your custom PHP functions (for example, referencing a CSV column that does not exist) now stops the browser import with a clear on-screen error, instead of appearing to run but importing nothing.
  • Fixed importing a saved configuration over an already-loaded import no longer duplicates every field.
  • New an animated "Import Complete" confirmation at the end of a browser import, and pressing Escape now closes the progress dialog once the import has finished.

2.62.07 July 2026

  • New the unique item identifier now has its own collapsible section with a preset dropdown and a live summary of what it matches on, so most users never need the field builder. Products default to SKU, posts to Post title (with Post title + category also offered), and Custom expands the panel for combining fields by hand. The identifier section now shows for every template - previously it only appeared for WooCommerce.
  • Changed the Custom builder no longer lists every postmeta field. It offers a short whitelist (_sku plus common GTIN keys) checked cheaply for existence, so it stays fast on large sites. Add any other key by hand. Extendable via the ssi_uid_postmeta_whitelist filter.
  • Changed Additional Options is now collapsed by default, to signal these settings are not usually needed.
  • Fixed the Show All buttons now have a solid white background instead of appearing greyed/transparent.

2.61.03 July 2026

  • Fixed a performance regression (introduced in the unreleased 2.59.0) that slowed large fresh imports. A 50,000-product fresh import that had been taking around 16 minutes now completes in around 30 seconds. Correctness and the 2.59.0 interrupted-import safety fix are unchanged.

2.60.03 July 2026

  • New a free edition of Super Speedy Imports is now available on WordPress.org.

2.59.02 July 2026

  • Fixed an import that was interrupted part-way through inserting new items at a specific stage (insert-posts) with specific interrupt causes (e.g. an out-of-memory kill, host timeout, or the process being stopped) could in theory, on the next run, create zombie posts.

2.58.027 June 2026

  • New a Value mapping method, alongside CSV Field and PHP Function. Pick Value to set a constant for a field/postmeta/taxonomy on every row — no PHP needed. Selecting Value with an empty box clears that field. This also replaces the internal per-row function the importer used to stamp each item, so a normal field-based import no longer evaluates any PHP at all.
  • Changed custom PHP function code is now isolated in a single file. If a malware scanner (e.g. Imunify) quarantines or empties that file, only custom functions are affected - normal field-based imports keep working with a clear message, instead of a core file being broken.
  • Changed a runtime error inside one of your custom PHP functions now aborts the import and reports the error, instead of continuing with empty/incorrect data.

2.57.023 June 2026

  • New the unique item identifier can now combine multiple fields - any mix of post fields (Title, Slug, GUID), postmeta keys (e.g. SKU), and taxonomies (e.g. product_cat, pa_color). Items match when all chosen fields are equal. This solves the common "same SKU, different colour/size" case where a single SKU isn't unique. Matching runs against the data your catalogue already holds, so re-imports update existing items instead of duplicating them, even for products SSI didn't create.
  • New if a composite identifier can't tell two rows (or two existing items) apart, the import now aborts with a clear report listing the affected rows, instead of silently updating the wrong item.
  • New when the identifier includes a taxonomy, import modes that skip taxonomy resolution ("Update prices/postmeta only", "Refresh images only") are disabled, since taxonomy matching needs the term-resolution stage to run.
  • Changed the old PHP-function and raw-CSV-column identifiers have been removed - a value computed from the CSV row can't be matched against existing items, which was the root cause of duplicate-on-update. Choose post / postmeta / taxonomy fields instead.
  • Note composite identifiers aren't yet supported for variable / synthesised-parent products - use a single SKU there.

2.5623 June 2026

  • A mapped post_name (product slug) is now imported verbatim instead of being overwritten with a de-duplicated slug derived from the title.
  • Fixed choosing a field as the unique item identifier now matches your existing items on that field's native postmeta key (e.g. SKU on _sku) instead of SSI's private key. Previously, using your SKU field as the identifier failed to find products created outside SSI (manually, or by another importer), so a re-import duplicated every existing product instead of updating it. Existing imports are migrated automatically; no reconfiguration needed.

2.55.94 June 2026

  • New products now get assigned every level of a category path, not just the deepest one. When a product is in Men > T-Shirts, both Men and T-Shirts are attached (matching WP All Import), so parent category pages list the product, breadcrumbs show the full path, and layered-navigation filters include parent categories. A new "Assign every category level" option in Additional Options controls it. New imports default it ON; imports created before this release keep their previous leaf-only behaviour until you switch it on.

2.55.83 June 2026

  • Fixed a duplicate-key crash during taxonomy import on large catalogues (50,000+ terms per taxonomy), where parallel workers racing to create the same shared term could abort the whole import. Term creation is now serialised and recovers safely if a term already exists. Relationship assignment stays fully parallel, and there is no meaningful speed cost (parallelism was buying almost nothing at this step).

Showing the 40 most recent of 178 releases. View the full history

▲
▼
1/1