{"id":306734,"date":"2026-07-31T06:08:47","date_gmt":"2026-07-31T06:08:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/anytry-ai-virtual-try-on-for-woocommerce\/"},"modified":"2026-10-25T18:26:22","modified_gmt":"2026-10-25T18:26:22","slug":"anytry-ai-virtual-try-on-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/haz.wordpress.org\/plugins\/anytry-ai-virtual-try-on-for-woocommerce\/","author":21028239,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.39","stable_tag":"1.0.39","tested":"7.1.3","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"AnyTry - AI Virtual Try-On for WooCommerce","header_author":"Anytry","header_description":"Adds AI-powered virtual try-on functionality to WooCommerce product pages.","assets_banners_color":"e7e7e7","last_updated":"2026-10-25 18:26:22","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/anytry.pl\/","header_author_uri":"https:\/\/anytry.pl","rating":0,"author_block_rating":0,"active_installs":0,"downloads":862,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.21":{"tag":"1.0.21","author":"piezak","date":"2026-08-01 14:37:46","revision":3631066},"1.0.22":{"tag":"1.0.22","author":"piezak","date":"2026-08-07 22:31:31","revision":3638330},"1.0.24":{"tag":"1.0.24","author":"piezak","date":"2026-08-12 08:24:48","revision":3643035},"1.0.25":{"tag":"1.0.25","author":"piezak","date":"2026-08-15 16:02:23","revision":3648819},"1.0.28":{"tag":"1.0.28","author":"piezak","date":"2026-08-30 14:14:01","revision":3672653},"1.0.30":{"tag":"1.0.30","author":"piezak","date":"2026-09-04 19:43:52","revision":3681744},"1.0.33":{"tag":"1.0.33","author":"piezak","date":"2026-09-11 13:27:59","revision":3691449},"1.0.34":{"tag":"1.0.34","author":"piezak","date":"2026-09-18 19:17:54","revision":3702635},"1.0.35":{"tag":"1.0.35","author":"piezak","date":"2026-10-07 13:54:19","revision":3732712},"1.0.36":{"tag":"1.0.36","author":"piezak","date":"2026-10-15 14:28:16","revision":3748709},"1.0.38":{"tag":"1.0.38","author":"piezak","date":"2026-10-23 09:42:54","revision":3761318},"1.0.39":{"tag":"1.0.39","author":"piezak","date":"2026-10-25 18:26:22","revision":3765065}},"upgrade_notice":{"1.0.24":"<p>Fixes for iPhone and iPad: your photo is kept while the try-on window is open, and Save works even when the share sheet does not open in time. The numeric size table now runs 32 to 62 instead of stopping at 44, so petite and plus-size shops can enter the sizes they sell. Recommended update.<\/p>","1.0.22":"<p>Adds a pause switch and a staff-only test mode, so you can trial the Try-On with your own team before showing it to customers. Optional \u2014 nothing changes unless you turn them on.<\/p>","1.0.21":"<p>Reliability release for the try-on window: a finished try-on is no longer lost to a temporary network hiccup, two browser tabs no longer cancel each other&#039;s paid try-on, and switching products always shows the right result. Recommended update.<\/p>","1.0.20":"<p>Maintenance: translations now ship as WordPress.org language packs (no bundled catalogs). Includes the 1.0.19 security &amp; privacy hardening. Recommended update.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3631060,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3631060,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3631060,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3631060,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.21","1.0.22","1.0.24","1.0.25","1.0.28","1.0.30","1.0.33","1.0.34","1.0.35","1.0.36","1.0.38","1.0.39"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3631060,"resolution":"1","location":"assets","locale":"","width":2000,"height":1640},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3631060,"resolution":"2","location":"assets","locale":"","width":2000,"height":1640},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3629431,"resolution":"3","location":"assets","locale":"","width":2560,"height":1640},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3631060,"resolution":"4","location":"assets","locale":"","width":2560,"height":2900}},"screenshots":{"1":"The try-on result \u2014 the customer's own photo, wearing the product, generated by AI. A Before \/ After toggle sits above it, add-to-cart and save below.","2":"AI Size Advisor \u2014 the short quiz runs while the try-on generates, so the size recommendation is ready together with the result.","3":"WooCommerce product page \u2014 the \"Try It On\" button in the standard product layout, above Add to cart.","4":"Admin settings \u2014 environment health checks, button visibility, and the Size Advisor \/ Eye Advisor configuration."}},"plugin_section":[],"plugin_tags":[2353,282,7097,148223,286],"plugin_category":[45],"plugin_contributors":[273967],"plugin_business_model":[],"class_list":["post-306734","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-ecommerce","plugin_tags-fashion","plugin_tags-virtual-try-on","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-piezak","plugin_committers-piezak"],"banners":{"banner":"https:\/\/ps.w.org\/anytry-ai-virtual-try-on-for-woocommerce\/assets\/banner-772x250.png?rev=3631060","banner_2x":"https:\/\/ps.w.org\/anytry-ai-virtual-try-on-for-woocommerce\/assets\/banner-1544x500.png?rev=3631060","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/anytry-ai-virtual-try-on-for-woocommerce\/assets\/icon-128x128.png?rev=3631060","icon_2x":"https:\/\/ps.w.org\/anytry-ai-virtual-try-on-for-woocommerce\/assets\/icon-256x256.png?rev=3631060","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/anytry-ai-virtual-try-on-for-woocommerce\/assets\/screenshot-1.png?rev=3631060","caption":"The try-on result \u2014 the customer's own photo, wearing the product, generated by AI. A Before \/ After toggle sits above it, add-to-cart and save below."},{"src":"https:\/\/ps.w.org\/anytry-ai-virtual-try-on-for-woocommerce\/assets\/screenshot-2.png?rev=3631060","caption":"AI Size Advisor \u2014 the short quiz runs while the try-on generates, so the size recommendation is ready together with the result."},{"src":"https:\/\/ps.w.org\/anytry-ai-virtual-try-on-for-woocommerce\/assets\/screenshot-3.png?rev=3629431","caption":"WooCommerce product page \u2014 the \"Try It On\" button in the standard product layout, above Add to cart."},{"src":"https:\/\/ps.w.org\/anytry-ai-virtual-try-on-for-woocommerce\/assets\/screenshot-4.png?rev=3631060","caption":"Admin settings \u2014 environment health checks, button visibility, and the Size Advisor \/ Eye Advisor configuration."}],"raw_content":"<!--section=description-->\n<p>AnyTry is an AI-powered virtual try-on system that lets your customers see how they'll look wearing your products before they buy. The plugin integrates directly with WooCommerce product pages, adding a \"Try On\" button that uses cutting-edge generative AI.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the AnyTry API (https:\/\/api.anytry.ai) to generate virtual try-on images using generative AI. Using the plugin requires an AnyTry account (a free trial is available from the plugin settings screen).<\/p>\n\n<p><strong>What the plugin uses the AnyTry API for:<\/strong><\/p>\n\n<ul>\n<li><strong>Try-On generation<\/strong> \u2014 submitting the customer photo together with the product image, following the job's progress (a real-time stream, with polling as a fallback), cancelling a job when the customer closes the dialog mid-generation so the reserved processing is released, and fetching the finished image. Result images are only ever fetched over HTTPS from <code>api.anytry.ai<\/code> or an <code>*.anytry.ai<\/code> subdomain.<\/li>\n<li><strong>AI Size Advisor<\/strong> \u2014 a size recommendation, requested only when the merchant has enabled the feature and the customer completes the quiz.<\/li>\n<li><strong>Account and administration<\/strong> (operator workflow only; never customer-facing) \u2014 creating the free-trial account on first activation (admin email, WordPress username and store domain only), sending the activation magic-link email, recovering an existing API key, single sign-on to the AnyTry Portal, validating the configured key on the Settings screen and in the background after the key changes or the plugin is upgraded (retried until the account can be identified; these checks send only the key, no order or customer data), and loading the figures shown on the plugin's own admin Settings screen.<\/li>\n<li><strong>Analytics and conversion attribution<\/strong> \u2014 funnel events (button impressions, generation completes, add-to-cart, checkout start, purchases, refunds), an abandon event when the customer closes the window mid-generation, and order attribution. <strong>Gated on analytics consent, which is OFF by default on new installs.<\/strong><\/li>\n<\/ul>\n\n<p>The Try-On feature works whether or not analytics is enabled. Enable analytics at WooCommerce \u2192 AnyTry AI \u2192 \"Send analytics &amp; conversion events\".<\/p>\n\n<p><strong>What is sent to the AnyTry API:<\/strong><\/p>\n\n<ul>\n<li>The customer photo uploaded via the Try-On modal (transmitted only when the customer explicitly clicks \"Try On\").<\/li>\n<li>The product image URL and product identifier from WooCommerce.<\/li>\n<li>A random session identifier (no personally identifiable information).<\/li>\n<li>Order and product IDs, product names, selected sizes, quantities, purchase\/refund amounts, currency and event times; where available, try-on job and session identifiers used for attribution. Complete order operations are sent through <code>\/api\/v2\/commerce\/evidence<\/code>; older queued events keep their previous delivery path \u2014 <strong>only when analytics consent is enabled<\/strong>.<\/li>\n<li>Optional: height, weight, and usual size values the customer enters in the AI Size Advisor quiz.<\/li>\n<\/ul>\n\n<p><strong>When the data is sent:<\/strong><\/p>\n\n<ul>\n<li>Try-On generation: when a customer uploads a photo and clicks \"Try On\" on a product page.<\/li>\n<li>Size Advisor: when a customer completes the AI Size Advisor quiz.<\/li>\n<li>Conversion events: when an order containing a tried-on product is placed \u2014 <strong>only when analytics consent is enabled<\/strong>.<\/li>\n<\/ul>\n\n<p><strong>Cookies (server-set, persistent):<\/strong><\/p>\n\n<ul>\n<li><code>anytry_session<\/code> cookie (90 days) \u2014 stores the random session ID and the list of product IDs the visitor has tried on, used to attribute orders to try-on sessions for the conversion dashboard. <strong>Set only when analytics consent is enabled.<\/strong><\/li>\n<li><code>anytry_tried<\/code> cookie (90 days) \u2014 stores a fallback list of tried product IDs for cases where <code>anytry_session<\/code> is unavailable (third-party cookie blockers, REST checkout flows). <strong>Set only when analytics consent is enabled.<\/strong><\/li>\n<li><code>anytry_legal_accepted_v2<\/code> cookie (1 year) \u2014 remembers that the customer has accepted the Try-On legal\/age-consent overlay so they are not asked again on every page. Set ONLY after the customer clicks \"Accept\" on the legal overlay. Not used for any analytics or attribution.<\/li>\n<\/ul>\n\n<p><strong>Persistent browser storage (localStorage):<\/strong><\/p>\n\n<ul>\n<li><code>anytry_lang<\/code> \u2014 the language chosen in the widget, used to restore that choice on later visits.<\/li>\n<li><code>anytry_legal_accepted_v2<\/code> \u2014 mirror of the consent cookie above, same purpose, same trigger. No analytics or attribution use.<\/li>\n<li><code>anytry_tried<\/code> \u2014 client-side mirror of the <code>anytry_tried<\/code> cookie value, used when third-party cookies are blocked. <strong>Written only when analytics consent is enabled.<\/strong><\/li>\n<li><code>anytry_tried_products<\/code> \u2014 same purpose as <code>anytry_tried<\/code> but stored in a structured per-product map; used by the admin Conversions tab to attribute orders to try-on sessions. <strong>Written only when analytics consent is enabled.<\/strong><\/li>\n<li><code>anytry_canonical_session_id<\/code> \u2014 a random <code>sess_*<\/code> identifier kept across reloads so the API can JOIN a try-on generation event to a later purchase event for conversion attribution. <strong>Persisted only when analytics consent is enabled.<\/strong> When consent is off, an ephemeral id is held in memory for the current page only and never written to localStorage.<\/li>\n<li><code>anytry_active_jobs<\/code> \u2014 registry of try-on jobs and their recovery metadata, used to resume work and restore completed results after a page reload. Completed entries can remain until the customer removes them. On widget startup, entries older than one hour are discarded; this is a cleanup check, not a background deletion timer while the page is closed. Removing a still-running job can retain a minimal status handle until the server confirms completion\/failure or the one-hour limit is checked. Removing a completed job retains only its job identifier, dismissal time and removal flags for up to one hour, checked on startup, so open or resumed copies can remove the same result. This removal record contains no image or job token and does not occupy an active try-on slot. Not used for analytics or attribution.<\/li>\n<\/ul>\n\n<p><strong>Ephemeral per-tab storage (sessionStorage):<\/strong><\/p>\n\n<p>These stores are scoped to the current browser tab. They support the Try-On interface and, when analytics consent is enabled, retry failed analytics events. A photo stored here powers the local before\/after toggle; when the widget restores an earlier try-on (for example after a page reload), that stored photo can also be sent with a Size Advisor request the customer initiates. Quiz answers may likewise be reused in such a request. The photo is bound to its own try-on job; another job's upload is not used as a fallback.<\/p>\n\n<ul>\n<li><code>anytry_before_&lt;jobId&gt;<\/code> \u2014 a compressed copy of that job's uploaded photo, kept for the \"before \/ after\" toggle and a customer-initiated repeat Size Advisor analysis after a reload. If this copy is unavailable, the widget keeps the generated result but does not substitute another photo.<\/li>\n<li><code>anytry_result_&lt;jobId&gt;<\/code> \u2014 the generated result image data URL, used so the same result re-renders instantly when the customer reopens the modal in the same tab.<\/li>\n<li><code>_anytry_result_cache_order<\/code> \u2014 job identifiers in cache order, used to evict older result images when the per-tab image cache reaches its limit.<\/li>\n<li><code>anytry_feedback_state<\/code> \u2014 whether the customer already rated \ud83d\udc4d \/ \ud83d\udc4e the current result.<\/li>\n<li><code>anytry_quiz_user_height<\/code>, <code>anytry_quiz_user_weight<\/code>, <code>anytry_quiz_usual_size<\/code>, <code>anytry_quiz_skipped<\/code> \u2014 Size Advisor quiz answers, kept so the customer doesn't have to re-enter them while comparing multiple try-ons.<\/li>\n<li><code>anytry_size_recommendation<\/code>, <code>anytry_size_&lt;photoHash&gt;<\/code> and <code>anytry_size_&lt;photoHash&gt;_p&lt;productId&gt;<\/code> \u2014 cached Size Advisor responses, which may include estimated body measurements and recommended sizes, used to restore the recommendation for the photo and product.<\/li>\n<li><code>anytry_tab_id<\/code> \u2014 a random identifier used to keep track of which browser tab owns an active try-on job after a reload.<\/li>\n<li><code>anytry_pending_submit<\/code> \u2014 pending request identifiers, timestamps, recovery credentials, intent and product metadata. With submission recovery enabled, these records let WordPress recover an accepted job after a lost response without starting a second try-on. Recovery checks discard expired records after 25 hours; dismissed requests are marked so they are not restored as wanted. Legacy records use the older short cancellation path.<\/li>\n<li><code>anytry_sw_blocks_sse<\/code> \u2014 internal counter the plugin uses to detect a Service Worker that's blocking real-time updates, so it can transparently fall back to the same-origin SSE proxy on the next try-on.<\/li>\n<li><code>anytry_pending_events_v1<\/code> \u2014 up to 20 failed critical analytics events, including their product, job and session identifiers. With current analytics consent, the plugin retries them at the AnyTry API on a later page view in the same tab. A refusal received by the widget or disabled analytics clears this queue and prevents new retries on that page.<\/li>\n<\/ul>\n\n<p><strong>Persistent browser storage (IndexedDB):<\/strong><\/p>\n\n<p>Generated results are cached in the visitor's browser for local display. An older installation may also retain an uploaded-photo cache, described below. Clearing the site's browser data removes these caches.<\/p>\n\n<ul>\n<li><code>anytry_cache<\/code> \u2192 object store <code>photos<\/code> \u2014 legacy uploaded-photo cache. The current widget does not write new uploads here or use this global cache for before\/after comparison or repeat Size Advisor requests. Existing cache cleanup remains in place.<\/li>\n<li><code>anytry_results<\/code> \u2192 object store <code>images<\/code> \u2014 the data URL of generated result images keyed by job ID, so revisiting a recently-generated try-on renders instantly.<\/li>\n<\/ul>\n\n<p><strong>Analytics consent:<\/strong><\/p>\n\n<p>The plugin does NOT send analytics or conversion-attribution events by default. Enable them at WooCommerce \u2192 AnyTry AI \u2192 \"Send analytics &amp; conversion events\". The Try-On image generation itself works whether or not this is enabled \u2014 only the conversion-attribution dashboard in the AnyTry Portal depends on this opt-in.<\/p>\n\n<p>When analytics is enabled and a tracking token is available, the widget checks the current merchant setting and the site's <code>anytry_allow_session_cookie<\/code> consent filter through WordPress once per page view, before sending or retrying browser analytics. It reuses that result for the rest of the page. CMP integrations must implement that filter; the plugin does not automatically detect every consent manager. An explicit refusal or disabled analytics clears the browser's attribution cookies, attribution storage and pending-event queue. A failed or unrecognized consent check clears the pending-event queue and stops browser analytics for that page, while preserving existing attribution and session identity. Try-On and Size Advisor remain available. This does not recall requests already transmitted or erase historical order records.<\/p>\n\n<p><strong>Optional Google Fonts (default OFF):<\/strong><\/p>\n\n<p>By default the plugin uses system-sans typography and makes NO third-party font request \u2014 the AnyTry API is the only external service it contacts. An internal <code>anytry_load_google_font<\/code> option (OFF by default, with no user-facing control) would, if enabled, request the Outfit web font from Google Fonts (https:\/\/fonts.googleapis.com) on the storefront and the AnyTry admin Settings page; it stays off in a standard install.<\/p>\n\n<ul>\n<li>Service: Google Fonts (https:\/\/fonts.google.com)<\/li>\n<li>Data sent: visitor IP and User-Agent (standard HTTP request) at the moment a page that has this option enabled is rendered<\/li>\n<li>Terms of Service: https:\/\/policies.google.com\/terms<\/li>\n<li>Privacy Policy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<p>Customer and product images are sent to AnyTry and the selected AI providers, including Google, for processing. Uploaded images, generated results, browser caches and Size Advisor data have separate lifecycles. Closing the widget does not trigger immediate deletion of every copy. Server cleanup depends on deployed retention settings and scheduled cleanup; this plugin does not enforce a five-minute deletion deadline. Entered and estimated measurements and analytics records may remain after image cleanup. Minimal removal markers (try-on identifier, removal time and terminal state; no photos or access tokens) are stored in the browser to synchronize removal across tabs. The widget honors them for up to 25 hours and removes expired markers on the next successful synchronization. Clearing all site data also removes these markers; older open tabs may need a reload to use the new synchronization.<\/p>\n\n<p>This service is provided by AnyTry. By using the plugin, customers agree to the AnyTry Terms of Service and Privacy Policy:<\/p>\n\n<ul>\n<li>Terms of Service: https:\/\/anytry.pl\/terms<\/li>\n<li>Privacy Policy: https:\/\/anytry.pl\/privacy<\/li>\n<\/ul>\n\n<p><strong>Key Features:<\/strong><\/p>\n\n<ul>\n<li><strong>Photorealistic Try-On<\/strong> \u2014 Uses generative AI to create realistic images of customers wearing your products.<\/li>\n<li><strong>Data Privacy<\/strong> \u2014 Photo copies, Size Advisor data and analytics records have separate lifecycles, as described above. The plugin includes its local order tracking data (session ID, tried-product list and attribution job IDs) in WooCommerce's built-in personal-data Export and Erase tools.<\/li>\n<li><strong>High Performance<\/strong> \u2014 Real-time SSE streaming with a polling fallback; doesn't burden your hosting.<\/li>\n<li><strong>Responsive Design<\/strong> \u2014 Works perfectly on mobile and desktop devices.<\/li>\n<li><strong>Variant Support<\/strong> \u2014 Works with simple and variable products (color\/size).<\/li>\n<li><strong>AI Size Advisor<\/strong> \u2014 Size recommendations from a short quiz (height and weight with photo silhouette analysis, or a single \"what size do you wear?\" question).<\/li>\n<li><strong>Eye Advisor<\/strong> \u2014 For glasses and sunglasses, AnyTry checks whether the frame width fits the face in the customer's photo and shows a frame-fit verdict on the try-on result. Runs automatically, no setup.<\/li>\n<li><strong>Works across categories<\/strong> \u2014 clothing, jewellery, watches, eyewear, shoes and accessories.<\/li>\n<li><strong>Multilingual<\/strong> \u2014 The shopper widget ships 10 languages (EN, PL, DE, UK, IT, ES, FR, SV, DA, NB); admin settings are English, with translations delivered via WordPress.org language packs.<\/li>\n<li><strong>HPOS Compatible<\/strong> \u2014 Full support for WooCommerce High-Performance Order Storage.<\/li>\n<li><strong>WooCommerce Blocks<\/strong> \u2014 Compatible with the new block-based checkout.<\/li>\n<li><strong>Multi-Job Navigation<\/strong> \u2014 Compare results from multiple try-ons with swipe navigation.<\/li>\n<\/ul>\n\n<p><strong>How It Works:<\/strong><\/p>\n\n<ol>\n<li>Customer clicks \"Try On\" on a product page.<\/li>\n<li>They upload a photo of themselves.<\/li>\n<li>AI generates a photorealistic image of them wearing the product.<\/li>\n<li>Optional: AI Size Advisor recommends the best size.<\/li>\n<\/ol>\n\n<p><strong>SaaS Model:<\/strong> This plugin connects to the <a href=\"https:\/\/api.anytry.ai\">AnyTry API<\/a> for AI processing. An API key is required (free trial available). See <a href=\"https:\/\/anytry.pl\/terms\">Terms of Service<\/a> and <a href=\"https:\/\/anytry.pl\/privacy\">Privacy Policy<\/a>.<\/p>\n\n<h3>Configuration<\/h3>\n\n<ol>\n<li>Navigate to WooCommerce &gt; AnyTry AI in the admin panel.<\/li>\n<li>Enter your API key or start a free trial.<\/li>\n<li>Customize the button appearance (color, text, position).<\/li>\n<li>Enable AI Size Advisor (optional).<\/li>\n<li>Ensure your products have featured images set (flat-lay or ghost mannequin photos work best).<\/li>\n<\/ol>\n\n<h3>Requirements<\/h3>\n\n<ul>\n<li>WordPress 6.4 or newer.<\/li>\n<li>WooCommerce 8.2 or newer.<\/li>\n<li>PHP 7.4+ (recommended: 8.1+).<\/li>\n<li>Active internet connection (for API communication).<\/li>\n<\/ul>\n\n<h3>Source code &amp; build<\/h3>\n\n<p>The plugin ships its full unminified sources \u2014 <code>src\/js\/anytry.js<\/code>, <code>src\/css\/anytry.css<\/code> and <code>src\/css\/anytry-admin.css<\/code> \u2014 alongside the minified runtime in <code>assets\/<\/code>. The two small admin scripts keep their unminified sources in <code>assets\/<\/code> next to the minified files. Minification is done with esbuild on Node.js 18+ via the <code>minify_wp.js<\/code> build script.<\/p>\n\n<p>Third-party code: <code>assets\/js\/heic2any.min.js<\/code> is a prebuilt bundle of heic2any 0.0.4 (MIT) that embeds gifshot (MIT) and libheif (LGPL-3.0-or-later). Full attribution, licence texts and the corresponding-source offer are in <code>THIRD-PARTY-NOTICES.txt<\/code> in the plugin folder. It converts iPhone HEIC photos to JPEG in the browser, loads only when the customer picks an HEIC file, and can be turned off with the \"iPhone HEIC support\" toggle in WooCommerce \u2192 AnyTry AI.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Download the plugin ZIP file.<\/li>\n<li>In WordPress admin, go to Plugins &gt; Add New &gt; Upload Plugin.<\/li>\n<li>Select the file and click Install.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to WooCommerce &gt; AnyTry AI to configure your API key.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"are%20customer%20photos%20safe%3F\"><h3>Are customer photos safe?<\/h3><\/dt>\n<dd><p>The widget sends photos to AnyTry for processing by the selected AI providers, including Google. Browser images, server images and Size Advisor records have separate lifecycles. Closing the fitting room does not immediately erase every copy. See the privacy information above and the service Privacy Policy for processing details.<\/p><\/dd>\n<dt id=\"how%20long%20does%20a%20try-on%20take%3F\"><h3>How long does a try-on take?<\/h3><\/dt>\n<dd><p>Most try-ons finish in 15\u201320 seconds. The plugin does not paste the garment onto the photo \u2014 it generates an entirely new image with generative AI, which is a genuinely heavy computation. The widget shows a live progress estimate while it works, and the customer can minimise the window and keep browsing; the finished result is picked up as soon as it is ready.<\/p><\/dd>\n<dt id=\"what%20kind%20of%20photos%20should%20customers%20upload%3F\"><h3>What kind of photos should customers upload?<\/h3><\/dt>\n<dd><p>Best results come from full-body photos with good lighting on a plain background.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20store%20any%20data%20locally%3F\"><h3>Does this plugin store any data locally?<\/h3><\/dt>\n<dd><p>The plugin stores its WooCommerce configuration options (API key, button style, size advisor mode, etc.) and a small amount of WooCommerce order metadata for conversion attribution. No customer photos are ever stored on your site. AI processing and the analytics reports themselves are handled by the AnyTry cloud service; on your site the plugin keeps only the bookkeeping records described below, which let it deliver those reports reliably.<\/p>\n\n<p>Version 1.0.36 stores each new purchase, cancellation or refund as a complete operation before background delivery. A confirmed purchase snapshot is retained while the order exists so later order edits do not replace its recorded facts. Delivered cancellation and refund payloads become eligible for minimization after 30 days; undelivered operations and incomplete refund groups after 90 days. Ready purchases held because analytics consent is off follow the existing 14-day default. Minimal records remain to prevent duplicate operations and distinguish confirmed delivery from unconfirmed expiry. After permanent order deletion is verified in both WooCommerce stores, a maintenance pass removes the purchase facts from records older than 24 hours. Moving an order to trash does not do this. The personal-data eraser removes per-order records. Cleanup requires the scheduler and database to be available.<\/p>\n\n<p>For older queued events and the other local records, the existing rules remain: Three small database tables are used for bookkeeping only. One prevents the same cancellation being reported twice; these records have no age limit. The outbox records purchase, refund and cancellation work before it is sent to AnyTry in the background, so temporary network or server problems can be retried. Delivered purchase and return entries become eligible for removal 30 days after delivery. Queued purchase and return entries in the ready phase age out at 90 days from admission once due; failed or quarantined purchase and return entries become eligible for removal at 90 days from admission. Return entries are only removed after their refund accounting has been preserved; if that repair cannot complete, they remain without an age limit. Two kinds are removed sooner, by default after 14 days from admission: ready purchases while analytics consent is off, and ready deferred refunds whose readable order shows no AnyTry activity and has no purchase still owed. Unresolved refund reservations and pending refund or attribution receipts have no age limit. Legacy staged purchases can remain without an age limit, including while held for an unknown or different account; an unreadable legacy order's staged batch can be retired after 90 days when recovery runs. New purchases keep one fixed declaration of the products and try-on identities being reported, so interrupted recording resumes the same purchase. After publication, this declaration retains product and order-line identifiers and attribution, without product names or amounts. It has no age limit while the order remains; after the order is permanently deleted and its absence is verified in both WooCommerce stores, a later maintenance pass reduces a declaration older than 24 hours to a minimal order and ownership marker. Moving an order to trash is not permanent deletion. Pending cancellation records retain a snapshot of the order lines and attribution; resolved reports also keep their exact outgoing content until acknowledged. Purchase declarations awaiting publication and cancellation work stop automatic attempts after 12 failures or when due work reaches 90 days, and remain for operator review. Consent or account holds consume no attempts. These new records are not removed merely because they are old. An acknowledged cancellation leaves the duplicate-prevention record; interrupted cleanup is retried. Orphaned cancellation content is diagnosed separately and retained for review. The outbox also keeps permanent per-order refund ledgers and ownership records: they preserve refund amounts and coverage, order and refund ids, the owner's key fingerprint and, when known, account id, without customer names, contact details or photos. Key-to-account mappings are kept as options containing key fingerprints, account ids and validation times, without order or customer data; they remain until uninstall because other orders may still refer to them. An option also registers purchases that could not be queued: it keeps at most 200 outstanding orders and sheds the oldest on overflow \u2014 except an entry whose ownership could not yet be recorded (for example during a database outage), which is kept until it can be, and stops retrying after 24 unsuccessful recovery attempts; account holds use no attempts and have no age limit. The third table, submit-answer escrow, briefly keeps hashes, a job id, an encrypted job access token and a small status response so the answer to one try-on submission can be recovered; it stores no photos and becomes eligible for hourly cleanup 25 hours after its last update. Cleanup depends on the background scheduler and database being available. Changing to another API key of the same AnyTry account changes nothing about ownership or delivery. Purchase, refund and cancellation data known to belong to a different account is never sent to the new account and follows the same retention rule as any undelivered entry of its kind, including the kinds with no age limit. When account ownership cannot be verified, history remains held: two known different accounts on one legacy order cannot be resolved automatically or by CLI assertion, an unmapped legacy key remains held until mapped, and a read failure before an ownership candidate is verified leaves unknown provenance that never resolves automatically; an operator may explicitly assert ownership of genuinely unknown history through the CLI, but cannot override known conflicting accounts, and during a storage outage the refused-purchase register may exceed its usual 200-order limit because entries whose ownership cannot be preserved are retained. All three tables and the key-to-account mappings are removed on uninstall. The plugin's WordPress personal-data eraser removes the shopper's per-order rows, including purchase declarations, permanent refund and ownership records, pending and acknowledged cancellation records, refused-purchase references and order metadata, regardless of WooCommerce's \"remove order data\" setting; shared key-to-account mappings are retained until uninstall. One non-personal marker (a timestamp) is retained per erased order so erased analytics cannot be silently re-created and re-sent.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20set%20tracking%20cookies%3F\"><h3>Does this plugin set tracking cookies?<\/h3><\/dt>\n<dd><p>Only when the merchant has enabled analytics consent (default OFF). When enabled, <code>anytry_session<\/code> and <code>anytry_tried<\/code> cookies persist for 90 days on visitor browsers \u2014 both store a random session ID and a list of product IDs the visitor has tried on, used to attribute purchases to try-on sessions. See the \"External services\" section for full disclosure.<\/p><\/dd>\n<dt id=\"is%20this%20compatible%20with%20hpos%3F\"><h3>Is this compatible with HPOS?<\/h3><\/dt>\n<dd><p>Yes. The plugin is fully compatible with WooCommerce High-Performance Order Storage (HPOS).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.39<\/h4>\n\n<ul>\n<li>Fixed reopening the try-on window immediately after closing it.<\/li>\n<li>Improved keyboard focus when closing, minimizing and restoring the try-on window.<\/li>\n<li>Fixed resuming an answered size quiz after restoring a try-on that is still generating. Unfinished questions remain available.<\/li>\n<li>Fixed a completed size quiz blocking a new quiz after minimizing and restoring the result.<\/li>\n<\/ul>\n\n<h4>1.0.38<\/h4>\n\n<ul>\n<li>Check the existing try-on one final time before reporting a waiting timeout.<\/li>\n<li>Ignore delayed status replies after stopping or resuming a try-on.<\/li>\n<\/ul>\n\n<h4>1.0.37<\/h4>\n\n<ul>\n<li>Improved recovery when a try-on status stream stays connected but stops delivering useful updates. The plugin checks the existing try-on automatically so customers can receive their result without reopening the tab or starting another try-on.<\/li>\n<\/ul>\n\n<h4>1.0.36<\/h4>\n\n<ul>\n<li>Fixed: purchase events explicitly carry the summed product value, including when it equals the basket total.<\/li>\n<li>Fixed: the try-on result button hands off to WooCommerce without showing an added-to-cart confirmation before the store processes the action.<\/li>\n<li>Fixed: HEIC\/HEIF conversion and photo-loading errors stay visible so the shopper can choose another file or retry. A converter script that does not load stops waiting after 15 seconds; a later attempt can load it again.<\/li>\n<li>Fixed: refreshing the analytics token from the settings screen accepts only a successful response containing a non-empty text token. Invalid responses leave the previous token unchanged.<\/li>\n<li>Fixed: removing a try-on is shared between open tabs even when localStorage is unavailable, using other browser storage and tab messaging when available. Clearing all site data or keeping an older page open still limits recovery.<\/li>\n<li>Fixed: cancellations are saved before sending and retried in the background with the same recorded content. Failed or unresolved work is visible in the shop's diagnostics and stops automatic retries at its limit.<\/li>\n<li>Fixed: a purchase interrupted while being recorded resumes its original product and attribution snapshot. Later edits to the order do not silently replace that snapshot.<\/li>\n<li>Recovery limit: if the initial cancellation record cannot be saved, the shop reports the failure for manual retry; the original unsaved time cannot be recovered.<\/li>\n<li>Reporting limits: older purchases without reliable saved line details keep their previous product-level selection. Missing historical evidence is not reconstructed. Conflicting observations can make a reported amount unavailable; the original records are retained.<\/li>\n<li>Fixed: complete purchase and refund operations use separate background-delivery records, so an older PHP process finishing during an update cannot publish or overwrite the new operation.<\/li>\n<li>Rollback: after new records are created, restoring an older ZIP alone is not a supported rollback. Rehearse the update on a development site first.<\/li>\n<\/ul>\n\n<h4>1.0.35<\/h4>\n\n<ul>\n<li>Improved recovery of an accepted try-on after a reload or a lost browser response. Finished results remain available until the shopper removes them; they do not prevent a new try-on.<\/li>\n<li>Improved purchase and refund attribution, account ownership checks, privacy cleanup and background delivery. Purchases are reported after payment, and repeated refund delivery preserves the recorded amount.<\/li>\n<li>Fixed product-variation attribution and use of saved order-line sizes. Tried-on product evidence is checked against its own 90-day window.<\/li>\n<li>Known limits: a cancellation report that fails has no scheduled retry. Missing or unreadable saved purchase-line details use the older cancellation selection. A server interruption while re-recording a purchase can leave those details inconsistent with a retained earlier batch. These were limitations of 1.0.35; see the 1.0.36 changes above. Earlier events are not rewritten.<\/li>\n<\/ul>\n\n<p>The complete earlier release notes, including migration and reporting limitations, are in changelog.txt included in the plugin ZIP.<\/p>","raw_excerpt":"AI-powered virtual try-on for WooCommerce. Let customers see how clothes look on them before buying \u2014 powered by generative AI.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/306734","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=306734"}],"author":[{"embeddable":true,"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/piezak"}],"wp:attachment":[{"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=306734"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=306734"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=306734"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=306734"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=306734"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=306734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}