=== Vanquish Upload Files for WooCommerce ===
Contributors: vanquish83, freemius
Tags: woocommerce, file upload, upload, print on demand, checkout upload
Requires at least: 5.9
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.3.14
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Let customers upload files (even large!) on the product, cart, checkout and order pages — for custom, personalized and print-on-demand products.

== Description ==

**Vanquish Upload Files for WooCommerce** lets you collect files from your customers — logos, artwork, documents, photos — exactly where you need them: on the product page, in the cart, during checkout, or on the order details page.

Whether you run a print shop, a personalization service, or any store that sells custom products, this plugin makes it effortless for customers to provide the files you need to fulfill their orders, with a clean upload experience and a real-time progress bar.

**Large files are handled properly.** Every upload is split into chunks and reassembled on the server, so a single request never runs into the size limit your host or CDN enforces — the usual cause of an upload that dies at 90% with no explanation.

= Why store owners choose it =

* Receive uploads bound to each order — no more chasing files over email.
* Show upload fields exactly where they make sense: product, cart, checkout, order pages.
* Make uploads **required** so customers can't order without providing their files.
* Restrict by file type, size and image dimensions.
* Get notified by email the moment a customer uploads a file.
* Fully translatable, WPML-ready.
* **Handle large files on any host** — uploads are split into chunks, so no single request runs into your server's or your CDN's size limit.

= What's included for free =

* Multiple upload fields per product
* Single file per upload field
* Display on product, cart, checkout and order pages (classic and block-based cart & checkout)
* **Individual products** — add the same product multiple times with distinct uploads
* Require an upload before add-to-cart or checkout
* File type, size and dimension restrictions
* Admin email notifications
* Upload progress bar, file delete, image/audio/PDF preview
* **Chunked uploads for large files** — with automatic retry on a failed chunk
* WPML-ready translatable button texts

= Premium features =

The Premium version, distributed separately, adds:

* **Multiple files per upload field** — let customers attach several files to a single field
* **Image crop editor** with rotation and aspect-ratio control
* **Extra costs & discounts per uploaded file** — fixed or percentage
* **Per-second** (audio/video), **per-file-size** and **per-PDF-page** surcharges
* **Set the product price based on the number of uploaded files**
* **Cloud storage**: Dropbox, Amazon S3 and Google Drive
* **Approve / reject** uploaded files with customer feedback
* **Visibility rules** by product, category, user role, order status, payment gateway, shipping method and time
* **Show the upload fields from the last order** on the My Account dashboard
* **Advanced shortcodes** to place upload forms anywhere
* Priority support and updates

== External services ==

This plugin connects to the following third-party services.

**Freemius** — Used to deliver plugin updates, manage the optional Premium license, and (only if you opt in) collect anonymous usage data to help improve the plugin. Your site URL and basic environment information are sent to Freemius when you activate the plugin, check for updates, or activate/deactivate a license. Provided by Freemius, Inc.
Terms of Service: https://freemius.com/terms/
Privacy Policy: https://freemius.com/privacy/

**Cloud storage (Premium only)** — The free version stores uploaded files on your own server and uses no external storage. If you enable a cloud storage destination in the Premium version, the files your customers upload are sent to the storage account you configure, and only at the moment an order is created (when the customer reaches the order-received/thank-you page, or uploads files on the thank-you or order details page). Files are never sent before an order exists. Available providers and their policies:

* Dropbox — Terms: https://www.dropbox.com/terms — Privacy: https://www.dropbox.com/privacy
* Amazon S3 (AWS) — Service Terms: https://aws.amazon.com/service-terms/ — Privacy: https://aws.amazon.com/privacy/
* Google Drive — Google APIs Terms: https://developers.google.com/terms — Privacy: https://policies.google.com/privacy

== Installation ==

1. Upload the plugin files to the `/wp-content/plugins/vanquish-upload-files-for-woocommerce` directory, or install the plugin through the WordPress Plugins screen directly.
2. Activate the plugin through the 'Plugins' screen in WordPress.
3. Make sure WooCommerce is installed and active.
4. Go to the **Upload field configurator** menu to create your first upload field.
5. Choose on which pages the field appears (product, cart, checkout, order). Fine-grained visibility rules (by product/category, role, gateway, shipping method and time) are available in Premium.

== Frequently Asked Questions ==

= Does it work without WooCommerce? =

No. WooCommerce must be installed and active, since uploads are bound to WooCommerce products and orders.

= Which product types are supported? =

