Core Changelog for Super Speedy Imports

Contributors: dhilditch
Donate link: https://www.superspeedyplugins.com/
Tags: imports, speed, performance, fast
Requires at least: 6.2
Tested up to: 6.4
Stable tag: 2.66.0
Requires PHP: 7.0 License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Fast CSV importer for WordPress posts and WooCommerce products, built for very large catalogues.

Description

Super Speedy Imports is a CSV importer for WordPress posts and WooCommerce products, built for speed on very large catalogues. It can import around 1 million items in roughly 100 minutes.

You map the columns in your CSV to WordPress fields, custom fields (postmeta) and taxonomies once, then run the import from the admin screen or from WP-CLI. Re-running an import updates the items it already created, matched on a unique identifier such as SKU, instead of creating duplicates, so it is safe to run again or on a schedule.

The free edition imports:

  • WordPress posts and simple WooCommerce products
  • Post fields (title, content, excerpt, status, dates, slug and more)
  • Custom fields / postmeta
  • Hierarchical and flat taxonomies: categories, tags, brands, and WooCommerce global attributes such as pa_color
  • Featured images and product galleries from URLs (each URL downloaded once and reused)
  • Product stock status, Featured, and Catalog Visibility (visible, catalog, search or hidden)

See it in action in one click

The quickest way to see how it works is the built-in sample import:

  1. Install and activate the plugin.
  2. In the WordPress admin, open Super Speedy > Super Speedy Imports.
  3. In the Sample Imports panel on the right, click Load sample imports. This registers demo taxonomies (categories, brands, colours), copies a sample CSV into your uploads folder and creates a ready-to-run import. Nothing is imported yet.
  4. Open the sample import and press Run Now to watch it import a set of demo products live, with a progress log.

Running your own import

  1. Upload your CSV and create an import.
  2. Map each CSV column to a post field, custom field or taxonomy. Unmapped columns are ignored.
  3. Set the unique item identifier, the field used to match existing items when you re-import (SKU for products, post title for posts, by default). This is how re-imports update instead of duplicate.
  4. Press Run Now, or run it from the command line with wp ssi <import id> (handy for very large catalogues and for scheduling with cron).

Pro

The Pro edition, available from https://www.superspeedyplugins.com/, adds variable and variation products, downloadable products, custom PHP transforms, ACF/SCF field mapping and more. Paid sections stay visible in the free edition, marked "PRO Only", so you can see what they add. Full guides for the Pro features are on the website.

Installation

  1. In wp-admin, go to Plugins > Add New, search for "Super Speedy Imports", then click Install and Activate. (Or upload the plugin zip under Plugins > Add New > Upload Plugin.)
  2. WooCommerce is required to import products. It is not needed to import posts.
  3. Open Super Speedy > Super Speedy Imports to create your first import, or click Load sample imports to try a ready-made one.

Requirements: WordPress 6.2 or newer and PHP 7.0 or newer.

Frequently Asked Questions

How do I try it without preparing a CSV?

Open Super Speedy > Super Speedy Imports and click Load sample imports in the right-hand panel, then press Run Now on the sample import. It sets up demo taxonomies and a sample CSV for you and imports a set of demo products so you can see the whole flow.

Will re-importing the same file create duplicates?

No. Each import matches existing items on a unique identifier (SKU for products, post title for posts, or a combination of fields you choose). Re-running updates the matched items instead of duplicating them, even for items that were not created by this plugin.

Does it import images?

Yes. Put the image URL (or a list of gallery URLs) in your CSV and it downloads the featured image and gallery images and attaches them. A URL that appears many times is downloaded once and reused.

Can it import WooCommerce categories, tags, brands and attributes?

Yes: hierarchical categories using > to separate levels (e.g. Men > T-Shirts), flat tags and brands, and global attributes such as pa_color. Create the global attribute in WooCommerce first and the plugin fills in the terms.

Can I run imports from the command line?

Yes. Every import has a WP-CLI command, wp ssi <import id>. This is useful for very large catalogues and for scheduling.

Does the free edition import variable products?

No. The free edition imports simple products. Variable and variation products, downloadable products, and custom PHP transforms are Pro features.

What are the requirements?

WordPress 6.2 or newer and PHP 7.0 or newer. WooCommerce is required only for product imports.

Known Issues

  1. If you import a config from elsewhere but the destination site does not have the same taxonomies registered, the import will fall back to the first available taxonomy. Use wp ssi export-taxonomies and wp ssi import-taxonomies to mirror taxonomy structure across sites before loading the config.

  2. You MUST have a unique identifier column mapped. By default this is SKU for products and post_title for Posts.

  3. Hierarchy separator is hardcoded to > for hierarchical taxonomies, e.g. Women > Clothing > Jeans

Changelog

