Title: AI eShop Optimizer
Author: Oxford Metadata Ltd
Published: <strong>24 Aprile 2024</strong>
Last modified: 29 Maggio 2026

---

Ricerca i plugin

![](https://ps.w.org/ai-eshop-optimizer/assets/banner-772x250.png?rev=3076755)

![](https://ps.w.org/ai-eshop-optimizer/assets/icon.svg?rev=3076744)

# AI eShop Optimizer

 Di [Oxford Metadata Ltd](https://profiles.wordpress.org/oxfordmetadata/)

[Scarica](https://downloads.wordpress.org/plugin/ai-eshop-optimizer.6.0.zip)

[Anteprima in tempo reale](https://it.wordpress.org/plugins/ai-eshop-optimizer/?preview=1)

 * [Dettagli](https://it.wordpress.org/plugins/ai-eshop-optimizer/#description)
 * [Recensioni](https://it.wordpress.org/plugins/ai-eshop-optimizer/#reviews)
 *  [Installazione](https://it.wordpress.org/plugins/ai-eshop-optimizer/#installation)
 * [Sviluppo](https://it.wordpress.org/plugins/ai-eshop-optimizer/#developers)

 [Supporto](https://wordpress.org/support/plugin/ai-eshop-optimizer/)

## Descrizione

AI eShop Optimizer – AI Chat & Content Recommendations Plugin

Welcome to AI eShop Optimizer, the premier AI-driven solution for intelligent customer
engagement powered by the latest AI models from Anthropic and OpenAI.

**Works with or without WooCommerce** – Perfect for:
 – E-commerce sites with WooCommerce
for product recommendations – Corporate and content sites for intelligent chat assistance–
Merchant information sites that need AI-powered customer support

The plugin provides advanced AI chat capabilities with semantic search powered by
state-of-the-art embedding engines. For WooCommerce sites, it also enables product
recommendations through our graph-database powered service at https://eshop-optimizer.
com.
 Our advanced AI tools uncover latent patterns and consumer preferences, empowering
you with strategic upsell and cross-sell propositions. The plugin also enables you
to import with one click our recommendations – or any product recommendations in
a csv file that conforms to our format – and to also monitor their performance using
google UTM tags (which you may also use to monitor your own recommendations performace).

### Features

### AI Product Recommendations

 * Harness the power of a semantic graph database for unmatched product pairing 
   suggestions.
 * Dive deep into your sales data to extract bespoke upsell and cross-sell opportunities.
 * Beta-test participants reported a remarkable 57%+ annual surge in sales.
 * Privacy-centric: Opt out of sharing product and category names and product prices
   with limited impact to the quality of the recommendations.
 * Effortlessly back up and export current Upsells and Cross-sells.
 * Leverage Google GA4 insights to gauge the success of your recommended pairings.

### Products for the Same Needs

 * Automatically recommend products that fulfill the same customer needs
 * Uses your product’s need attributes (pa_need taxonomy) to find matching products
 * Ranks suggestions by pre-computed sales performance from the product catalogue
 * Intelligently excludes existing upsells and cross-sells to avoid duplicates
 * Stores up to 6 optimized suggestions per product for fast retrieval
 * Displays prominently on product pages (appears first, before other recommendations)
 * Multi-tier caching for optimal performance (Object Cache + Database)
 * Generate suggestions as part of Operational Efficiency workflow

### Insights Chat — Claude-powered (NEW in 5.0)

 * Ask your shop questions in plain language from inside the WordPress admin
 * Powered by the AI Chat Anthropic key you already have — no separate subscription
 * 33 purpose-built Claude data abilities resolved automatically via the WordPress
   Abilities API
 * 11 categorized accordion groups of suggestion chips — Customers, Brand portfolio,
   Recommendation rails, Attribution & archives, Product needs audit, Star ratings,
   Content & blog, Cross-skill, Store analytics, Promotions / launches / sales, 
   Newsletters & campaigns
 * Cross-cuts orders, products, attribution, recommendations, ratings, blog engagement,
   and customer profiles
 * Stays inside WooCommerce — no third-party BI subscription, no data export

### Joint Session × Attribution Analytics (NEW in 5.0)

 * Bridge between the Session Tracker (engagement) and the Attribution Engine (conversion)—
   both keyed off the same aieo_session_id cookie
 * Blog-post attribution — clicks from blog posts to products now attribute correctly
   with the originating post_id
 * Engagement-bucket buy-probability — empirical P(cart-add) per (scroll-quartile
   × time-quartile × mouse-activity) bucket per product
 * Abandoned-cart triage, cart-removal analysis, rating × conversion correlation,
   need × conversion correlation
 * Pre-aggregated daily rollup tables keep chat answers in single-digit milliseconds
   regardless of history depth

### Insights Remote DB Streaming (NEW in 5.0, Pro)

 * Stream raw analytics events to your own operator-owned MariaDB / MySQL for unbounded
   BI access
 * Reuses the existing ERP connection registry — same encrypted credentials, same
   audit trail
 * Configurable export frequency (15 min / hourly / daily) with per-table lag dashboard
 * Local-purge failsafe — hot rows are not deleted until the remote confirms receipt
 * Net stable local database footprint ~1.1 GB year-over-year

### Star Ratings  SEO Schema (NEW in 5.0)

 * AggregateRating JSON-LD automatically bridged into AIOSEO, Yoast, and RankMath
   via their schema filters
 * Fallback head-injected JSON-LD when no SEO plugin is detected
 * Per-feature enable/disable toggle on the Star Ratings admin page
 * Surface customer ratings to Google Rich Results without manually configuring 
   each SEO plugin

### Custom Slots + Tolstoy + Recommendations Ordering (NEW in 5.1)

 * Drag-and-drop “Recommendations Ordering” card on the e-shop Manager dashboard
   reorders every recommendation rail (Up-sells / Cross-sells / Related / Recently
   Viewed / Products for the same needs) and any operator-defined Custom Slot, with
   a per-row Show toggle to hide rails without removing them
 * Custom Slots host arbitrary content alongside the built-in reco rails — two kinds
   per slot:
    - Tolstoy: paste a widget id + account UUID; AIEO assembles the `<tolstoy-widget
      >` tag and defer-loads the gotolstoy.com CDN script once per page
    - HTML / code: rich-text WYSIWYG (TinyMCE) with a Code tab, accepts any HTML,
      embed scripts, image tags, or WooCommerce shortcodes (e.g. `[products limit
      ="6" orderby="popularity"]`)
 * Per-slot title with show/hide toggle — renders with the same heading + underline
   styling as the built-in “Recently Viewed Products” / “Related Products” titles
 * Cross-tab Tolstoy attribution — clicks from a Tolstoy carousel that lead to a
   cart-add are recorded as `source='tolstoy'` in wp_aieo_addcart_events with `source_meta
   = {slot_id, tolstoy_widget_id, clicked_url}` so reports can pivot on widget, 
   carousel, or source product
 * Works on BOTH FSE block themes (via the `.ff-recommendations-cluster` flex container
   + inline CSS `order:` rules) AND classic themes (via dynamic re-prioritisation
   of WooCommerce `woocommerce_after_single_product_summary` action hooks)

### IAPI (Interactivity API) — WC Cart / Checkout block parity (NEW in 5.1)

 * Full integration with the modern WooCommerce block-based cart and checkout (driven
   by WordPress @wordpress/interactivity)
 * Side-cart, Swatches multi-select, Sticky Add-to-Cart, Wishlist, Star Ratings,
   Free-Shipping Display, Recommendations attribution all work on both surfaces —
   block-cart/block-checkout AND legacy shortcode-cart/shortcode-checkout
 * AIEO_DMM_Swatches_Runtime supports dual-mode enqueue (`@aieo/swatches-iapi` module
   when IAPI is on, jQuery bundle otherwise) with a single DOM contract
 * WC Store API (`wc/store/cart`) endpoints recognised by the side-cart, attribution
   log, and waitlist subscribe flows so block-checkout actions are captured the 
   same as classic checkout
 * AIEO Custom Slots, Free-Shipping Display, and Trust Badges register their bridge-
   block render paths inside `woocommerce_blocks_loaded` so they’re available in
   block-themed cart/checkout templates via the Site Editor

### Floating Mini-Cart + Free-Shipping Bar (NEW in 5.0)

 * Two-column floating mini-cart styled after the Rey theme — left column recommends“
   You might like”, right column shows Shopping Bag / Recently Viewed
 * Free-shipping progress bar right under the tab header
 * 500 ms debounced quantity AJAX — qty changes feel instant, no full cart recalculation
   on the server
 * Session-level HTML cache (30 s TTL); WC fragments integration keeps every other
   widget in sync
 * Sticky Add-to-Cart bar for product pages

### Pricing Engine + Conversion Boosters (NEW in 5.0)

 * Per-role price overrides via CSV upload, with batch validation
 * Brand-level % discounts with start/end-date windows
 * Loyalty class definitions + per-user assignments
 * Stacking recipe: Role Pricing  Brand Discount  Loyalty Class — each customer 
   sees the strongest applicable price
 * Brand-based free-gift offers (cart subtotal threshold per brand)
 * Configurable exit-intent modal with checkout-specific variant

### Marketplace Connectors & Shipping (NEW in 5.0)

 * Marketplace Order Importer — Skroutz / e-shop / Amazon orders flow into WooCommerce
   as native orders so attribution, stock, customer profiles, and fulfillment stay
   unified
 * Per-vendor rotatable webhook tokens + configurable SKU lookup strategy
 * Streaming marketplace feed generator (XML / CSV) for 35k-product catalogues
 * Greek + Cypriot Shipment Tracking providers (replaces the WC plugin’s US/UK/Canada/
   Germany defaults)
 * Smart Shipping Label — postcode-less carts see “Carrier (Από €X.XX)” minimum 
   rate so customers know shipping isn’t free without seeing a misleading default

### Customer Intelligence + Web Push (NEW in 5.0)

 * wp_aieo_customer_intelligence keyed by eponymous_id — omnichannel customer view(
   eshop + in-store) is the single source of truth
 * Behavioural segments — Top customers, Lost cohort, Lookalikes, Abandoned-cart,
   reactivation
 * Triggered web-push flows — welcome, reactivation, price-drop, back-in-stock —
   with full dispatch log + click attribution
 * Customer Survey Intelligence — Gravity Forms ingest + 7 high-signal metrics (
   NPS class, satisfaction, priorities, discovery channel, gift preferences, personal
   profile) + composite VoC score
 * “Notify me when back in stock” Waitlist with automatic stock-watcher emails
 * Wishlist analytics — most-wishlisted products, surfaces, and pages driving adds

### AI-Powered Chat (FREE)

 * **Support for latest AI models from Anthropic Claude and OpenAI:**
    - Claude Opus 4.1, Claude Sonnet 4.5, Claude Haiku 4.5
    - GPT-5, GPT-4, GPT-o1, GPT-3.5
 * **Advanced embedding engines for semantic product search:**
    - Voyage AI: voyage-3.5-large, voyage-3.5-lite, voyage-3-lite, voyage-finance-
      2
    - OpenAI: text-embedding-3-large, text-embedding-3-small, text-embedding-ada-
      002
 * Customizable chat templates for different use cases
 * Smart product search and recommendations powered by AI embeddings
 * Product catalog integration with semantic similarity matching
 * Context-aware responses using customer behavior data
 * Customizable chat appearance with multiple themes (Rounded/Square)
 * Dynamic color customization for branding
 * Session management and chat history tracking
 * Floating chat widget with adjustable positioning
 * Mobile-responsive design

### Advanced Session Analytics

 * **Custom Class-Based Event Tracking** – Track clicks on any element using custom
   CSS selectors
 * **Click Event Throttling** – Prevent database flooding while maintaining accurate
   click counts
 * **Cookie Consent Bypass Mode** – Toggle GDPR compliance for immediate tracking
   or compliance-first approach
 * **Product Image Click Tracking** – Special tracking for product images with debounce
   to prevent duplicate events
 * **Anti-Double-Counting** – Custom rules take precedence over standard tracking
 * **Automatic Cache Busting** – Version strings with variable lengths for aggressive
   cache invalidation
 * **Multi-Layer Cache Compatible** – Works with Nginx, Varnish, REDIS, WP Rocket,
   Cloudflare

### How to Use

 * Export and Back-Up Current Pairings
    Safely export existing upsells and cross-
   sells, which doubles as a reliable back-up. The Pro version also takes your current
   selections into account, potentially enhancing the AI’s output.
 * Accelerated Order Export (Enabled HPOS Required)
    Swiftly export up to 100,000
   order items. The Pro version lifts the cap on orders, including comprehensive
   details like Order ID, Product ID, sequence, and more. Exclude product titles
   and prices at will. Maintain customer anonymity by withholding CustomerIDs, albeit
   with a slight compromise on recommendation precision. Opt for a seasonal sales
   analysis, focusing on trends pertinent to the current time of year. Refine Your
   Data with Our AI Engine Register at eshop-optimizer.com and submit your data.
   Within moments, receive refined upsell and cross-sell strategies for your leading
   products. Full catalog analysis available with the Pro version. eshop-optimizer.
   com respects your privacy and adheres to strick privacy guidelines. Our company’s,
   Oxford Metadata Ltd, privacy provisions has been approved by both Google and 
   Facebook. For further details please visit: https://eshop-optimizer.com/compliance
 * Import Tailored Upsell and Cross-sell Strategies
    Implement the AI-crafted upsell
   and cross-sell suggestions via an easy-to-upload CSV file.
 * Witness Enhanced Sales
    Marvel at the accuracy of our AI-driven recommendations
   and observe how they can boost your sales figures. We’re so confident in our 
   service that we offer free initial analyses – we believe you’ll be eager for 
   more and enthusiastic to spread the word! Experience the relevance of our recommendations
   and discover how AI can improve your store’s sales. We offer free analyses, and
   we are confident that you’ll want more and share our plugin with your friends!

For any queries or support, contact us at [support@eshop-optimizer.com](https://it.wordpress.org/plugins/ai-eshop-optimizer/support@eshop-optimizer.com?output_format=md).

Website: (https://eshop-optimizer.com)

## Screenshot

 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[
 * [[

## Blocchi

Questo plugin fornisce 3 blocchi.

 *   AIEO Brand Slider Lazy-hydrated brand carousel. Modes: top, new_brand, new_product,
   favourites (per-user affinity), manual. Server-renders the first N cards as a
   noscript fallback; client hydrates into a vanilla scroll-snap carousel with arrow
   nav.
 *   AIEO Brand A-Z Index Server-rendered A-Z brand directory. Every letter A–Z (
   plus '#' for non-Latin brands) is always present; empty letters render disabled.
   Sticky letter bar + per-letter brand grid with product counts. Reads exclusively
   from wp_aieo_core_brand_vitals.
 *   AIEO Brand Rails Stacked curated brand rails (Featured / New / Your Favourites/
   Top). Each rail has its own count and slides-per-view, configurable in the inspector.

## Installazione

Extract the contents of this plugin zip file into your wp-content/plugins/ directory
locally.
 Upload the extracted folder to your website. Navigate to wp-admin/plugins.
php on your dashboard. Find ‘AI eShop Optimizer’ and activate the plugin. Alternatively,
install directly through WordPress:

Go to the ‘Plugins’ menu in WordPress.
 Click ‘Add New’ and search for ‘AI eShop
Optimizer.’ Install and activate directly from your dashboard.

## Recensioni

![](https://secure.gravatar.com/avatar/90ac5fe73d60b64c0c267236b16ef449599c6979bfd187ee6043089dab9add20?
s=60&d=retro&r=g)

### 󠀁[Great Analysis plugin for commerce, the new ai chat is a nice bonus](https://wordpress.org/support/topic/great-analysis-plugins-for-commerce-the-new-ai-chat-is-a-nice-bonus/)󠁿

 [panosfasoulis](https://profiles.wordpress.org/panosfasoulis/) 3 Novembre 2025

Great plugin with practical use cases, no dumb paywalls and core functionality behind
payed versions. Everything you need to get your job done is available from the get
go with generous limits on order analysis.That being said the data you get from 
the pro version if you want to scale is invaluable and I highly recommend it.

![](https://secure.gravatar.com/avatar/a8664637d5df00f8c64e2683ecfdbe13b8098e1e3bbe909af31d6ef3115ae883?
s=60&d=retro&r=g)

### 󠀁[Best Ai Plugin](https://wordpress.org/support/topic/best-ai-plugin-5/)󠁿

 [araksia](https://profiles.wordpress.org/araksia/) 29 Aprile 2024

That’s a great plugin! 

 [ Leggi tutte le recensioni di 2 ](https://wordpress.org/support/plugin/ai-eshop-optimizer/reviews/)

## Contributi e sviluppo

“AI eShop Optimizer” è un software open source. Le persone che hanno contribuito
allo sviluppo di questo plugin sono indicate di seguito.

Collaboratori

 *   [ Oxford Metadata Ltd ](https://profiles.wordpress.org/oxfordmetadata/)

“AI eShop Optimizer” è stato tradotto in 1 lingua. Grazie a [chi traduce](https://translate.wordpress.org/projects/wp-plugins/ai-eshop-optimizer/contributors)
per il contributo.

[Traduci “AI eShop Optimizer” nella tua lingua.](https://translate.wordpress.org/projects/wp-plugins/ai-eshop-optimizer)

### Ti interessa lo sviluppo?

[Esplora il codice](https://plugins.trac.wordpress.org/browser/ai-eshop-optimizer/)
segui il [repository SVN](https://plugins.svn.wordpress.org/ai-eshop-optimizer/),
segui il [log delle modifiche](https://plugins.trac.wordpress.org/log/ai-eshop-optimizer/)
tramite [RSS](https://plugins.trac.wordpress.org/log/ai-eshop-optimizer/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 6.0 – 2026-05-29

**Block-checkout COD gating suite, BoxNow Partner API, payment-method reactivity**

 * NEW: Cash-on-Delivery can be disabled per destination country. A multiselect 
   in the COD card (Free Shipping tab) hides COD for the chosen billing countries,
   driven by the checkout country switcher — flip to Cyprus and COD disappears live;
   Greece keeps it. Works on both classic and block (Store API) checkout via a runtime
   delegate plus a `canMakePayment` block callback that updates reactively on every
   country/shipping change, no reload
 * NEW: COD can be disabled per shipping method / courier (e.g. tick “Box Now” to
   forbid COD whenever Box Now is selected). Table-rate rate IDs are normalised (
   the `_rule_{id}` suffix stripped) before matching so every carrier resolves correctly
 * NEW: per-courier COD fee override with a `{cod_fee}` placeholder in the gateway
   description that resolves to the courier-specific amount. Decimal entry accepts
   both `.` and `,`
 * Performance: the entire gating layer only registers its filters / block JS when
   a country, courier, or fee override is actually configured — stores on plain 
   default COD pay no runtime cost
 * NEW: Payment Gating (cheque-on-pickup) now works on block checkout and lives 
   under the COD card on the Free Shipping tab (its standalone tab is removed). 
   Runtime delegate added so the Store API path honours it
 * NEW: BoxNow Partner API driver — full integration (manual v7.2). OAuth2 client_credentials
   auth, create voucher, label PDF, cancel, and locker listing; the order-edit Print
   action now appears for BoxNow vouchers. Verified create  label  cancel on production.
   Credentials live in `courier_boxnow` settings; `build_voucher_payload()` now 
   passes `order_id` so the driver can read the customer’s chosen locker
 * NEW: Skroutz / Shopflix feeds emit `color` + `additional_image` for the “Μόδα”(
   fashion) category, sourced from core product vitals. Skroutz wraps colour in 
   CDATA and emits `<color/>` when empty so the field is present on every product
 * Fixed: checkout landing message now spans the content width (carries the theme`
   alignwide` class) so it lines up with the checkout/cart rows below
 * Fixed: chat model selection now saves newly released models (e.g. Claude Opus
   4.8) — the Save handler validates against the model registry instead of a hardcoded
   whitelist that silently reverted the choice
 * Fixed: `array_map()` fatal on the chat-model save path, plus four more `(array)
   sanitize_text_field($_POST[...])` array-swallowing anti-patterns (embedding manager,
   ratings, TRS zone admin, DMM social login)
 * Removed: the deprecated legacy shipment-tracking module (AIEO Fulfillment tracking
   supersedes it; orphaned option cleaned up)

#### 5.10 – 2026-05-28

**Shopflix voucher endpoint fix + admin list-table per-page caps**

 * Fixed: Shopflix voucher PDFs were coming back with the wrong layout/rotation.
   The print endpoint expects `/shipments/{trackingNumber}/print`, not `/shipments/{
   orderId}/print` — Shopflix support confirmed 2026-05-28. We now capture `trackingNumber`
   from the create response (with a `/orders/{id}` fallback for already-existing
   shipments) and call print correctly. Vouchers now respect the merchant-portal-
   selected label format
 * NEW: admin list-table per-page caps. Tools tab  “Admin list-table per-page caps”
   card sets a hard ceiling on Screen Options for the All Orders + All Products 
   lists (defaults 200/200). Operators below the cap keep their personal value untouched;
   only those above (e.g. shop managers running at 500–600) get clamped on the next
   render. Settings are administrator-only — shop managers see the card but it’s
   overlaid with a frosted “Administrator only” lock. Cap=0 disables enforcement
   for that screen

#### 5.9 – 2026-05-28

**AS async runner restored, admin-bar menu, Shopflix error decoder, re-ship of ACS
driver**

 * Critical fix: ensures the ACS Courier driver fixes actually ship. The 5.8 wp.
   org package was built from a snapshot that predated the ACS driver rewrite, so
   sites updating from 5.8 didn’t get the 10 fixes documented in the 5.8 changelog.
   5.9 re-bundles them properly. If you’re on 5.8 and your ACS vouchers were still
   mis-printing (Weight: 5,00, COD: 602,00), update to 5.9
 * NEW: Action Scheduler async runner re-enabled. Pending actions now drain continuously
   instead of waiting for the 5-minute system-cron window. AS’s own background AJAX
   runner is allowed to fire on every page load; regular page rendering stays unaffected(
   concurrent_batches=0 on web). One prod site went from 150 overdue actions to 
   81 in under a minute after the fix
 * NEW: admin-bar menu. The “AI Optimizer” icon appears in the WordPress admin toolbar
   with dropdown shortcuts to Data Prep, e-shop Manager, and AI Chat. Saves the 
   operator a sidebar-scroll on every screen
 * Fixed: Shopflix accept errors are now human-readable. The Shopflix API returns
   errors under `error.message` + `error.code`, but our parser was reading `error.
   errorMessage` and falling back to “HTTP 400”. Now surfaces the actual message(“
   Cannot Accept Order (10303)” etc.) so operators know whether to retry, contact
   Shopflix support, or skip the order

#### 5.8 – 2026-05-24 to 2026-05-26

**Three-day stretch — COD surcharge fix, Skroutz webhook repair, ACS Courier driver
rewrite, AS dedup hardening, fulfillment polish**

 * Fixed: COD payment method was hidden at checkout when the cart used a non-whitelisted
   shipping slug. AIEO now force-restores the configured COD gateway, pre-empting
   WC’s “Enable for shipping methods” whitelist and any third-party filter (Box 
   Now, COD-Plus). Runtime + admin both updated
 * Fixed: COD fee now overwrites a same-label legacy fee instead of skipping via
   idempotency. Operator-set €X is authoritative
 * Marketplace Order Importer — Skroutz webhook integration repaired end-to-end:
   parser accepts both wrapped `{event_type, order:{…}}` and flat `{event_type, 
   id, code, …}` payload shapes; falls back to `order.code` when Skroutz omits the
   numeric `id`; uses Skroutz’s current line-item field names (`product_name` / `
   unit_price` / `total_price`); Mapper survives orphaned product references via
   try/catch + free-form line-item fallback
 * NEW: `REGISTERED` state added to the MOI Accept/Reject button allowlist so Shopflix
   orders in their initial state actually show the action buttons
 * ACS Courier driver — ten fixes audited against the official ACS Rest API docs:
   response envelope preserved (so `ACSExecution_HasError` + per-row `Error_Message`
   reach the UI); response traversal corrected to `ACSOutputResponce.ACSValueOutput`;
   address split into street + number; Greek phone landline/cell split with `+30`
   stripping; `Charge_Type` defaults to `2`, auto-switches to `4` when COD; `Acs_Delivery_Products`
   auto-appends `COD` when `cod_amount > 0`; print uses the correct `ACS_Print_Voucher`
   alias and decodes the base64 PDF; cancel uses the correct `ACS_Delete_Voucher`
   alias; `Weight` + `Cod_Ammount` now sent as JSON numbers (was being parsed by
   ACS with Greek locale, multiplying decimals by 10 on the printed label)
 * NEW: Recompute queue — atomic dedup at the AS schedule layer. New `pre_as_schedule_*`
   filters with MySQL `GET_LOCK` short-circuit `as_schedule_*` calls when a pending/
   in-progress action exists. Closes the dedup-bypass that let parallel recurring
   chains accumulate (one prod site had 225 pending ticks for a single hook before
   the fix)
 * Fixed: Session Tracker `trackAddToCart` now guards `$button.*` access and falls
   back to page context when callers fire `added_to_cart` without the 4th `$button`
   arg. Fixes the spinner-stuck symptom on the swatches bulk-add path
 * NEW: Fulfillment vouchers — `postal_code` column stored at voucher creation. 
   Migration is idempotent and runs on plugin upgrade
 * Fixed: Stock import now strips the UTF-8 BOM, transcodes Windows-1253 / ISO-8859-
   7  UTF-8, and synthesises a header row when the first line is data. Greek-locale
   Excel exports import without manual conversion
 * NEW: Price export — Stock column + Vitals fast-path. Reading from the vitals 
   cache turns a 90-minute export on a 25k-SKU catalogue into about 2 minutes; Live
   path unchanged
 * Marketplace feeds — field parity with the wpwoof reference + universal `?cf-no-
   cache=1` cache-bust on every emitted URL. Fixes the long-standing `g:price` bug
   that was emitting the sale price instead of the regular price
 * NEW: Geniki monthly invoice CSV reconciliation card on Fulfillment  Reports. 
   Matches invoice rows to voucher rows; surfaces orphans either direction. Pattern
   is carrier-agnostic; Geniki is the first integrated
 * Bulk fulfillment actions are now memory-protected. Lifts the practical limit 
   from ~40 orders to 200–500+ depending on the carrier API
 * Critical fix: WC 10.9 compat migration was looping forever. Replaced the broken“
   _product_image_gallery missing” gate with explicit `_aieo_variation_migrated`
   markers (one prod site ran the loop 153,219 times across 2.5 days). New operator
   UI in DMM  Variations gallery exposes the migration state
 * Fixed: Variation image storage now uses a two-hop join via `_product_image_gallery`(
   WC 10.9 canonical)  `_thumbnail_id`  parent featured. Fixes the “variation image
   renders as the 40×40 swatch chip” regression
 * Fixed: Star ratings mobile non-FSE alignment + caption wrap. Defeats Botiga’s
   universal `button { min-width: ... }` rule that pushed empty stars onto a second
   row

#### 5.7 – 2026-05-24

**Day-after follow-up to 5.6 — runtime-only brand blocks, engagement-gated Web Push,
plus three small admin polish items**

**Web Push — engagement-gated banner (Chrome quiet-UI mitigation)**
 * NEW: the 
opt-in banner no longer mounts on a flat `setTimeout(SHOW_DELAY_MS)`. It now waits
for AIEO Session Tracker to dispatch an `aieo:engagement` CustomEvent on `document`
at one of these milestones: `pageviews-2`, `pageviews-3`, `scroll-25`, `scroll-50`,`
scroll-75`, `add-to-cart`, `time-30s`. The “Show delay (ms)” admin setting becomes
a minimum-wait floor (banner never appears before that even if scroll fires at 2s)*
NEW: hard-cap fallback at 90s — visitors who never hit a milestone but also don’t
bounce still see the banner eventually * Graceful degradation: when AIEO Session
Tracker is absent (operator disabled it OR runtime-only install without the admin
asset), falls back to the original flat-timeout behavior so no install regresses*
Why this matters: Chrome’s [quieter notification permission UI](https://developer.chrome.com/blog/quieter-permission-ui-for-notifications/)
auto-denies prompts on domains with low acceptance rates. Asking bounce visitors
on first-page-load poisons the reputation — every silent auto-denial counts as a“
Block” signal. By only prompting engaged visitors, the acceptance rate per prompt
climbs and Chrome’s quiet UI fires less aggressively over time * Engagement signal
source: `AIEO_SESSION_TRACKER.pageViewsInSession` (new public property, sessionStorage-
backed, incremented eagerly even for bounce visitors so counts are accurate). New`
aieo:engagement` CustomEvent is also dispatched from inside `trackAddToCart` and`
trackScrollDepth` so other consumers can hook in too — no new tracker, just extends
what’s already there

**Brand blocks now runtime-resolvable — admin plugin no longer required for storefront
pages that render `aieo/brand-\*`**
 * NEW: `AIEO_Runtime_Brand_Blocks` delegate
in the runtime plugin registers the six brand-related server-rendered blocks (`aieo/
brand-azindex`, `brand-slider`, `brand-rails`, `brand-related`, `brand-archive-hero`,`
brand-story`) at `init` priority 29 so they’re available even when the admin plugin
isn’t in the request’s plugin whitelist. block.json + render.php files stay in the
admin plugin’s directory (single source of truth); `AIEO_Core_Brand_Vitals` autoloads
via the mu-plugins autoloader regardless of admin being active * `AIEO_Blocks_Loader::
register_blocks()` now consults `WP_Block_Type_Registry::is_registered()` before
each `register_block_type()` call — when both plugins are active the runtime registration
at init@29 wins, and admin’s loop at init@30 silently skips already-registered blocks(
no more `_doing_it_wrong` notices from duplicate registration) * Shared style handle`
aieo-article-cards` (needed by brand-related) is also registered by the runtime 
delegate so brand-related renders correctly in runtime-only mode * Use case: pages
with brand sliders / brand A-Z directory / related-brands rails on category, blog,
and landing pages no longer require the full admin plugin on every request — same
render output, ~40 ms saved per page on cold-cache fetches

**Fix — Session Tracker JS 404 + MIME-type refusal on every front-end page**
 * 
Fixed: `aieo-session-tracker.js` returned HTTP 404 with `text/html` body because
the class was moved to the runtime plugin (Phase 1.5) but the JS asset was left 
behind in the admin plugin. `plugin_dir_url(__FILE__) . '../assets/js/aieo-session-
tracker.js'` from the runtime class resolved to `runtime/assets/js/aieo-session-
tracker.js` — which didn’t exist. Browsers logged “Refused to execute script from…
because its MIME type (‘text/html’) is not executable” on every page load. The asset
now ships alongside both plugin copies of the class so the runtime-first autoloader
path finds its own asset

**Critical fix — Web Push: opt-in pipeline broken by deferred JS + Service-Worker
404 + silent localStorage throws**
 * Fixed: `AIEO_DMM_Web_Push` now registers `
rocket_delay_js_exclusions` on activation so WP Rocket’s “Delay JavaScript execution”
feature stops treating `aieo-push-optin`, `aieoPush`, `aieo-push-sw` and `aieo-magic-
link-modal` as deferred-until-interaction scripts. Without this, the opt-in banner
JS only ran after a mouse-move / scroll / click that lands inside the page — bots,
remote-desktop sessions, and visitors who follow a deep link straight to a product
page never triggered it, so the subscribe POST never fired. Now Just Works on every
install with no operator config * Fixed: `aieo-push-optin.js` silently died on Edge’s
Tracking Prevention (and Safari ITP) when `localStorage.getItem()` threw — the unguarded
call killed the entire IIFE before the banner could even render. Now wrapped in 
try/catch; blocked storage is treated as “no cooldown set” so the banner still appears*
NEW: silent re-subscribe path — when `Notification.permission === 'granted'` from
a prior visit but no `wp_aieo_push_subscriptions` row exists (e.g. the earlier SW-
404 bug killed the original POST), the JS now silently registers the SW, calls `
pushManager.subscribe()` and POSTs the result on page load. No banner re-prompt,
no operator action — historical “granted but never recorded” users heal themselves
on next visit * Improved: `postSubscription()` now checks `response.ok` and throws
on non-2xx so the outer try/catch records the failure instead of fire-and-forget.
CFG.debug-gated console output for the operator who wants to dig in * See [docs/WEB_PUSH_INSTALL.md §4](https://it.wordpress.org/plugins/ai-eshop-optimizer/docs/WEB_PUSH_INSTALL.md?output_format=md)
for the Nginx `location = /aieo-push-sw.js` block — the third leg of this trio (
404 SW URL was the upstream root cause on the FF prod incident 2026-05-23)

**Data Prep Schedule — `product_attributes` stage added so brand blocks self-populate
without the manual rebuild**
 * NEW: hourly data-prep cron now runs a `product_attributes`
stage between `category_hierarchy` and `product_vitals`. This stage calls the `AIEO_InsertCoreProductAttributes`
stored procedure with the operator’s configured brand / vendor / size / color attribute
taxonomies — resolving parent `brand_id` from `wp_term_relationships`. The existing`
propagate_brand` stage then copies parent  variations as before * Why it matters:
brand blocks (`aieo/brand-azindex`, `brand-slider`, `brand-rails`, `brand-related`,`
brand-archive-hero`, `brand-story`) used to render empty on sites where the operator
hadn’t ticked “Please recreate the product core attributes and principal categories”
in the Operational Efficiency Settings UI. That checkbox is now correctly scoped
as a manual intervention only — the hourly schedule covers the day-to-day case *
Defensive: the new stage uses `information_schema.ROUTINES` to verify the SP exists
before CALLing it — older installs without the SP get a clean no-op instead of breaking
the whole tick

**Google Reviews — single-location auto-fallback + clearer empty states**
 * NEW:
when the `aieo/google-reviews` block (or `[aieo_google_reviews]` shortcode) is in“
Single location” mode but no slug is set AND the page can’t auto-resolve a location
from context, the block now falls back to the operator’s only configured location
if exactly one exists. Most SMB stores have a single physical shop — they no longer
need to pick a slug for every block instance, the block just works * Improved: the
empty-state message now shows the actual number of locations configured and steers
the operator to the right next step. “No Google Reviews locations configured yet—
add one under…” (when 0 exist) vs “You have N locations configured — pick one via
the block’s sidebar, or switch to All-locations / Cards grid mode” (when 2+ exist).
Replaces the old cryptic “Set a location slug, or place this block on a page bound
to a location row” * The admin Settings tab now carries a full “How to display the
reviews on the storefront” help card explaining the FSE block, the three shortcodes,
all 11 attributes, and a `do_shortcode()` PHP-template snippet — so operators on
classic themes / page builders find the docs without leaving the admin

**Google Reviews — shortcodes for non-FSE themes + runtime-only exposure**
 * NEW:`[
aieo_google_reviews]` shortcode — wraps the same render path the `aieo/google-reviews`
block uses, so classic themes / widget areas / page-builder pages can drop in Google
Reviews without needing FSE block-template editing. Single-location mode when a `
location` attribute is supplied (`[aieo_google_reviews location="downtown"]`), all-
locations mixed-feed otherwise (`[aieo_google_reviews]`). All block attributes are
exposed in snake_case: `min_rating`, `max_count`, `layout` (grid/list/carousel),`
presentation` (static/slider/rotator), `autoplay_sec`, `show_overall`, `show_rate_us`,`
show_maps_button`, `heading`, `mode` (single/all_mixed/cards_grid) * NEW: `[aieo_google_locations_grid]`
shortcode — convenience alias forced to `mode="cards_grid"` for the per-location
cards layout. Accepts the same attributes * Single source of truth: both shortcodes
call `AIEO_Google_Reviews_Block::render()` directly, so the cache, the markup, and
the CSS handle are identical to the block output — operators can mix-and-match blocks(
FSE) and shortcodes (classic) on the same site without divergent rendering * NEW:`
AIEO_Runtime_Google_Reviews` delegate exposes the block + shortcodes to runtime-
only contexts — admin’s `AIEO_DMM_Google_Reviews` module is no longer required on
the frontend. block class files stay in admin’s `includes/dmm/google-reviews/` (
single source of truth); the mu-plugins autoloader resolves them on demand. The 
block class is now idempotent (`AIEO_Google_Reviews_Block::register()` guarded by
a `$registered` flag) and admin’s call is gated behind `! defined( 'AIEO_RUNTIME_OWNS_AJAX')`
so runtime is exclusive when both plugins are active. Same `aieo/store-info` block
also exposed

**Data Prep Schedule**
 * NEW: `product_attributes` stage runs hourly between `category_hierarchy`
and `product_vitals` — calls `AIEO_InsertCoreProductAttributes` automatically so
parent `brand_id` populates without ticking the manual “Recreate product core attributes”
checkbox * NEW: per-stage Notes column in the Last-run table — shows useful metrics
per stage (e.g. “4921 / 13513 with brand · 194 distinct brands”)

**Admin polish**
 * Fixed: Database Performance Optimization card no longer hardcodes“
MariaDB 11.4+ detected!” / “MySQL 8.0+ detected!” — now interpolates the actual 
detected version from `aieo_check_mariadb_version()` (e.g. “MariaDB 11.8.7 detected!”).
Falls back to the prior threshold strings if `version_number` is somehow missing*
Fixed: Google Reviews  Locations admin no longer uses Femme-Fatale-specific placeholder
text (`piraeus` slug, `Femme Fatale Πειραιάς` display name). All four placeholders
are now generic + translatable (`e.g. main-store, downtown, branch-2`, `Customer-
facing label for this location`, etc.) so the form isn’t shipping client-branded
examples

#### 5.6 – 2026-05-23

**Same-day follow-up to 5.5 — Fulfillment UX polish + two production hotfixes + 
CSV round-trip cleanup**

**Production hotfixes**
 * Hotfix: `Undefined constant "AIEO_VERSION"` fatal in `
AIEO_Wishlist::enqueue_assets()` on category pages when AIEO Runtime loads before
the main plugin’s constant definition. Defensive `defined()` fallback chain in the
runtime: `AIEO_VERSION`  `AIEO_RUNTIME_VERSION`  `'0.0.0'`. Same pattern for `AIEO_FILE`.
Surfaced on prod femme-fatale.gr `/me-ammonia/` as a site-wide HTTP 500 immediately
after the 5.5 upgrade * Performance: new `AIEO_Perf::strip_aioseo_product_schema_on_archives()`
short-circuits AIOSEO Pro’s Product / WooCommerceProduct / Offer / AggregateOffer
schema graphs on archive and taxonomy pages. AIOSEO was iterating every product 
in the loop and calling `$product->get_available_variations()`, which on Iconic 
Variation Swatches triggers a `$wpdb->get_results()` per variation — ~900 queries
per render on a 15-variable-product category. Single-product pages are unaffected(
full JSON-LD still emitted where Google rich results actually matter). Prod render
time on `/me-ammonia/`: 9.4s  3.2s

**Fulfillment — order-edit meta box**
 * Fixed: Add Voucher carrier dropdown was
showing every registered carrier including disabled ones. Now filters to operator-
enabled carriers + custom carriers only (matches the rest of the admin) * Fixed:
pressing Enter in the tracking-number input was submitting the order’s outer form,
navigating to the “Downloaded products” panel. The AIEO meta-box inputs now suppress
Enter and trigger the explicit Save button instead * Improved: ACS (and any carrier
already mapped via `get_carrier_for_order()`) is pre-selected when the modal opens,
instead of defaulting to the alphabetical-first carrier * Improved: button labels
now reflect what will actually happen — “Save tracking” / “Generate voucher” by 
mode, with a paired “Save + mark completed” / “Generate voucher + mark completed”
for the common single-click flow * Fixed: custom carriers with `create_mode = 'manual'`(
no API integration) no longer error with “driver does not support create_voucher”.
The manual flow now persists the tracking number directly and fires the customer
email, bypassing the driver call

**Fulfillment — Carriers without API admin**
 * NEW: inline Edit button next to 
Remove on every row — label and tracking-URL template editable in place; Save / 
Cancel pair posts to the same upsert AJAX endpoint * Fixed: `tracking_url_template`
field was being silently ignored by the courier-driver base when an operator overrode
the per-carrier default. `AIEO_Courier_Driver_Base::tracking_url()` now consults
the operator-saved template first * NEW: filter `aieo_custom_carriers` — themes /
plugins can register carriers from `functions.php`, same pattern as WooCommerce 
Shipment Tracking’s `wc_shipment_tracking_get_providers`

**Fulfillment — Settings**
 * NEW: “Backfill customer shipping paid” card — one-
shot retrospective pass that fills `_aieo_customer_shipping_paid` on historical 
orders so the Shipment Cost reports’ income column is populated for past periods(
not only orders placed after the cost-tracking went live)

**Shipment Cost reports**
 * NEW: sortable column headers on the results table —
click to sort by orders / income / our cost / free-shipping subsidy. In-memory client-
side sort (the result set is already paginated server-side)

**Role-based pricing — CSV round-trip**
 * Fixed: import now strips a leading UTF-
8 BOM from the uploaded file before parsing (Excel-on-Windows exports leave one).
Previously caused “must include sku column” errors when the actual header was `\
xEF\xBB\xBFsku` * Fixed: import auto-detects the separator (`,` vs `;` vs `\t`) 
by counting candidates in the first line. Greek-locale Excel exports use `;`; the
previous hardcoded `,` parser produced unparseable single-column rows * Improved:
import error messages now state the detected separator and the header row that was
parsed, so operators can see exactly why their file was rejected * Fixed: export
no longer prepends a UTF-8 BOM. Cross-environment round-trips (export from one site,
import into another) used to fail until the import learned to strip BOMs; now the
file is BOM-clean from the start, keeping `cat` / `awk` / `diff` output untouched
as well

**Critical fix — Social Login settings silently wiped on every Save**
 * Fixed: `
AIEO_DMM_Social_Login::ajax_save_settings()` used the `sanitize_text_field( $array)`
anti-pattern as the guard for both `providers` and `intents` POST arrays. `sanitize_text_field()`
on an array returns `''` (empty string), so `is_array('')` was always false — every
Save click silently wrote empty providers + every-intent-off, regardless of what
the operator had ticked in the UI. Symptom: “I’ve enabled Google + Facebook for 
login / checkout but the buttons never render anywhere.” The guard is now `is_array(
$_POST['providers'])` directly; per-field sanitization (`sanitize_text_field`, `
sanitize_key`) still runs on each value. Operators with previously-wiped settings
need to re-enter their config once * Same anti-pattern was caught in 3 other modules
in 5.2 (see memory `wp_sanitize_text_field_array_antipattern`); this one slipped
through because the SSO admin tab is less frequently tested

**Marketplace Order Importer — webhook setup guide + Rooster-derived tokens**
 *
NEW: per-vendor “Setup help” card on the AIEO MOI  Vendors tab. Surfaces the webhook
URL prominently with a one-click Copy button and per-provider step-by-step instructions
for where to paste it into the marketplace’s merchant panel. For Skroutz: deep-links
to the exact `merchants.skroutz.gr` settings page, names the field operators need
to find (“Webhook URL / Webhook παραγγελιών”), and reminds them to deactivate the
legacy `skroutz-marketplace-xml-for-woocommerce` plugin once the new URL is saved.
Poll-only providers (Shopflix, eMag) get the card skipped — nothing for the operator
to do * NEW: webhook tokens on freshly-created vendors are now derived from the 
operator’s Rooster API key via `substr(hash('sha256', $rooster_key . '|moi-webhook
|' . $vendor_slug), 0, 20)`. Each install gets a unique, stable, self-identifying
webhook URL — and the URL is regenerable from the Rooster key alone, so losing the
vendor row no longer means re-pasting random tokens into every marketplace panel.
Hash, not substring, so the token never exposes any portion of the Rooster key. 
Falls back to a random token on standalone (non-Rooster) installs * NEW: per-vendor“
Use Rooster-derived token” button on the setup card lets operators migrate existing
random tokens to the Rooster-derived value (a small “✓ Token derived from your Rooster
API key” badge then appears under the URL). Skips gracefully when Rooster isn’t 
connected * `AIEO_MOI_Vendor_Manager::derive_webhook_token_from_rooster($slug)` 
+ `rotate_webhook_token_from_rooster($id)` are the new helpers; new optional contract
method `webhook_setup_steps($url)` on providers drives the per-provider guidance(
Skroutz ships it; absent on poll-only providers)

**Product Display — classic-theme info-column ordering**
 * Fixed: the operator-
saved Display Order for the info-column cluster (Product Meta / Payment Logos / 
Trust Badges / …) was only being honored on FSE themes. On classic themes those 
modules were hardcoded to `woocommerce_single_product_summary` priorities 30 / 35/
40, so Product Meta always rendered last regardless of how the operator dragged 
the rows. New `AIEO_DMM_Product_Display::reorder_classic_theme_cluster()` re-prioritises
the three callbacks into the 31–34 band per the saved order, mirroring the existing`
reorder_classic_theme_recos()` pattern. Modules with independent slot logic on classic
themes (Brand Display’s position picker, Brand Gifts’ pre-cart band, Complementary/
Waitlist / Product Needs’ add-to-cart-form positions) are intentionally left where
they are

**Deprecation**
 * `AIEO_DMM_Shipment_Tracking` module renamed in the admin sidebar
to “Shipment Tracking (legacy)” with a yellow deprecation banner. The new Fulfillment
Carriers system supersedes it end-to-end; the legacy module will be removed in a
future release

#### 5.5 – 2026-05-23

**MAJOR RELEASE: WooCommerce 10.9 forward-compatibility + critical fix for the silent
variation-attribute wipe + unified third-party variation gallery filter**

**Critical fix — silent loss of variations on save (long-standing bug)**
 * Fixed:
products whose variation attribute is type `image` or `button` no longer lose their`
is_variation` declaration when the parent product is saved. The bug: AIEO’s `image`/`
button` attribute types never registered an admin form-field renderer for their 
term multi-select. When WC’s classic editor’s product-save handler ran, `attribute_values[]`
was empty in POST for those attribute rows, so WC’s `WC_Meta_Box_Product_Data::prepare_attributes()`
dropped them — wiping `_product_attributes` for the variation attribute on every
product save * Fixed: new public method `AIEO_DMM_Swatches::render_custom_attribute_terms_select()`
hooks `woocommerce_product_option_terms` for `color`/`image`/`button` types and 
emits the same `wc-taxonomy-term-search` multiselect WC uses for `select`-typed 
attributes. Future saves preserve `_product_attributes` correctly * Added: one-shot
auto-repair for products that were already silently broken. On plugin update, reconstructs
the missing variation-attribute declaration from each variation’s `attribute_pa_*`
postmeta and re-attaches the term relationships to the parent. Skips products that
reference deleted (orphan) taxonomies — those need manual re-mapping by the operator

**WooCommerce 10.9 forward-compatibility — `variation_gallery` + `wc-visual-attribute`**
*
NEW: declares compatibility with WC 10.9’s experimental `variation_gallery` feature
via `FeaturesUtil::declare_compatibility()`. When merchants enable the toggle in
Settings  Advanced  Features, AIEO’s variation gallery data is already in WC’s canonical
postmetas — no migration window, no broken stores * NEW: declares compatibility 
with WC 10.9’s experimental `wc-visual-attribute` (Color swatches for attributes)
feature * Schema migration: `botiga_variation_gallery`  `_thumbnail_id` + `_product_image_gallery`(
CSV) + `_wc_variation_gallery_legacy_fallback_disabled = yes` sentinel on every 
variation. Video entries (uploaded video attachments + YouTube / Vimeo embed JSON)
relocate to the AIEO sidecar `_aieo_variation_gallery_videos` with their original
positions preserved for re-interleaving at render time * Schema migration: term 
swatch metas `product_attribute_color` / `product_attribute_color_type` / gradient
+ multiple sub-keys  WC canonical `color` term meta + AIEO sidecars (`_aieo_swatch_color_type`,`
_aieo_swatch_gradient`, `_aieo_swatch_multiple`). Image-type swatches relocate `
product_attribute_image`  `_aieo_swatch_image_id`. Legacy keys are preserved as 
read-fallback during the cutover window * Schema migration: attribute taxonomies
with `attribute_type = 'color'` flip to `wc-visual` so WC’s native chips, filter
blocks, and the variation-selector inner block recognise them. Operator-opt-in: 
the flip only runs when WC’s `wc-visual-attribute` feature is enabled * Migration
runs via Action Scheduler in 250-item batches; idempotent; also exposed as `wp aieo
migrate wc-compat` for manual / observable runs * When WC’s `variation_gallery` 
feature is enabled, AIEO unhooks `\Automattic\WooCommerce\Internal\VariationGallery\
ClassicVariationGalleryAdmin::render_variation_gallery_field` so the admin shows
AIEO’s picker (which handles videos) instead of two competing pickers

**New filter `aieo_variation_gallery_image_ids` — bridge for third-party storage**
*
NEW: single public filter `apply_filters('aieo_variation_gallery_image_ids', $ids,
$variation_id, $context)`. Third-party plugins / themes (Iconic Variations, the 
retired WooCommerce.com Additional Variation Images extension, custom themes) hook
this filter from `functions.php` to tell AIEO where they store variation gallery
image IDs. Return non-null array to short-circuit; return null to delegate to AIEO’s
canonical  legacy resolution * NEW: `AIEO_DMM_Variations_Gallery::resolve_image_ids(
$vid, $ctx)` — the single public reader every AIEO module calls. Replaces direct
postmeta reads in: variation gallery admin picker, `woocommerce_available_variation`
JS payload, `aieo/product-variations-gallery` block render, exchanger import/export,
data-prep stage * `$context` values: `'admin'`, `'frontend'`, `'block_render'`, `'
data_prep'`, `'serializer'` — let third-party adapters apply different rules per
caller * Documentation: `docs/FILTER_VARIATION_GALLERY_IMAGE_IDS.md` with 4 worked
examples (Iconic, Additional Variation Images, custom theme, context-aware) + performance
+ testing notes

**Marketplace feeds gain variation gallery URLs**
 * NEW: `vitals.image_gallery_urls`(
existing column, now populated) gets a fresh data-prep stage that walks `_product_image_gallery`
for each row and emits a CSV of full-size URLs. Marketplace feeds (Google Shopping`
g:additional_image_link`, Skroutz `<additional_image>`, Shopify `images`) now ship
variation galleries without a separate API call * SQL bulk-fill (canonical `_product_image_gallery`
first, legacy `botiga_variation_gallery` fallback) handles 20-image galleries via
a chained `SUBSTRING_INDEX` walk; ~1s for 39k rows on the FF benchmarker * PHP post-
pass applies the `aieo_variation_gallery_image_ids` filter only when registered,
so the typical store pays zero extra DB cost

**Cart, sticky-add-to-cart, and product-card readers updated for the new sidecar
metas**
 * `class-aieo-dmm-swatches-runtime.php::resolve_term_color_style()` — read
order is now AIEO sidecar (`_aieo_swatch_color_type` + `_aieo_swatch_gradient` /`
_aieo_swatch_multiple`)  WC canonical `color`  legacy `product_attribute_color*`.
Gradient and multiple-color swatches keep rendering as before; new term edits use
canonical + sidecar without breaking legacy plugins that still read the old keys*`
class-aieo-dmm-swatches-runtime.php::resolve_term_image_src()` — `_aieo_swatch_image_id``
product_attribute_image`  new `aieo_swatch_image_id_for_term` filter for forward-
compat when WC adds image swatches (currently WC10.9-dev ships color swatches only)*`
class-aieo-dmm-checkout-product-images.php` — same sidecar  canonical  legacy chain
when picking the cart-line variation thumbnail * `class-aieo-dmm-sticky-atc.php`—
color, gradient, multiple-color, and image swatches all read through the new resolution
chain. Sticky cart on PDP keeps rendering brand-specific image swatches identically
pre- and post-migration * `class-aieo-dmm-data-prep-scheduler.php` — SQL for `variation_swatch`
and `image_url` updated to two-pass (canonical preferred, legacy as `WHERE NULL`
fill-in)

**Custom carriers — inline Edit + new third-party filter**
 * NEW: inline Edit button
on every row in the “Carriers without API” admin table. Label and tracking-URL template
become editable in place; Save / Cancel pair posts to the same `aieo_ff_save_custom_carrier`
AJAX endpoint (slug is the upsert key). The shipping-method-link dropdown keeps 
its own per-row autosave — Edit doesn’t touch it * NEW: filter `aieo_custom_carriers`
lets themes / plugins register carriers from `functions.php`, mirroring WooCommerce
Shipment Tracking’s `wc_shipment_tracking_get_providers` pattern. Carriers added
via filter appear identically to operator-added ones in the admin table, the order-
row tracking dropdown, and customer emails. Operator overrides via save win on the
next read (option-side wins because the upsert is final)

**Exchanger (product import/export) writes WC canonical**
 * `class-aieo-exchanger-
product-serializer.php` — variation gallery export goes through `resolve_image_ids()`,
so third-party filters and WC10.9 canonical reads both round-trip correctly * `class-
aieo-exchanger-product-importer.php` — imported variation galleries now write to`
_thumbnail_id` + `_product_image_gallery` + sentinel (drops the legacy `botiga_variation_gallery`
write target). Existing exports stay readable

**Attribute-type registration cleanup**
 * `available_attribute_types()` — keeps
AIEO-only `image` + `button` types always. Registers `color` …

## Meta

 *  Versione **6.0**
 *  Ultimo aggiornamento **19 ore fa**
 *  Installazioni attive **20+**
 *  Versione WordPress ** 5.7 o superiore **
 *  Testato fino alla versione **7.0**
 *  Versione PHP ** 7.4 o superiore **
 *  Lingue
 * [English (US)](https://wordpress.org/plugins/ai-eshop-optimizer/) e [Greek](https://el.wordpress.org/plugins/ai-eshop-optimizer/).
 *  [Traduci nella tua lingua](https://translate.wordpress.org/projects/wp-plugins/ai-eshop-optimizer)
 * Tag
 * [AI chat](https://it.wordpress.org/plugins/tags/ai-chat/)[analytics](https://it.wordpress.org/plugins/tags/analytics/)
   [content recommendations](https://it.wordpress.org/plugins/tags/content-recommendations/)
   [conversational AI](https://it.wordpress.org/plugins/tags/conversational-ai/)
   [embeddings](https://it.wordpress.org/plugins/tags/embeddings/)
 *  [Visualizzazione avanzata](https://it.wordpress.org/plugins/ai-eshop-optimizer/advanced/)

## Valutazioni

 5 su 5 stelle.

 *  [  2 recensioni a 5-stelle     ](https://wordpress.org/support/plugin/ai-eshop-optimizer/reviews/?filter=5)
 *  [  0 recensioni a 4-stelle     ](https://wordpress.org/support/plugin/ai-eshop-optimizer/reviews/?filter=4)
 *  [  0 recensioni a 3-stelle     ](https://wordpress.org/support/plugin/ai-eshop-optimizer/reviews/?filter=3)
 *  [  0 recensioni a 2-stelle     ](https://wordpress.org/support/plugin/ai-eshop-optimizer/reviews/?filter=2)
 *  [  0 recensioni a 1-stelle     ](https://wordpress.org/support/plugin/ai-eshop-optimizer/reviews/?filter=1)

[Your review](https://wordpress.org/support/plugin/ai-eshop-optimizer/reviews/#new-post)

[Vedi tutte le recensioni](https://wordpress.org/support/plugin/ai-eshop-optimizer/reviews/)

## Collaboratori

 *   [ Oxford Metadata Ltd ](https://profiles.wordpress.org/oxfordmetadata/)

## Supporto

Hai qualcosa da dire? Ti serve aiuto?

 [Chiedi nel forum di supporto](https://wordpress.org/support/plugin/ai-eshop-optimizer/)