Native WooCommerce simple and variable products. Custom product types added by third-party plugins are not officially supported.

= How many files can customers upload in the free version? =

The free version supports multiple upload fields per product, with one file per field — you configure how many fields to add in the Upload field configurator. The separately distributed Premium version adds multiple files per upload field, cloud storage (Dropbox, Amazon S3, Google Drive), the image crop editor and full PDF preview, among other extras.

= Can customers upload large files? =

Yes, and there is nothing to configure. Every upload is split into chunks in the browser and reassembled on the server, so the file never travels as a single request - which is what usually produces a 413 error behind Cloudflare, a reverse proxy, or a host with a low `post_max_size`.

The chunk size is taken from your own server limits - the smaller of `post_max_size` and `upload_max_filesize` - and never exceeds 10 MB, however large the file is. If a chunk fails it is retried on its own instead of restarting the whole upload, and the server checks the reassembled file against the size the browser reported before accepting it.

This works in the free version too. What still applies is the maximum size you set on the upload field itself, along with your server's disk space and PHP execution time.

= Does it support the block-based cart and checkout? =

Yes. Both the classic (shortcode) and the block-based WooCommerce cart and checkout are supported. On the block cart/checkout the upload fields appear in the order-summary area.

= Is it translatable? =

Yes. All button texts are translatable, and the plugin is WPML-ready — you can set distinct texts per language.

= Where are uploaded files stored? =

By default on your own server. Premium adds Dropbox, Amazon S3 and Google Drive as storage destinations.

= Can I place the upload form anywhere with shortcodes? (Premium) =

Yes. The Premium version provides shortcodes to render the upload form on any page:

* `[vanupfi_upload_form]` - a generic upload form.
* `[vanupfi_product_page_upload_form]` - the product-page upload form.
* `[vanupfi_cart_page_upload_form]` - the cart upload form.
* `[vanupfi_checkout_page_upload_form]` - the checkout upload form.
* `[vanupfi_upload_form_last_order]` - the upload form for the customer's last order.

**Important:** when you place one of these forms on a page, enable *Disable standard upload-field management* for the matching page (in the plugin options) so the upload fields are not rendered twice. For example, if you use the product-page form shortcode, disable standard management for the Product page.

**Migrating from the CodeCanyon version?** The old `[wcuf_...]` shortcodes keep working as aliases of the new `[vanupfi_...]` ones, so you do not need to edit your product content.

= I migrated from the CodeCanyon version and my shortcodes show as plain text (Premium) =

The shortcode prefix changed from `wcuf_` to `vanupfi_`. Since version 1.0.11 the old tags keep working as aliases, so simply updating the plugin is enough. If you prefer to update your content, the mapping is 1:1:

* `[wcuf_upload_form]` -> `[vanupfi_upload_form]`
* `[wcuf_product_page_upload_form]` -> `[vanupfi_product_page_upload_form]`
* `[wcuf_cart_page_upload_form]` -> `[vanupfi_cart_page_upload_form]`
* `[wcuf_checkout_page_upload_form]` -> `[vanupfi_checkout_page_upload_form]`
* `[wcuf_upload_form_last_order]` -> `[vanupfi_upload_form_last_order]`

= How much does Premium cost? =

You can see all Premium plans and prices on the pricing page: https://vanquishplugins.com/migration/pricing/ - single site or 3, 5 and 10 sites, billed monthly, yearly, or once (lifetime). The same plans are also shown inside the plugin, under the "Upgrade" menu.

= I bought this plugin on CodeCanyon. How do I get the Premium version? =

The CodeCanyon item (WooCommerce Upload Files) has been retired and continues here as the free Vanquish Upload Files for WooCommerce. Existing CodeCanyon customers can convert their purchase into a Premium license - including 1 year of updates and support at no extra cost - on the migration page: https://vanquishplugins.com/migration/

== Screenshots ==

1. The Upload field configurator - create and arrange your upload fields.
2. Upload field on the single product page.
3. Upload field on the cart page.
4. Uploaded files on the admin order page, with per-file download and download-all-as-zip.
5. Uploaded files on the customer's order details page, with download / view.
6. Free vs Premium - feature comparison at a glance.

== Changelog ==

= 1.3.14 =
* Fix: uploads could fail on servers where PHP accepts less than 10 MB per request, because the plugin compared PHP's upload limits as text instead of as sizes and picked the wrong one.
* Fix: the delete confirmation added in 1.3.13 is now translated into German, Spanish, French, Italian, Polish and Portuguese.