2.66.0 (8th 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.0 (8th 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.0 (8th 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.0 (7th 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.0 (7th 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.0 (3rd 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.0 (3rd July 2026)

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

2.59.0 (2nd 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.0 (27th 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.0 (23rd 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.56 (23rd 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.9 (4th 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.8 (3rd 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).

2.55.7 (2nd June 2026)

  • Changed: if your CSV lists the featured image in the gallery column too, it now stays in the gallery instead of being silently removed (WooCommerce allows the featured image and gallery to overlap, so that is your choice). This also removes a query that could hang the gallery stage for 20-30 minutes on catalogues where many products share the same image URLs.

2.55.6 (2nd June 2026)

  • Performance: gallery image data is now written to the database in batches instead of one write per image, cutting a large chunk of time off the gallery stage on big catalogues (and removing a source of run-to-run variance). No change to what gets written.
  • The image-upload stage now records download, image-processing, and thumbnail timings in the import history, so you can see whether a slow image import is network-bound or CPU-bound.

2.55.3 (26th May 2026)

  • Performance: gallery image attachment rewritten with bulk database writes instead of per-image round-trips, saving significant time on large galleries. Existing gallery entries you added manually are preserved.
  • Performance: the postmeta-update stage now warms the database cache up front, avoiding a slow cold-cache first update on large imports.

2.55.2 (26th May 2026)

  • Fixed: with the opt-in "Merge duplicate term slugs" policy, hierarchical terms whose slug had been auto-renamed to avoid a clash (e.g. a second T-Shirts under a different parent) could fail to import. They now match by name as well as slug.
  • Performance: reworked the hierarchical taxonomy update to use an indexed temporary table, speeding up large taxonomies and sidestepping some database-version optimiser quirks.

2.55.1 (26th May 2026)

  • Improved diagnostics: the postmeta-update stage now prints per-key progress (name, row count, elapsed time) so a slow individual update is visible instead of the stage appearing to hang, and failures to import hierarchical terms now report the likely cause (e.g. collation mismatch or an invisible character) rather than a raw row dump.

2.55.0 (26th May 2026)

  • Performance: image URL to attachment matching now uses a dedicated lookup table, giving fast constant-time lookups regardless of URL length (including long CDN-signed URLs that previously matched poorly).
  • Fixed: a gallery query that could hang for 20+ minutes on catalogues where many products share the same image URLs.
  • A one-off migration builds the lookup table on the first import after upgrading. New wp ssi resync-image-lookup command rebuilds it on demand after manual media-library edits or a backup restore.
  • Note for add-on / custom-template authors: stages that looked up an attachment by the old original_image_url postmeta should now use the wp_ssi_image_lookup table.

2.54.4 (25th May 2026)

  • Performance: CSVs where many products share the same image URL (placeholders, product-family hero shots, etc.) no longer re-download that image once per product. Only the first occurrence is fetched; the rest reuse the same attachment. A 50,000-product CSV with 5,000 unique images now does 5,000 downloads instead of 50,000.
  • Performance: image downloads now distribute evenly across parallel workers regardless of CSV ordering. Previously certain orderings could leave one worker doing all the work while the others idled.
  • Combined, a large import with lots of repeated image URLs can drop from around 5 hours to 5-10 minutes.
  • Note: products sharing an image URL now share a single attachment and its metadata (alt / title / caption / description), which matches standard WordPress behaviour. Nothing changes for CSVs with unique image URLs.

2.54.3 (25th May 2026)

  • New: ssi_allow_private_image_hosts filter to opt into fetching images from private / loopback / LAN hosts. Default off (secure by default); useful for staging setups or an internal image server. Only the private-IP rejection is bypassable, and only for hosts you explicitly allow.

2.54.2 (24th May 2026)

  • Critical fix: --file= (import an alternate CSV) was ignored by parallel workers, so multi-worker imports loaded the original file instead. It is now applied correctly across all workers.
  • Critical fix: --show-sql behaved incorrectly on multi-worker imports, where workers could execute writes the parent was only meant to print. It is now safe across all workers.
  • Improved ACF / SCF custom-field import support, including groups, repeaters and multi-value choice fields, plus a warning if a mapped ACF field has been deleted, renamed or changed type since you saved the import.

2.54 (24th May 2026)

  • New: ssi_stage_starting and ssi_stage_ending action hooks fire around every stage, so add-on plugins can extend any stage (current or future) without modifying core code.
  • New: ACF / SCF custom-field import support (Phase 1), writing postmeta via bulk SQL for around 17 field types including text, number, date/time, select, checkbox, radio, true/false, WYSIWYG, link, group and repeater. Image, file, gallery, flexible-content and multi-value relational fields are not yet covered (handled separately or planned for a later phase).
  • Changed: the database schema upgrade check now also runs at the start of CLI / cron imports, so sites that auto-update without visiting wp-admin stay on the correct schema.

2.53.1 (20th May 2026)

  • New: a "Recheck Licenses" button on the Super Speedy Settings page to refresh licence status after a renewal or upgrade. It bypasses the licence cache, so a very recent renewal shows immediately rather than still appearing expired. Applies to every Super Speedy plugin.

2.53 (20th May 2026)

  • New: an "Import mode" option restricts the import to a narrower set of stages without typing a CLI stage list. Presets: Full import (default), Only insert new items, Only update existing items, Update prices / postmeta only (cheapest path for daily price feeds), Re-sync taxonomies only, and Refresh images only. Saved per import; each preset's stage list is shown in its tooltip.
  • A CLI stage list still overrides the saved preset, and --delete-all still takes precedence over everything.
  • Fixed: a "Could not get WooCommerce product" error when running a preset that skips the insert stages.

2.52 (19th May 2026)

  • Fixed: the "Import Types" dropdown on the Create New Import form was empty after an internal class rename. Templates register correctly again.
  • Fixed: after a WP Reset (or any wipe that drops the plugin's meta table), imports appeared with empty Additional Options. The plugin's tables now self-heal on the next admin page load.

2.51 (18th May 2026)

  • Fixed: duplicate rows could build up in the internal taxonomy tables during large parallel imports (5-8x their expected size on an 868k-row import), massively slowing taxonomy relationship assignment. Deduplication now works correctly across all workers, for both flat and hierarchical taxonomies.
  • Requires MariaDB 10.2+ / MySQL 5.7.6+ (both from 2016, already within the plugin's supported range). Applied automatically on the next import; no migration step needed.

2.50 (18th May 2026)

  • New: --show-sql CLI debug mode prints the SQL a stage would run. Writes are print-only (never executed), so it is safe for read-only diagnostics on production data. This first release covers the upsert-relationships stage, with more stages to follow.

2.49 (15th May 2026)

  • New: per-taxonomy progress output for the term-relationship stage, showing each taxonomy with its type, rows created / deleted, and elapsed time, so you can see which taxonomy is slow instead of just a single summary at the end. The same per-taxonomy timings are saved to the import history panel.

2.48 (15th May 2026)

  • New: an opt-in "Optimise DB session settings for slow stages" option in Additional Options. It raises MySQL buffer sizes for the import's own database connection only (not globally, so web traffic is unaffected), giving a 10x-100x speedup on term-relationship assignment for very large imports. Default off to protect low-RAM hosts; recommended on for 100k+ row imports on 4GB+ RAM. Uses up to around 600MB during the tuned stage, released afterwards.

2.47 (15th May 2026)

  • Performance: major speedup for term-relationship assignment on large imports (100,000+ rows). New indexes remove an unindexed join that, at around 868,000 rows, meant billions of row comparisons per taxonomy. Expected 100x-1000x faster on affected imports.

2.46 (14th May 2026)

  • Fixed: the "Duplicate term-slug behaviour" option wasn't appearing in the admin UI.
  • New (for template / add-on authors): support for plain-text additional options, and a way to pre-populate a default set of taxonomies so users don't have to add each one by hand.

2.45 (14th May 2026)

  • Internal test-suite improvements only; no change to plugin behaviour.

2.44 (14th May 2026)

  • Fixed: an image listed both as a featured image and inside a multi-URL gallery value could be uploaded twice, creating a duplicate attachment. Each unique image URL is now uploaded once and reused.

2.43 (14th May 2026)

  • Fixed: several internal steps relied on row order that could vary across parallel-worker runs, so values like duplicate-SKU slugs and synthesised parent titles / SKUs could drift between imports. They now follow the CSV row order, making re-imports stable.

2.42 (14th May 2026)

  • Fixed: product slugs (post_name) that look like de-duplicated slugs (e.g. dk-1512-005) could drift between re-imports, with the slug being renumbered each run. Re-imports are now stable and leave the slug alone.

2.41 (13th May 2026)

  • Fixed: hierarchical taxonomy assignments (e.g. product_cat) were dropped on every re-import once the terms already existed. Re-imports now keep the categories.
  • Security: the CSV column-name check now accepts real-world headers like Price (USD) or Price/Carat while still blocking characters that could be unsafe.

2.40 (13th May 2026)

  • Security: SSRF hardening for the remote-image downloader. Image URLs are restricted to http/https, addresses in private / loopback / cloud-metadata ranges are refused (so a CSV can't be used to reach internal services like http://169.254.169.254/), redirects are limited, and each downloaded file is verified to be a real image before it is stored. The allowed image types are filterable via ssi_allowed_downloaded_image_mimes.
  • Security: when an alternate CSV path (--file) doesn't exist, the path is no longer echoed back to web callers, where it could act as a file-existence oracle.

2.39 (13th May 2026)

  • Security: added current_user_can('manage_options') checks to the older AJAX handlers that previously only verified the nonce — ajax_new_import_handler, ajax_save_import_config_handler, ajax_import_config_handler, ajax_export_config_handler, ajax_get_csv_files, ajax_upload_csv_file, plus the taxonomy import/export AJAX handlers. Nonces verify request origin; the new capability checks make sure only an admin can actually call them, so a leaked nonce from another plugin's XSS no longer hands a low-privilege user the ability to create imports, overwrite configs, or upload files.
  • Security: ?run_import=1&import_id=… GET URLs now require a CSRF nonce. Running an import has heavyweight side effects (DB writes, remote image fetches, optional delete-all), so the action is no longer triggerable by a hostile site embedding the URL in an <img> tag against a logged-in admin. Removed the dead #removedthis-devonly JS block that was the only place those URLs ever got rendered.
  • Security: the "Functions" PHP code editor now honours DISALLOW_FILE_MODS and DISALLOW_FILE_EDIT. When either constant is true the save handler refuses to update the functions blob (the existing value is preserved) so production hosts that disable file edits also lock down the eval surface.
  • Security: CSV upload tightened — capability raised from upload_files (Author) to manage_options (Admin); extension and MIME validated via wp_check_filetype_and_ext against a CSV / TXT whitelist; filename sanitized with sanitize_file_name so a path like ../../wp-config.php can't escape the imports dir. Plugin activation and every subsequent upload now drop a .htaccess (deny-all) plus an empty index.html into the imports directory, so even if the server is misconfigured to execute PHP under wp-content/uploads/ the imports dir is still non-executable / non-listable.
  • Security: SQL injection hardening in the postmeta / relationships / variation stages. The strict ssi_is_safe_identifier() helper is now called at every SQL site that interpolates a CSV-derived column name, meta_key, taxonomy, or unique_id_meta_key — not just at table-creation time. validate_column_name() itself switched from a permissive blocklist (which missed backslash, null byte, and %/_ LIKE wildcards) to a strict allow-list ([A-Za-z_][A-Za-z0-9_ \-]*, max 64 chars). String-literal interpolations of those names were converted to $wpdb->prepare() with %s placeholders; the LIKE pattern in insert-postmeta.php additionally goes through wpdb->esc_like() so a meta_key containing % can't match unintended columns. Files touched: stages/core/insert-postmeta.php, update-postmeta.php, upsert-relationships.php, match-existing.php, insert-posts.php, stages/woocommerce/variable-products.php.
  • Security: stripped user:password (and the URL fragment) from image URLs before they hit error_log. Supplier-feed CSVs sometimes carry credentialed URLs and shared-host PHP error logs can leak to other tenants. New helper redactUrlCredentials() on SSI_PostTemplate.

2.38 (13th May 2026)

  • Renamed the import-template classes to carry an SSI_ prefix so they no longer occupy generic global-namespace names that any theme or plugin might also want to declare. ImportTemplateSSI_ImportTemplate, PostTemplateSSI_PostTemplate, CustomPostTypeTemplateSSI_CustomPostTypeTemplate, WooCommerceProductTemplateSSI_WooCommerceProductTemplate. The wp_ssi_imports.base_template column is unchanged — existing rows still carry the legacy strings (e.g. 'PostTemplate') and a new ssi_resolve_template_class() resolver rewrites them at read time, just before new $class($import). No DB migration, no class_alias() (which would keep the old global names occupied and defeat the point of the rename). New imports created via the admin UI or wp ssi create save the SSI-prefixed string directly because the template registry was updated to match. The ssi_template_js_files and ssi_template_css_files filters now pass the SSI-prefixed class name; any add-on that gates on the class name will need to match the new value.
  • Note for add-on authors: external templates that extend PostTemplate directly will need to rename their extends clause to SSI_PostTemplate. The legacy resolver only rewrites at instantiation; it doesn't help with inheritance.

2.37 (12th May 2026)

  • Fixed: wp ssi <id> --workers=1 crashed with "Duplicate key name 'sss_tid'" during the load-csv stage. The 1-worker bypass left segment_from null, which sent load-csv.php down its historical "AJAX/REST/sequential" path — that path drops + recreates the batch table (losing the ssi_uid UNIQUE index that setupBatchTables had just made) and creates its own copies of the sss_tid / sss_post_id indexes, which then collide with the same indexes added by finalizeStage immediately afterwards. The bypass now sets segment_from / segment_to / byte_offset to pose as a single worker covering the whole CSV, so load-csv.php takes the worker code path (tables stay as setupBatchTables left them, inline finalization is skipped) and finalizeStage owns the post-load index creation. Multi-worker mode behaviour is unchanged. Other parallel stages (upload-remote-images, attach-existing-images, fix-attributes) do not have inline finalization that conflicts with finalizeStage, so their bypass behaviour stays as-is.

2.36 (12th May 2026)

  • Gallery image metadata UI is now per-row. Each gallery URL row carries its own four metadata sub-rows (alt text, title, caption, description) directly beneath it. Click "+ Add another image column" to add a fresh URL row complete with its own four metadata sub-rows — handy for CSVs that split each gallery image across separate columns. Pipe-separated single-column users still see one row of five fields and continue to work unchanged. Each metadata sub-row supports CSV Field OR PHP Function, matching every other field mapping in the GUI.
  • Featured image metadata sub-fields now also expose the standard CSV Field / PHP Function method selector, so the user can compute alt / title / caption / description via a function instead of being forced to pick a raw CSV column.
  • load-csv: when gallery metadata is supplied as multiple CSV columns (one per gallery URL row), positions are preserved verbatim — empty metadata slots are emitted as empty strings between pipes rather than being silently dropped, so the metadata stays aligned with the gallery URL list even when individual cells are blank.

2.35 (9th May 2026)

  • Image metadata: optional alt / title / caption / description fields for both featured images and gallery images. Four new sub-rows appear under each parent media field in the admin GUI — pick a CSV column for each, leave blank to skip. Gallery metadata is pipe-separated and position-aligned with the gallery URL list (same | or , separator the URLs use). Metadata is applied during upload-remote-images, attach-existing-images (for posts whose featured image already exists in the media library), and all three branches of attach-gallery-images (previously-imported, freshly-uploaded, and local-search). Existing attachment metadata is updated in place when the user provides new values, so re-running an import refreshes alt text / titles without having to delete the attachment first. Skipped (empty) fields leave existing values untouched.
  • Added 8 new batch-table columns (4 featured_image_*, 4 gallery_image_*) and 4 new columns on the gallery_images aux table (alt_text, title_text, caption, description). New helper applyAttachmentMetadata() on PostTemplate handles the WP-side writes (wp_update_post for title/caption/description, update_post_meta for _wp_attachment_image_alt).

2.34 (9th May 2026)

  • Added External / Affiliate product support for the WooCommerce template — new "External / Affiliate" subsection in the Product Data area with two fields: External URL (_product_url) and Button Text (_button_text). Setting an External URL on any row automatically switches that product to product_type=external so WooCommerce renders the external-link button instead of Add to Cart. Mirrors the existing Downloadable Products pattern; no extra stages, no extra SQL.

2.33 (30th April 2026)

  • Gallery Images now supports multiple CSV columns via a + button in the admin GUI — no PHP function needed when image URLs are split across several CSV fields. Single-column configs save unchanged; multi-column configs save as an array. load-csv collapses everything to a single pipe-separated string so attach-gallery-images stays a single code path.
  • Per-taxonomy multi-value separator. New small input next to each taxonomy field accepts ; , or any character used between multiple terms (flat) or multiple hierarchy paths (hierarchical). Leave blank to keep the existing pipe-then-comma fallback so existing imports do not change behaviour.
  • import-taxonomies CLI progress now shows a single rolling counter ("Adding missing terms: N") instead of per-row SSI_PROGRESS lines. No extra SQL — the counter just increments per actual insert.
  • attach-gallery-images CLI progress is now a single rolling line ("Images Attached: X/Y (N%)") instead of one log line per image.
  • Fixed: Parent grouping field in the GUI was not repopulating from saved JSON on import reload. The schema key is now aligned with the input name everywhere, restoring the round-trip.
  • Fixed: parent synthesized rows now correctly grab terms from first child and aggregated terms where those are used in variations

2.32 (29th April 2026)

  • Added live X/Y progress reporting to five parallel stages: upload-remote-images, attach-existing-images, attach-gallery-images, fix-attributes, and import-taxonomies
  • CLI displays stage progress in the same format as load-csv ("Upload Remote Images: 120/500 — 24%") by parsing SSI_PROGRESS lines emitted by worker subprocesses — no extra DB queries
  • AJAX admin page shows per-worker progress bars and a stage-wide X/Y label driven by processed/segment_total values returned in each batch result — no polling endpoint needed
  • Workers emit SSI_PROGRESS:X/Y to stdout; the CLI orchestrator accumulates worker stdout and parses it, replacing the previous approach that ignored worker output entirely
  • Fixed fix-attributes multi-batch continuation — offset was not being passed back on subsequent AJAX batch calls

2.31.1 (29th April 2026)

  • Stage plan is now driven by import post type rather requiring import id
  • Stages are registered immediately after authorization, making them available to the GUI without needing to run an import
  • Clear error message when no stages are available, with explanation to enter a valid license key
  • Added filter for getMappings for use by add-ons
  • Added multiple public methods to the abstract class for use by add-ons

2.3 (23rd April 2026)

  • Added end-to-end test suite for variable products covering all four import methods (parent+child rows, variations with grouping column, parents only, variations with existing parents) — one test per method under tests/woocommerce/variable-products/
  • Fixed synthesised parent row causing unique-index conflict on _ssi_unique_item_id in composite-UID mode — parent rows now write {group_key}| at INSERT time instead of being blanked and rewritten in a later UPDATE
  • Fixed composite-UID rewrite incorrectly re-concatenating synthesised parent rows (producing {group}|{group}|) — the UPDATE now only targets variation rows
  • Fixed synthesised parent rows missing post_type = 'product' — without it wc_get_product() couldn't resolve the parent, so variations failed to link on the first run
  • Fixed Method 4 (variations with parents already in DB) overwriting the existing parent's title and SKU with blanks — the placeholder batch row now pre-populates with the existing parent's current title / status / post_type / _sku so update-posts is a no-op for those columns
  • Fixed parent matching in composite-UID mode (Method 2 with blank Auto-created parent SKU) — WooCommerceProductTemplate now sets unique_id_meta_key to _ssi_unique_item_id so the parent lookup uses the composite key instead of _sku (which synthesised parents don't have)
  • Added --regenerate <filter> flag to tests/run-tests.sh for rewriting expected-result baselines when plugin output changes legitimately
  • Added CSV normalisation in the test harness so diffs are stable across WP resets — guid, post_parent, and meta__default_attributes columns are masked before comparison (post IDs drift between resets and were causing every test to spuriously "fail")
  • Added tests/README.md documenting the test harness (flags, directory layout, data1.csv/correct-results1.csv incremental pattern, per-method manual verification guide)
  • Added knowledge-base article: "Importing Variable Products" — covers CSV layout, settings, and re-run behaviour for each of the four methods
  • Fixed stray character at top of tests/run-tests.sh and an incomplete ONLYRESET variable declaration that broke arg parsing

2.2 (31st March 2026)

  • Fixed variation settings (Auto-Create Parent Products) not saving/reloading — typo in save handler checked wrong POST field; load handler passed field definitions instead of flat saved values to the UI
  • Reorganised admin UI: Unique Item Identifier now renders at the top of the Product Data section; variation settings moved into the Variable Products subsection
  • Added import file type radio selector (parent+child rows, variations with grouping column, parents only, variations with existing parents) — controls which variation settings are visible and is saved for use by the import runtime
  • Additional options now support section/subsection properties, mirroring the field mapping pattern — templates can place options in specific UI sections by setting section and subsection in PHP
  • Added field_with_method additional option type — renders CSV Field / PHP Function selector matching the standard field mapping layout; used for parent grouping, parent title and parent SKU fields
  • Parent title and parent SKU fields now support PHP Function mode in addition to CSV Field
  • Removed delete (X) button from template-defined fields rendered in Product Data sections
  • Updated tooltips: Unique Item Identifier now mentions "Typically SKU"; Parent Identifier Value now mentions "Typically parent_sku"

2.1 (13th March 2026)

  • Added "Parent identifier field" option to Additional Options for WooCommerce variable product imports — parent lookup is no longer hardcoded to SKU; supports matching against any postmeta key, Post ID, or Post Title
  • Updated "Parent SKU" field label to "Parent identifier value" to reflect that any identifier (not just SKU) can be used, including PHP functions
  • Fixed default attributes CTE to use resolved post_parent linkage rather than hardcoded SKU join — default attributes now work correctly for all parent identifier configurations
  • Parent linking SQL now prevents variation rows matching each other in the batch table (added IS NULL guard on parent_sku for batch-table join path)

2.0 (13th March 2026)

  • Added CSV data quality validation inside load-csv stage: blank unique identifier values are now detected across the full CSV in a single pass and surfaced as a hard error with a per-row summary (up to 10 rows shown) before any WordPress data is written — prevents potential dirty data from bad import data
  • Import is aborted immediately if the configured unique identifier column is missing from the CSV headers entirely

1.99 (3rd March 2026)

  • Updated import selector to use select2 to show more meta data about each import and allow imports to be searchable
  • Updated meta data about import after import is selected including last run info and link to import history
  • Added visuals to RUN NOW button from interface to show progress
  • Added multiple workers to process from CLI or Ajax for stages which allow multiple workers
  • Added custom attributes specific to products (non-taxonomy)
  • Added fallback for default hierarchical taxonomy so that items will always have the taxonomy allocated.
  • Added default language if Polylang installed and user does not select language taxonomy

1.98 (28th January 2026)

  • Added 'sections' for template data - e.g. 'products' section for product-specific data for woo template
  • Fixed CSV Field/PHP Function toggle not hiding the Select2 dropdown when switching to PHP Function mode - was only hiding the original select element, not the Select2 container
  • Added tooltips to fields to help users understand purpose of each field
  • Fixed "View products affected by this import" link
  • Added ability to choose unique identifier for each item rather than requiring SKU

1.97 (20th November 2025)

  • Fixed featured image extractor so that if it's passed a list of images it will use the first one (i.e. you can pass the gallery and featured images the same CSV field)
  • Added individual metric timings as well as the overall stage timings - this will help highlight any potential performance issues that come up in future
  • Added term_exists caching to import-taxonomies stage (reduced 194s to 98s for test file)
  • Massive optimisation for the import-taxonomies stage with batched inserts (reduced 98s to 4s for test file)
  • De-dup of post_names based on existing post_names + new ones (i.e. uses same technique as WP but through SQL)

1.96 (19th November 2025)

  • Further optimisation for local image searching to use post_name instead of post_title and no longer needs to use open-ended LIKE wildcard so it's FAST!

1.95 (19th November 2025)

  • Fixed bug in 'import config' handler where it was not parsing the json
  • Fixed taxonomies list so it only lists taxonomies from the import post type (e.g. not showing Categories on Products, only product_cat instead)
  • Made CSV select searchable and made all select boxes same height
  • Changed default options for new imports to 'delete items missing from previous import'
  • Added new CLI paramter: --delete-all - will delete all posts/products/cpts added by this import id (does not delete terms or images)
  • Added 'thorough image search' option defaulted to off, to speed up local image search for Zippas & GetWaffled

1.94 (18th November 2025)

  • Removed early access auto-update prevention
  • Added full namespacing for plugin update checker to prevent conflicts with 3rd party plugins

1.93 (10th November 2025)

  • Further hardening for collation checks and forced collation for virtual columns in CTEs

1.92 (4th November 2025)

  • Re-added SSI_COLLATION override for those who have mixed or incorrect collation settings in their WP config compared to already created tables
    • add the likes of this to your wp-config.php if you have collation issues: define('SSI_COLLATION', 'DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci');

1.91 (28th October 2025)

  • Fixed issue with custom DB connection (to avoid $wpdb caching overhead) where some servers could provide socket + host

1.90 (6th August 2025)

  • Fixed bug that required a price to be present for new imports

1.89 (27th August 2025)

  • Rewrote the local image searcher code completely for easier maintenance and better performance with big files
  • Fixed local image search for featured image (image must be in the database, i.e. uploaded somehow)
  • Fixed local image search for galleries
  • Fixed issue with variable products - was incorrectly marking parent as variation
  • Improved variable product hardiness - if you incorrectly set parent_sku on the parent in your data, we will figure it out now

1.88 (20th August 2025)

  • Fixed product_type handler so that if users add a product_type taxonomy themselves then that takes precedent (except for variations)
  • Fixed term importer so that e.g. A > B > A is allowed without being considered circular (2nd A should have a different slug)
  • Fixed process-variable-products stage so that product_type is only applied to the parent product, not to variations
  • Fixed issue with duplicate SKUs for child products - duplicate SKUs will now be uniquified

1.87 (5th August 2025)

  • Upgraded terms table so source terms value can be 1000 characters long
  • Added actions ssi_before_import_stages and ssi_after_import_stages
  • Added visuals for Stock control in WooCommerce template

1.86 (25th June 2025)

  • Fixed new automatic stock code so that it will insert/update to postmeta if fields are auto calculated
  • Fixed issue with updating postmeta where existing postmeta value was null

1.85 (24th June 2025)

  • Fixed handling of 4 byte unicode characters coming from Windows CSV files, it now handles 1-4 byte characters from any platform
  • Added automatic handling for WooCommerce stock so you only need to set the _stock field (you can still overrule the automated calc by adding postmeta for any of _manage_stock,_stock_status,_backorders,_low_stock_amount)

1.84 (21st June 2025)

  • Upgraded load-csv again to lower RAM consumption further while handling special characters

1.83 (21st June 2025)

  • Re-added previous load-csv ram-optimisation. Fixed now so it handles 4-byte characters like emoticons etc.

1.82 (20th June 2025)

  • Upgraded keep-sold SQL to account for cancelled orders, pending orders etc, it will only count as sold actually sold and paid for items
  • Keep-sold was also upgraded to work with both traditional and HPOS order processing
  • Minor upgrades to CSS to improve visuals for those with long CSV header names (to avoid wrapping as much as possible on 1080p)
  • Moved keep-sold & other product related deletes SQL code into the WooCommerce template using filters so it has been removed from the abstract class
  • Fixed ocassional collation error at import-taxonomies stage
  • Added new filter for posts and postmeta updates https://www.superspeedyplugins.com/kb/super-speedy-imports/advanced/customising-imports-using-sql-filters/
  • Upgraded attach-gallery-images stage to handle comma separated images as well as pipe separated
  • Added ability to use csv list of stages in the CLI, e.g. wp ssi 1 load-csv,match-existing,update-postmeta
  • Consolidated image upload code and in the process fixed initial featured image upload. There were cases where it would fail on first run, then the image would appear on 2nd run.
  • Refactored some code to tidy up duplicate code and remove unused code
  • Fixed export config to include additional options! (e.g. deletes, continue-on-error)
  • Fixed import history to include rows processed - Clicking the history will show more detail about each stage
  • Merged some edits from @grambam
    • scan uploads for local images (if you do not have // in the image URL, it will search the uploads folder)
    • import history upgraded to format numeric values
    • fixed running imports from JS (through SSI interface)

1.81 (11th June 2025)

  • Added mb_convert_encoding to post_excerpt (short description) too
  • Added validated direct SQL for load-csv stage rather than using wpdb to eliminate memory leak - previously, after 800,000 rows of test file, it consumed 16GB! Now it's about 200MB.

1.80 (10th June 2025)

  • Added mb_convert_encoding to load-csv stage to handle cases where weird encoding can break $wpdb->insert, this on top of wp_kses_post
  • Added full error logging and import abort if any CSV rows fail to import

1.79 (5th June 2025)

  • Improved insert special character handling with improved db insert technique
  • Added wp_kses_post to post_content and post_excerpt (let me know if this slows down your load-csv stage!)

1.78 (3rd June 2025)

  • Upgraded flat-term handler inside load-csv stage to fallback to comma-separated values instead of demanding | separated term names
    • hierarchical taxonomies like product categories still require pipe separation, since categories are far more likely to have commas in their names

1.77 (3rd June 2025)

  • Reduced index length further

1.76 (3rd June 2025)

  • Added index length restriction for cases where term source values are too large for mysql indexes while retaining performance

1.75 (2nd June 2025)

  • Fixed bug in utils so that save-posts and sanitize-terms work correctly now

1.74 (2nd June 2025)

  • Upgraded stage detector so you can delete all post entries and it will automatically avoid running update-posts and insert-posts stages
  • Added filter so other templates can adjust the stages executed

1.73 (6th May 2025)

  • Added a bunch more tests focusing on permalinks
  • Fixed bug in insert-posts stage where it now correctly inserts whatever has had a default mapping applied (e.g. post_name)
  • Added post_name to the list of required fields (for the batch table, it includes defaults to figure out the permalink)
  • Improved the interface code to load the template and check the config before it decides if fields (e.g. post_slug) should be hidden or shown
    • only if you previously used post_slug in the past will post_slug appear - everyone should use post_name to set the slug

1.72 (17th April 2025)

  • Fixed bug with product_type warning which was affecting the load-csv stage.

1.71 (12th April 2025)

  • Fixed downloadable product support with new fields for download type, expiry, and limits - just add meta: _downloadable=yes and _downloadable_url to use
  • Fixed attribute serialization to preserve original attribute order for update items tests
  • Fixed product_type taxonomy - refactored so it uses other taxonomy stages
  • Refactored taxonomy and postmeta processing loop to use new function to guarantee retrieval of all but exactly the columns required from the imports tables
  • Fixed meta updates on 2nd runs and added tests for posts, taxonomy and postmeta updates to different values

1.70 (11th April 2025)

  • Improved auto collation handling - the value back from $wpdb->get_charset_collate is often not what is in use in the database, and for importing, being able to join the tables without adding a collation override is important
  • Cleaned up a lot of code, mostly involving switching to using the class properties instead of duplicating them into local variables
  • Fixed duplicate image upload issue if duplicates were inside the galleries

1.69 (10th April 2025)

  • Fixed bug with WooTemplate extending PostTemplate where Woo child was replacing rather than adding to postmeta to update
  • Added automated test to confirm custom meta like above is loaded and available

1.68 (8th April 2025)

  • Updated JS to show special fields under Post Fields section - these will probably move somewhere else soon, but for now they are back

1.67 (8th April 2025)

  • Enhanced image handling:
    • Fixed featured image import to correctly grab the first image if pipe separated
    • Fixed broken code in image gallery upload, previously images were only importing correctly for galleries if you used delayed image import
    • Increased timeout for image downloads from 100ms to 3000ms - if this slows down your import, use Delayed Image Import
  • Fixed config export to prevent JSON double-encoding issues
  • Added enhanced export functionality for testing:
    • Added featured image URLs to exports
    • Added gallery image URLs to exports
  • Added new simple products test with images & gallery images

1.66 (4th April 2025)

  • Added .gitattributes file to exclude tests folder from released zip file

1.65 (2nd April 2025)

  • Enhanced user interface for better usability:
    • Redesigned file upload interface with improved visual feedback
    • Auto open sections at relevant times, e.g. upload CSV opens the CREATE IMPORT section
    • Added toggle to show/hide unused fields for cleaner interface, defaults to hide when reloading previously saved imports
    • Improved taxonomies sorting in template selection (prioritizing Post and WooCommerce templates for new imports)
    • Other CSS improvements in admin interface
  • Added support for CSV files with full paths from CLI imports tool into the admin interface
  • Enhanced testing infrastructure:
    • Added verbose mode to test scripts with optional detailed output (--verbose flag)
  • Added human-friendly descriptions for postmeta fields

1.64 (1st April 2025)

  • Created comprehensive tools management system with standalone classes
  • Added new CLI commands for better import/export workflow:
    • Export: wp ssi export ./exports/products.csv product - Export products to CSV file
    • Export with options: wp ssi export ./exports/posts.csv --exclude-dates - Export posts excluding date columns
    • Export taxonomies: wp ssi export-taxonomies product ./taxonomy-export.json - Export product taxonomies
    • Import taxonomies: wp ssi import-taxonomies ./taxonomy-export.json - Import taxonomies from file
    • Load config: wp ssi load-config 10 ./import-config.json - Load config into import ID 10
    • Save config: wp ssi save-config 10 ./export-config.json - Save config from import ID 10
    • Create import: wp ssi create "New Import" ./products.csv WooProductTemplate - Create new import
  • Enhanced export functionality with options to exclude date columns
  • Improved SQL generation for more consistent and reliable exports
  • Added SQL syntax error detection to prevent failed imports
  • Improved automated testing infrastructure with better error reporting
  • Added comprehensive test suite for regression prevention

1.63 (31st March 2025)

  • Added new CLI export command to help with automated testing: wp ssi export $post_type $file_name - no config, it just exports everything from wp_posts, wp_postmeta and all the terms for that post type
  • Fixed big issue with fix-attributes - this was only working on 2nd runs, not sure how long for, tests added to prevent it ever happening again
  • Fixed issue with hierarchical taxonomies - child leaf was not getting the correct term_taxonomy_id until UPDATE (2nd run)
  • Added comprehensive tests to wipe, run, export, re-run, export, diff - more to come to guarantee no regressions and get us to Beta

1.62 (27th March 2025)

  • Fixed error handling so that if an actual SQL error occurs then it aborts properly
  • Upgraded hard-error reporting so that it uses the :error from WP CLI (it shows in red in the console rather than white)
  • Upgraded insert-postmeta stage so that it will skip missing meta columns from the import table which can happen, e.g. if _sale_price was not defined
  • Upgraded valid-CSV detection so it works for exports from other places - instead of checking mime type, actually reads the first header row

1.61 (25th March 2025)

  • Fixed bug with deletes from refactoring job

1.60 (25th March 2025)

  • Added all remaining missing columns for config from wp_posts
    • defaults will be used if they are missing (e.g. author will be the current user, date will be current date)
    • any items NOT configured will guarantee those items will NOT be updated, but may be inserted as required (e.g. author, dates, other sensible defaults)
  • Fixed last refactor job - it was working for posts, but not for products
  • Added new CPT template in case anyone wants to experiment with post types other than post or product
  • Found and fixed 1 place preventing simultaneous import execution (so long as it's different import ids)
  • Found and fixed a bunch of other bugs that arose from the refactor job
  • In particular, inserts always insert defaults now for any unspecified import whereas updates never will use defaults

1.59 (10th March 2025)

  • Minor refactoring
  • Added Post template, tested, working
  • Separated all product related stuff out into the WooCommerce-specific template
  • Added import history to admin interface
  • Added import details to admin interface
  • Hardened checks for additional options
  • Fixed issue with HTML special characters in term names (flat terms & hierarchical)
  • Upgraded the sanitize term function to exactly mimic wp_insert_term - should fix any remaining broken term names
  • Added new import-taxonomies stage specific to posts and specific to products
  • Added fallback for terms failing to insert to grab the duplicate term_id and continue the import
  • Added sanitize_terms to clean up the term mess I made
  • Added 2 new tables to record ambiguous term names - e.g. if Dave's stuff is a term name, that could be inserted either html encoded or not, and may not be discovered by the join
  • Added handler to update the term_taxonomy_id's from the ambiguous terms tables
  • Added SSI_RUNNING_IMPORT definition in case anything wants to do or not do stuff when SSI is running
  • Batched up the insert-posts command into 100,000 per batch and added performance metrics to trace slow (200 minutes) performance for 2.7 million row CSV file
  • Renamed save_posts to save-posts, renamed sanitize_terms to sanitize-terms
  • Added --perf option to save_posts to show what's taking time, which function, which plugin

1.58 (4th March 2025)

  • Code refactoring of runtime
  • Improved performance reporting summary
  • Improved logging
  • Fixed issue with attributes to ensure it only updates attributes mentioned in the import
  • Improved resilience of save_posts for the Woo Product template, now uses wc_get_product and $product->save etc
  • Added extra output to end of import to inform admin of how to run the builds for regular woocommerce attributes
  • Fixed issue with attribute/taxonomy import - changed to use wc_create_attribute instead of standard wordpress taxonomy code for attributes

1.57 (21st February 2025)

  • Fixed force delete not working
  • Fixed 'keep sold' items option not being recognised
  • Added lots more logging everywhere
  • Added import summary table at end of import

1.56 (7th February 2025)

  • Fixed progress indicator on save_posts

1.55 (5th February 2025)

  • Fixed 'permanently delete' items vs move to trash - thanks to @AdamDar for this one!
  • Fixed issue with SQL to keep 'previously sold items'

1.54 (4th February 2025)

  • Improved RAM usage for fix-attributes stage
  • Added new execution URL which can be useful for profiling with Code Profiler Pro

1.53 (14th January 2025)

  • Further improvements to image download to ensure it works on as many hosts as possible
  • Fixed fatal error in some paths for image downloads

1.52 (14th January 2025)

  • Increased image download timeout
  • Fixed issue with source image URLs containing query parameters

1.51 (10th January 2025)

  • Fixed CSV upload ajax for brand new users so that the CSV file correctly appears in the dropdown after upload
  • Fixed New Import creation for brand new imports, so that the import loads properly after creation
  • Fixed deletes - it was referencing the old meta key name, updated to use ssi_updated and deletes are working like before

1.50 (24th December 2024)

  • Added continue-on-error functionality for CSV imports - if a row or term fails, it will be logged and the import will continue
  • Fixed function editor initialization to properly use full code editor with PHP syntax highlighting

1.49 (23rd December 2024)

  • Optimised load-csv stage by eliminating need for get_existing_terms at small cost of extra RAM consumption
  • Small optimisation for the insert_flat_terms code by moving index creation on that table to the end of load-csv stage
  • Optimised load-csv stage using more memory efficient way of reading the CSV file

1.48 (20th December 2024)

  • Added version number to output so I can be sure which version clients are using - some hosts set opcache really high so it can still be using old code on some hosts even if updated through wp-admin

1.47 (20th December 2024)

  • Fixed bug with hierarchies being too long - previous limit of 200 characters was lifted (no limit now other than 200 char limit for each term name in the hierarchy)
    • However, this is in contradiction with WordPress - because they uniquify the slug, their uniquify function can create slugs > 200 characters which then fail
    • There's a new filter added to wp_unique_term_slug to reduce the size of the slug and still ensure it's unique so our import can handle any number of X > Y > Z terms so long as each component term name is < 200 characters

1.46 (18th December 2024)

  • Fixed memory leak in fix-attributes stage - it was from a call to WordPress core function update_user_meta - even though I only asked to update user meta, it also caches the meta for that item

1.45 (13th December 2024)

  • Added PHP directive to display errors to CLI output for cases of some hosting environments having everything off
  • Added better debug to failed function eval so you now find out exactly which column has a bad function defined for it

1.44 (12th December 2024)

  • Fixed issue with saving PHP functions - was working if the function was still in codemirror/expanded view, otherwise was saving nothing

1.43 (11th December 2024)

  • Fixed taxonomy matching bug introduced in 1.35
  • Fixed save import broken if taxonomy with function (not csv mapping) was in the import
  • Found and fixed a bug affecting terms with parents being mistakenly matched with parentless terms
    • this in turn caused some terms to not be attempted to import and subsequent checks to fail because of these terms being missing
  • Added CSV file name for configured template to template info at top of interface
  • Added links to let admins see products affected by this import
    • also added dropdown filter to edit.php?post_type=product so users can filter on there to view products last affected by X import
  • Big speed boost for upsert-relationships stage - it's as fast as it should be again, e.g. 50,000 items 0.5s now compared to 5+ minutes previously
  • Strengthed wp_posts update so it runs one update per column and checks which rows to set based on source being not null and not empty
  • Added performance info for load-csv stage which is often the slowest stage

1.42 (6th December 2024)

  • Proper fix for tab-separated files - previously I only fixed the import interface, now fixed the actual import run too to handle tab separated files properly

1.41 (6th December 2024)

  • Fix for tab-separated files

1.40 (29th November 2024)

  • Fix to allow spaces in CSV file names...

1.39 (29th November 2024)

  • Added alert if trying to load an import to edit when the CSV file has been deleted - it's currently needed for reference
  • Added early-access auto-update prevention mechanism - users have to very clearly and deliberately enable auto-updates to mess up their live site - if you want to enable auto updates on dev or staging, add define('SSI_ALLOW_AUTO_UPDATE', true); to your wp-config.php
  • Added run now button to interface for small imports

1.38 (29th November 2024)

  • Improved default template to remove unused fields
  • Hidden tax and postmeta entries which are meant to be hidden
  • Added prevent creation of import with no name
  • Added duplicate import name check
  • Added new cli parameter list-files - e.g. wp ssi 20 list-files - will list files compatible with this import template
  • Added new cli --file parameter - e.g. wp ssi 20 --file="alternative.csv" will use import 20 but against the alternative.csv file - this will barf if the headers are different

1.37 (27th November 2024)

  • Fix for new settings to clear the local transient cache when the license key is changed
  • Added a new 'recheck now' button on the license key page for when users renew or upgrade

1.36 (21st November 2024)

  • Tidy up and standardisation of new license/settings page

1.35 (21st November 2024)

  • Speed boost for stage 1 - load-csv stage
  • Fix for stage 2 - import-taxonomies - no more reporting error when no error occurred, and fixed bug with duplicate term names in different taxonomies
  • Upgraded warning messages inside functions to Fatal Errors - this helps debug failing functions, just fix all the warnings so the code can run

1.34 (20th November 2024)

  • Fixed broken function calls - since I added the pretty textareas, the functions were not saving properly
  • Updated the JS to use time() for admin so ugosprint definitely gets the latest JS

1.33 (19th November 2024)

  • Added _default_attributes hidden field to batch import table
  • Use _default_attributes to store first variation from table selected per variable product
  • Updates variable product parents efficiently to set the default variation using _default_attributes
  • Fixed all slugs to be sanitized - for post_name and for attribute names when they are used as keys

1.32 (16th November 2024)

  • Fixed JS/CSS loading issue for certain versions of Scalability Pro (shared Settings file)

1.31 (13th November 2024)

  • Fixed issue with additional options (delete items missing from previous import) from appearing multiple times as you loaded each import
  • Added code to hide the 'hidden' fields in posts

1.30 (12th November 2024)

  • Fixed various warnings

1.29 (12th November 2024)

  • Fixed bug where everything was being marked as variable product, even simple products
  • Fixed new bug with postmeta _regular_price where it was checking the function rather than the stage table for whether it should upsert or not

1.28 (12th November 2024)

  • update-postmeta stage adjusted to increase performance
  • Updated post-update and post-insert to not set the value if the source column is null
  • Added post-slug field - by default, a sanitized post_title will be used for the post slug, but you can overrule this by setting a value for the post slug - if slug and post title are not set, the post_name will not be changed
  • Added variation control into the taxonomy section
  • Integrated variation control with previous hard-coded variations list

1.27 (8th November 2024)

  • Reduced key size for hierarchical tables to acommodate 4-byte unicode collations
  • Removed fallback to try to convert from wpallimport function - it was failing badly

1.26 (8th November 2024)

  • Renamed stages to useful names
  • Tidied up SQL code especially since no guarantee of execution order
  • Fixed some warnings

1.25 (8th November 2024)

  • Commented out the eval method for function calling in postmeta

1.24 (8th November 2024)

  • Added variable product capability

    • in dev, you need to configure your variation attributes with:

      define('SSI_HARD_CODED_VARIABLE_TAXONOMY_ARRAY', array('pa_size', 'pa_colour'));

1.23 (7th November 2024)

  • Added new code to let templates add and alter additional options
  • Added additional options section to end of import with save/load/conditional appearance
  • Added 3 new delete options to let people configure how they want their deletes handled

1.22 (4th November 2024)

  • Fixed bug with flat term import where import failed if term name was empty in csv

1.21 (22nd October 2024)

  • Fixed hierarchical taxonomies so they are correctly set with parents in the database - also confirmed existing terms are being retrieved correctly
  • Also upgraded multi-term inserts, so if you have e.g. Cat1|Cat2|Cat3 > Cat4 then the item will be allocated to Cat 1, Cat 2 and Cat 4 correctly
  • Fixed term inserts and checks for terms when you have the likes of: Salt & Pepper > Salt|Salt & Pepper > Pepper, so it correctly assigns the parent for the 2nd term Pepper to be Salt & Pepper
  • Updated code to use the decimal separator correctly for prices

1.20 (3rd October 2024)

  • Fixed bug in wp ssi 3 save_posts command - it was just re-running all instead of doing the save_posts

1.19 (30th September 2024)

  • Fixed bug for terms with html encodable text in their name (typically &)
  • Improved speed by fixing collation issue
    • rather than trusting default collations in WP, i pull the collation from wp_terms since this is what ultimately is joined to on text columns
  • Hard errors now correctly stop the script and output the error in RED
  • Vastly improved debug and error output to help trace problems more quickly

1.18 (25th September 2024)

  • Added gallery image support
  • Added checks at start to ensure you have an SKU (for now, there will be other ways of identifying the same item in future)

1.17 (24th September 2024)

  • Added featured image import
  • Added --verbose mode

1.16 (17th September 2024)

  • Fixed the collation issue some users were having
  • Added taxonomy export/import as extra option - this makes it far easier for me to replicate exactly what users see
  • Fixed an issue with importing terms where the term name was used in another taxonomy
  • Tested multiple imports, everything imported fully

1.15 (14th September 2024)

  • Added pa_ real name indicators to interface for taxonomy
  • Fixed flat taxonomy issue with missing terms after import - all terms are fully loaded now

1.14 (12th September 2024)

  • Improved error logging for broken functions so you can see which one needs attention

1.13 (6th September 2024)

  • Added optional collation config for those who have mismatching collations in their defaults versus actual tables
    • add the following to your wp-config: define('SSI_COLLATION', 'DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci');
    • change the collation to whatever your tables are and this will fix collation issues
    • to see your table collations run SHOW TABLE STATUS

1.12 (4th September 2024)

  • Fixed stupid mistake of hardcoding my dev table name into stage 2!

1.11 (4th September 2024)

  • Much more work and fixes for hiearchical taxonomies
    • tested with flat and hiearchical, tested 5 levels deep
    • only setting leaf term, not all the ancestors
  • Fixed attributes
    • product attributes now work properly and are loaded in stage 10
    • this stage may be removed if I can get this back into stage 1 where the array should be defined and where this should work

1.10 (3rd September 2024)

  • Speed boost by eliminating duplicates in the _hieararchies table

1.09 (3rd September 2024)

  • Code inspected everything related to taxonomies
    • fixed hierarchical taxonomies not being set in destination

1.08 (29th August 2024)

  • Added debug for user functions
  • Added check for array type to avoid potential fatal error

1.07 (28th August 2024)

  • Added export/import for templates
    • export will export to file, but also gives you the export in the textarea to copy/paste
    • import involves pasting the import config in the textarea then hitting import
  • Fixed error with decimal place not being sent to the server for new imports
  • Changed default mapping types to 'Direct Mapping' rather than 'function' since this should be most of the cases
  • Ajaxified everything to reduce confusion for new users

1.06 (13th June 2024)

  • Added txt file compatibility
  • Added semi-colon separator compatibility
  • Tidied up the interface a little
  • Added multi-hierachical term capability (so you can have 2+ product cats per item)
  • Fixed other taxonomy related bugs
  • Optimised the code a bit
  • Found a bunch of bugs in taxonomy, fixed more
  • Added multi-product_cat compatibility
  • Fixed collation and charset so it pulls from $wpdb

1.05 (31st January 2024)

  • Fixed additional columns defined in template
    • these are now correctly added to the flat mappings table if the user did not add them
    • the mapData function is properly called now so any template mappings or additional data massage can occur

1.04 (30th January 2024)

  • Added commas as decimals handler in the Woo import template
  • Added infinite time limit in case wp cli badly configured

1.03 (30th January 2024)

  • Fixed import bug to handle dashes in attribute names and postmeta keys

1.02 (30th January 2024)

  • Added functions editor to interface
    • also eval these functions at import time through wp cli
    • you must trust people who can edit these functions obviously

1.01 (29th January 2024)

  • JS Fix for new imports to load default values for postmeta

1.00 (29th January 2024)

  • Very first working version including interface
    • please read the knowledge-base guide to understand how to use this, in particular how to use the function system
×
1/1