= 1.3.13 =
* Improvement: customers are now asked to confirm before deleting a file from their order, on the Order details and Thank you pages. Administrators have always been asked; customers, who are the ones likely to reach for the wrong file, were not. Files that have just been uploaded and do not belong to the order yet are still removed without a question, since undoing one costs nothing but uploading it again. Suggested by a user.

= 1.3.12 =
* Fix (Premium): files were not reaching Google Drive on PHP 7.4. The connection worked and the folders were created, but the transfer of the file itself failed and the file stayed on the server. The cause was a conflict between plugins rather than anything in your settings: a component the plugin uses reported an internal deprecation notice through a function shared by every plugin on the site, and if another plugin had already supplied a newer version of that function, built for PHP 8.1, the call failed on PHP 7.4. The plugin no longer depends on that shared function during an upload. Reported by a user.
* Fix: on order pages with an uploaded file, two PHP notices per file were written to the debug log on every page load. Nothing was broken by them, but a log full of noise makes real problems harder to see.

= 1.3.11 =
* Fix (Premium): Google Drive did not work on PHP 7.4, although the plugin requires PHP 7.4 and advertises Google Drive as a premium feature. The Google library the plugin carries had been built for PHP 8.1, so renewing the connection to Drive ended the request with a fatal error on any site running 7.4. The library is now built for PHP 7.4, as it always should have been. Reported by a user.
* Fix (Premium): connecting to Google Drive could stop working and leave nothing behind but a fatal error in the log. Several causes at once: the stored connection was thrown away whenever the Auth code was changed - which is what anyone does to try and fix a Drive problem - and it was not saved at all when Google answered without a refresh token, which is what happens when an account authorises the plugin a second time. On top of that, the JSON file downloaded from the current Google Cloud console no longer contains the redirect address the connection needs, so a correctly configured account failed too. Reported by a user.
* Improvement (Premium): the plugin now asks Google only for the files it creates itself, rather than for access to your whole Drive. Existing connections are unaffected and keep working; a new connection gets the narrower permission, and Google no longer shows the "unverified app" warning while setting it up. The setup guide has been shortened accordingly.
* Fix (Premium): when a cloud service could not be reached, the upload ended in a fatal error instead of doing what it was written to do - keep the file on the server and email the shop administrator. Affected Google Drive, Dropbox and Amazon S3 alike.
* Improvement (Premium): the Google credentials of your shop are no longer sent to the authorisation page as part of the web address, where web servers record them in their logs. They travel in the body of the request instead.
* Fix: the Download / View button appeared in English in German, Spanish, French, Polish and Portuguese after its label was shortened in 1.3.10.

= 1.3.10 =
* Fix (Premium): the number of pages of a PDF was counted wrongly, in two different ways. On files written in the modern compressed format the count came out as one whatever the document; on the others it could be taken from the table of bookmarks instead of the page tree, so a fourteen-page document was charged as six. Reported by a user.
* Fix: PDF files never showed a thumbnail. The attribute naming the file to draw was being removed from the markup before it reached the browser.
* Fix: activating the premium version while the free one was still active ended in "The plugin could not be activated because it triggered a fatal error", with nothing written to the log. The two copies now notice each other and the notice says which one to deactivate. Reported by a user.
* Improvement: the Download and Preview buttons under an uploaded file are now the same kind of control, the same size, and each on its own line. In the block-based Cart and Checkout the download control used to render as a plain link rather than a button.

= 1.3.9 =
* Security (Premium): the PDF preview no longer depends on the bundled flipbook library. That library carried its own copy of the PDF rendering engine, dating from 2019, which a published advisory covers: opening a specially crafted PDF could run JavaScript in the context of your site. The files this plugin previews arrive from strangers and are opened by you, so the component has been replaced with the current, maintained PDF.js viewer. Two further precautions come with it - the part that executes JavaScript embedded in a PDF is not shipped at all, and the setting that would enable it is switched off. Thumbnails were never affected: they already used a current version.
* Improvement (Premium): the preview now opens the whole document, with page navigation, text search, zoom and printing. The page-turning animation is gone, and everything it let you do you can still do.
* Fix (Premium): PDFs written in the modern format - anything from PDF 1.5 onwards, which is most of what current software produces - could be counted as having zero pages. With page detection enabled that became a quantity of zero, and the customer could not add the product to the cart at all, with nothing on screen explaining why. Reported by a user.
* Fix: every upload of every type was read into memory in full to look for PDF pages, even when no page count was needed, and even in the free version where the setting that uses it does not exist.
* Improvement: 4.7 MB of debugging files were being shipped to every site and no longer are.

= 1.3.8 =
* Improvement (Premium): on the upload fields screen, the visibility summary is now a column of its own, and it says which way the rule points. A field restricted to a few categories and a field hidden from those same categories used to show the same list of names; the summary now states whether the names are where the field appears or where it does not, and colours them to match. A rule that selects nothing at all now says so, instead of reading as no restriction. Product ids moved from the list into a tooltip, so the summary reads as names.
* Improvement (Premium): the Edit link on that summary opens the field options straight at the Product/Category restriction section, instead of leaving you to find it.
* Fix: the two "Add new Upload Field" buttons on the same screen were styled differently.

= 1.3.7 =
* Fix: the plugin no longer fills the WordPress debug log with a "translation loading was triggered too early" notice. Nothing was broken by it, but the line was written for every admin page and for every file a customer uploaded, which on a busy store buries whatever you were actually trying to read in the log.
* Housekeeping: the declared "WooCommerce tested up to" version now names the release the plugin was really tested against, instead of a number set far in the future.

= 1.3.6 =
* Security: deleting an uploaded file, or editing the note attached to it, now requires proof that the request comes from the order it belongs to. The plugin accepts the shop manager, the signed-in customer who placed the order, or a visitor holding that order's own link - the same check WooCommerce uses for the order links it sends by email. Until now these actions only verified that the request had been made from a page of the site, which every visitor can obtain, so files attached to someone else's order could be removed or altered. Thanks to Brian for reporting this privately. Updating is recommended for every store.

= 1.3.5 =
* Fix: uploads are now verified from end to end. The plugin checks that every part of a file really reached the server and was written to disk, that the reassembled file is exactly the size the browser sent, and it confirms each step explicitly instead of assuming it worked. Before this, a part lost on the way - to a firewall, a proxy, a full disk - could go unnoticed and produce a damaged file with no warning shown to the customer, and a file the plugin had itself refused could end the upload in silence. Retrying a file also used to add the new attempt on top of the incomplete one; it now starts the file cleanly.

= 1.3.4 =
* Fix: on sites that merge, combine or defer JavaScript, the upload area could fail to appear on the product page. It was most visible on variable products, where choosing a variation left an empty gap where the upload field should be. The plugin relied on one of WordPress's own script libraries being loaded before its own; when an optimisation plugin changed that order, the plugin's script stopped at its first line and nothing after it ran, uploads included. The plugin now works whether that library is there or not, and no longer needs it.

= 1.3.3 =
* New (Premium): an "Activate License" page in the plugin menu, shown when the Premium version is installed but no licence has been activated yet. Until now the only way in was a link on the Plugins screen, which is easy to walk past - and if it was missed, the settings kept showing "Upgrade to Pro" to someone who had already paid. The page disappears by itself once a licence is active. The free version is not affected.

= 1.3.2 =
* Fix (Premium): a PHP fatal error - "Call to undefined function vanupfi_fs()" - when WordPress is loaded through WP-CLI or with WooCommerce not active. Server control panels such as Plesk WP Toolkit use WP-CLI for updates, backups and cache resets, so those tasks failed while the site itself kept working normally, which made it easy to miss. The free version was never affected.

= 1.3.1 =
* New: an "Activate Premium" page, in the plugin menu and linked from the Plugins screen, explaining how to move to Premium after buying it. The free version published on WordPress.org does not contain the premium code at all, so it has no licence field and a key would have nothing to unlock - Premium is a separate download instead. That is easy to miss once you have paid, so the page walks through signing in to your Freemius account, downloading the Premium .zip and installing it, and confirms that your upload fields, your options and the files already uploaded on existing orders are all kept.

= 1.3.0 =
* Change: extra costs per uploaded file, extra costs per second of audio or video, and the order sub-total discount now apply only while a Premium licence is active. They are Premium features, and the free version does not show the screen on which they could be seen or turned off - so a shop whose licence had lapsed kept charging customers, or kept handing out the discount, on the strength of a setting nobody could reach any more. If that describes your shop, those charges stop with this update. Nothing is deleted: every amount and option is kept exactly as it was and starts applying again as soon as Premium is active.
* Fix: saving the upload field configurator without an active licence no longer erases the Premium settings of your upload fields. Those sections are not displayed without a licence, so saving the page - even just to change a field title - was storing them as switched off, and the crop settings, visibility rules, size and DPI limits and every cost amount were lost for good; renewing did not bring them back. They are now left untouched.
* New: if upload charges are configured while no licence is active, the plugin now says so once in the WordPress admin, so the change is explained instead of silent.

= 1.2.0 =
* New (Premium): extra costs can now be charged based on the size of the uploaded file. Set a price per MB (or per KB), optionally with an amount that is not charged and a cap beyond which nothing more is added. Available in the upload field configurator, under "Price, fee & discount". The charge applies only while a Premium licence is active; if the licence lapses the charge stops instead of continuing with no way to adjust or remove it, and the configuration is kept for when Premium is active again.
* Fix: in the classic cart and checkout, the "Total extra costs" line could show zero. It is now taken from the same calculation that produces the cart fees, so it no longer depends on where the upload area is positioned on the page.
* Fix: the extra cost per second was shown next to each file but was not counted in the Totals area. Charged amounts were always correct; only that summary line was incomplete.
* Improvement: the plugin admin screens now use the WordPress admin colour scheme.

= 1.1.0 =
* Fix: on the free version, an upload field restricted to selected products or categories (a setting that comes from the Premium visibility rules, typically after migrating from a Premium install) stayed hidden on every other product, with no way to change it. Such fields are now shown on all products. The original restriction is preserved and applies again automatically as soon as Premium is active.

= 1.0.17 =
* Minor improvements.

= 1.0.16 =
* Minor improvements.

= 1.0.15 =
* Fix: resolved a PHP 8 fatal error on the product/cart/checkout and order pages that could occur when the "Info to report in the Totals area" option had no value saved. Array-type options are now always handled safely.
* Fix: the uploaded-files summary box now renders the file list correctly (with names, previews and download links) instead of showing raw HTML text.
* Hardening: the summary box display setting is treated defensively to avoid any edge-case error.

= 1.0.14 =
* Fix: resolved a PHP 8 fatal error on the product page (and cart/checkout) that could occur when the "Disable standard upload-field management" option had no value saved. The option is now always treated as a list, so the pages render correctly.

= 1.0.13 =
* Fix: on WordPress 6.7+, activating the plugin could break front-end product pages (a "translation loaded too early" notice printed into the page). The admin settings screens are no longer built on front-end requests, which resolves this and also speeds up front-end page loads.
* Internal: removed a small piece of unused, unreachable code.

= 1.0.12 =
* Fix: leftover pieces of interrupted uploads were not being cleaned up from the temporary folder. They are now removed once they are more than two hours old.
* Fix: the temporary-file cleanup can no longer remove a file that a shopper has already uploaded and is still using during the same visit.
* Improvement: the clean-up of uploads whose product was removed from the cart no longer runs as a side effect of the cart fee calculation, which makes it predictable and removes a class of edge cases around order completion.
* Internal: removed a leftover admin endpoint (and its unused scripts) from the days when the plugin asked to restore the classic Cart/Checkout templates. Blocks have been supported since 1.0.4.

= 1.0.11 =
* Fix: the upload-form shortcodes are now always registered, so WordPress no longer prints the raw `[vanupfi_...]` tag on the storefront when the Premium code is not active. Store administrators see a short explanation instead; visitors see nothing.
* Improvement: the legacy `[wcuf_...]` shortcodes from the CodeCanyon version now work as aliases of the current `[vanupfi_...]` ones, so migrated sites do not need to edit their product content.

= 1.0.10 =
* Fix: uploaded files could be lost (neither moved to the destination folder nor attached to the order) when placing an order through the classic/shortcode checkout while the "Checkout - Files to order association method" option was set to the "Thank you page" value. Files are now correctly associated across all checkout types.
* Fix: resolved a PHP 8 fatal error ("Unsupported operand types") that could occur on some configurations while rendering the frontend styles.
* Improvement: more robust parsing of the server PHP size limits (post_max_size / upload_max_filesize) and general dead-code cleanup.

= 1.0.9 =
* Internal: updated the HTTP library (Guzzle) bundled with the premium cloud-storage integrations to v7, to prevent version conflicts with other plugins. No functional changes to the free version.

= 1.0.8 =
* Internal: Updated the Freemius SDK to the latest version.

= 1.0.7 =
* Internal: PSR-4 SPL autoloader for the plugin classes; bootstrap simplified and dead code removed. No functional or user-facing changes.

= 1.0.6 =
* Fixed: in the free version the upload area did not appear on the Cart block; it now loads correctly.

= 1.0.5 =
* Fixed: on some block-based (FSE) themes the upload area did not appear on the Cart block; the upload fields now load correctly there. The Checkout block was unaffected.

= 1.0.4 =
* WooCommerce Cart/Checkout blocks: upload fields now work with the block-based cart and checkout, in addition to the classic (shortcode) templates.

= 1.0.3 =
* Internal refactor: introduced PSR-4 namespacing and dropped the legacy class-name prefixes. No functional or user-facing changes.

= 1.0.2 =
* First public release on WordPress.org.

== Upgrade Notice ==

= 1.3.14 =
Fixes large uploads failing on servers where PHP accepts less than 10 MB per request.

= 1.3.13 =
Customers are asked to confirm before deleting a file from their order.

= 1.3.12 =
Recommended for stores using Google Drive on PHP 7.4: files that were being kept on the server instead of being sent to Drive now transfer correctly.

= 1.3.11 =
Recommended update for stores using Google Drive: connections that stopped working are fixed, and the plugin now asks only for access to the files it creates rather than to the whole Drive.

= 1.3.10 =
Recommended update: PDF page counts are correct again, PDF thumbnails appear, and activating the premium version alongside the free one no longer ends in a fatal error.

= 1.3.9 =
Security release: please update. The PDF preview now uses a current, maintained rendering engine, and modern PDFs are counted correctly instead of blocking Add to Cart.

= 1.3.8 =
Recommended update: the visibility summary now says whether a rule shows or hides the field, rather than only listing the products and categories it names.

= 1.3.7 =
Recommended update: stops the plugin from filling the WordPress debug log with a translation notice.

= 1.3.6 =
Security release: please update. Files uploaded to an order could be deleted or altered by someone other than the order's owner.

= 1.3.5 =
Recommended: uploaded files are now checked end to end, so a part lost in transit can no longer produce a damaged file without anyone noticing.

= 1.3.4 =
Recommended if you use a caching or optimisation plugin that merges or defers JavaScript: fixes the upload area failing to appear on product pages.

= 1.3.3 =
For Premium users who never got round to activating their licence: there is now an "Activate License" page in the plugin menu. Nothing changes for the free version.

= 1.3.2 =
Recommended for Premium users: fixes a fatal error when WordPress runs through WP-CLI or without WooCommerce, which stopped tools like Plesk WP Toolkit from updating the site.

= 1.3.1 =
Adds an "Activate Premium" page explaining how to switch to Premium after buying - the step that is easy to miss, because the free version has no licence field by design.

= 1.3.0 =
Important if you use the Premium extra-cost or discount options: those charges now apply only while a licence is active, and saving the upload field configurator without one no longer erases them.

= 1.2.0 =
Adds extra costs based on file size, and fixes the "Total extra costs" line showing zero on the classic cart and checkout.

= 1.1.0 =
Recommended update for free-version users: fixes upload fields that could stay hidden on most products because of a product/category restriction that could not be changed.

= 1.0.17 =
Minor improvements.

= 1.0.16 =
Minor improvements.

= 1.0.15 =
Recommended update for sites on PHP 8: fixes a fatal error on the product/cart/checkout/order pages when the "Totals area" option is empty, and fixes the summary box showing raw HTML.

= 1.0.14 =
Recommended update for sites on PHP 8: fixes a fatal error on the product/cart/checkout pages when the "Disable standard upload-field management" option is empty.

= 1.0.13 =
Recommended update for anyone on WordPress 6.7 or later: fixes product pages breaking on activation due to an early-translation notice.

= 1.0.12 =
Recommended update: temporary files left behind by interrupted uploads are now cleaned up, and the cleanup can no longer delete a file a shopper is still working with.

= 1.0.11 =
Recommended update for sites migrated from CodeCanyon: the old [wcuf_...] shortcodes work again, and the raw shortcode text is no longer printed on the storefront.

= 1.0.10 =
Recommended update: fixes a case where uploaded files were not attached to the order on the classic checkout, plus a PHP 8 fatal error fix.

= 1.0.9 =
Internal dependency update for the premium cloud integrations. No functional changes to the free version.

= 1.0.8 =
Updated the Freemius SDK. No functional changes.

= 1.0.7 =
Internal code cleanup (autoloader, bootstrap). No functional changes.

= 1.0.6 =
Fixes the upload area not appearing on the Cart block in the free version.

= 1.0.5 =
Fixes the upload area not appearing on the block-based Cart on some themes.

= 1.0.4 =
Adds base compatibility with the block-based cart and checkout.

= 1.0.3 =
Internal code refactor (namespacing). No functional changes.

= 1.0.2 =
First public release on WordPress.org.
