CTX Feed — changelog archive
The most recent releases are listed in readme.txt; this file carries the full history.

= Version 8.0.21 =
* Fix: saving a feed no longer fails when a filter or mapping row carries a non-text value — the pre-save completeness check now treats numbers, on/off toggles and empty values exactly the way the server does, so the save proceeds instead of the page breaking.
* Fix: Skroutz feeds with nested variations respect the feed's stock filters — variations excluded by the stock settings no longer ship inside <variations>.
* Fix: feeds created or updated through the REST API or AI assistants are validated before automatic generation. An incomplete feed saves with a clear "generation skipped" message naming what is missing, and the feed reports an invalid status with those reasons instead of a completed generation that never produced a file.
* Fix: API feed saves that omit the variations setting keep the interface default (variations included) instead of silently switching the feed to parent products only.
* Fix: String Replace rules are validated on save and each rule now carries an explicit "Plain text" or "Pattern (regex)" mode. Existing rules keep their old auto-detect behavior exactly, and a pattern that fails to compile falls back to a plain-text replace instead of silently doing nothing.
* Fix: prefix, suffix and String Replace values keep literal angle-bracket text (a <br> tag, a "<3") instead of having it stripped as HTML on save.
* Improved: Attribute Mapping warns about likely misspelled attribute keys ("did you mean...") and circular references that resolve to empty values, in the mapping editor's live preview and the API responses (Pro).

= Version 8.0.20 =
* Fix: multilingual stores (WPML) — feed product links now always carry the feed's language URL (Pro). Products without a translation in the feed language previously shipped the default-language link, so Google landed on the default-currency page and reported price mismatches; links now use WPML's own URL converter and existing feeds heal on their next regeneration.
* Improved: security and review hardening across the plugin — every admin input is unslashed before sanitizing, every PHP file blocks direct access, review links follow WordPress.org guidelines, and the dashboard metrics queries use WordPress 6.2's safe identifier placeholders. The plugin now passes the official WordPress.org Plugin Check.
* Changed: the minimum supported WordPress version is now 6.2 (released March 2023) — the plugin's code has required newer WordPress APIs for some time, and the declared requirement now says so honestly. Sites on older WordPress keep their current plugin version.
* Changed: the readme changelog lists recent releases only; the complete version history ships with the plugin in changelog.txt.

= Version 8.0.19 =
* Added: update feeds every 5, 15, 30, or 45 minutes (Pro) for fast-moving inventory. Choosing 5 or 15 minutes shows a plain-language advisor first — a generation still running when the next one is due is skipped, and round-the-clock rebuilds can slow a store — with 30 minutes or longer recommended for most shops.
* Added: Toolset Types support — Toolset custom fields get their own picker group (Pro) with properly formatted values (dates, checkboxes, repeating fields) resolving in every plan, and Toolset-registered product taxonomies work throughout.
* Added: the "between" condition in Dynamic Attributes — set a value when a price or number falls inside a range, with a Min/Max pair in the rule builder.
* Fix: prices ship the standard "35.90 RON" money format again on every channel and file type. Feeds configured before 8.0.14 could carry a currency suffix without its leading space, gluing the code to the number ("35.90RON") — OpenAI rejected every such row and Google flagged them too. The V5-era safeguard that always inserted the space is restored, so existing feeds heal on their next regeneration with no re-save.
* Fix: prices default to the clean machine format — exactly two decimals, dot separator, no thousands grouping ("1313133.33") — matching V5. The store's display-decimals setting no longer leaks into feeds; a custom number format set on the feed's Filter tab still wins. ChatGPT/OpenAI feeds additionally strip grouping commas OpenAI rejects.
* Fix: Advanced Filter groups now evaluate the way they read. A grouped setup like (category A AND price > 20) OR (category B AND price > 20) previously excluded every product — groups only existed visually while the engine ran the old flat chain. Each group now evaluates internally and combines through the AND/OR pills between groups; feeds saved in V5 keep their exact old behavior. The redundant global AND/OR toggle is gone.
* Fix: custom fields storing multiple values (page-builder repeater fields) resolve to their first real value instead of printing the literal word "Array" into the feed.
* Fix: attribute mapping rows must be complete before a feed saves — an empty channel attribute or value now blocks the save with the exact rows named and highlighted, instead of silently producing broken feed markup. Rows saved incomplete by older versions are skipped safely at generation.
* Improved: the FTP/SFTP tab names the exact missing PHP extension (ftp or ssh2) instead of a generic "module not found" message, and the feed editor keeps all its columns on smaller screens by moving the help rail below the content.

= Version 8.0.18 =
* Fix: feeds with Auto Update enabled can no longer stop silently. A feed's recurring schedule could be lost without any error — the feed simply stopped regenerating for days while the Manage Feeds page kept showing its configured interval. Schedules now repair themselves: a daily check re-registers any enabled feed whose schedule went missing, opening the Manage Feeds page does the same instantly, and the page now shows the feed's real next run straight from the scheduler — with a clear "Not scheduled" badge in the rare case re-registration fails.
* Fix: maintenance routines now see every feed. On hosts where feed settings are stored without autoloading, the after-update schedule repair and the disabled-feed queue cleanup silently found zero feeds — which also explains how a lost schedule could survive several plugin updates unrepaired.
* Improved: support tickets keep their diagnostic attachments on every host. Mail plugins that queue sending (or strip attachments outright) used to deliver tickets carrying only an "Attached:" line with no files; the attachment files now remain available for queued sending, and the feed configuration additionally travels inside the message body so the key diagnostic always arrives.

= Version 8.0.17 =
* Added: paste a list of IDs or SKUs straight into the product picker. Copy a comma-separated list from a spreadsheet into the include/exclude product search and every entry is looked up at once — all-numeric lists are matched as product IDs first with SKU fallback, alphanumeric lists as SKUs (variation SKUs included), and anything unmatched is listed so nothing silently drops.
* Fix: private variations no longer export from publish-only feeds. The status filter applied only to parent products, so a private variation under a published parent still shipped — and Google advertised variants a customer can't actually select on the product page.
* Fix: an "empty" include filter saved as an empty string no longer silently zeroes the feed. Older configurations sometimes stored an empty category/tag/product-ID selection as an empty string instead of a true empty list; those feeds generated 0 products with no clue why. All list filters now treat both shapes as "no filter".
* Change: the "All Images" attribute is gallery-only again, like the old engine. Since 8.0.0 it also included the main image, which duplicated the main image into g:additional_image_link (Google asks for additional images only) and — because the value was never empty — quietly disabled the "parent if empty" command on variation image rows. The main image remains available through the Main Image and Featured Image attributes.
* Fix: new-feed templates use the store currency in price values. The Idealo, Miinto.de and Etsy templates hardcoded a USD suffix — a new feed on a EUR store shipped "12.50 USD" until hand-edited.
* Improved: brand columns in new-feed templates read the WooCommerce Brands taxonomy (the top-level Parent Brand), falling back to the site name — instead of a value parsed from the domain, which shipped "Com" as the brand on .com.au stores. Affects newly created feeds only.
* Fix: ChatGPT (OpenAI) feeds ship the exact availability values OpenAI accepts. Backordered products now export "backorder" (they were mislabeled "preorder"), and pre-orders export OpenAI's "pre_order" spelling — OpenAI rejects rows carrying unrecognized values.
* Fix: custom code using the old engine's woo_feed_get_..._attribute filters works again. The new engine only bridged the woo_feed_filter_product_* family, so snippets built on the second V5 filter family (for example woo_feed_get_short_description_attribute) silently stopped after the upgrade. All four variants now fire with their original order and signatures.

= Version 8.0.16 =
* Fix: SEO titles and descriptions now work inside Attribute Mapping. Combining a Rank Math, Yoast or All in One SEO field with other attributes in an Attribute Mapping printed the field's internal name (e.g. "rank_math_title") into the feed instead of the actual SEO value; the same fix applies to Dynamic Attributes.
* Fix: prices ignore the store's display separators in every formatting stage. On stores with European number settings (comma decimals), a €9.80 product could ship as "980.00" — the dot was mistaken for a thousands separator and stripped. Feeds now always parse and format numbers machine-style unless separators are configured explicitly in the feed.
* Fix: Free Text values keep safe HTML. Line breaks, links and other harmless markup entered in a Free Text field survived saving only partially; scripts and other unsafe markup are still removed.
* Added: a clear warning when a feed generates with 0 products. Filters combine with AND — a product must match ALL of them — so an include-category filter plus an include-product-IDs filter that don't overlap silently produced a valid empty feed. Instead of "generated successfully", you now get a warning naming the filters so you can fix the settings yourself.
* Added: a "Default Language ID" attribute (WPML sites). It exports the default-language catalog ID for translated products — what Meta and Google language feeds need so items match your primary catalog. The old engine's "Parent Id" quietly did this; the new attribute does it under an honest name, and "Parent Id" keeps meaning the variation's parent product.
* Improved: View and Download always fetch the current feed file. Hosts that serve uploads with long browser-cache headers made "View Feed" show a stale copy for months while the file on the server was fine; the buttons now bypass the browser cache (the feed URL you submit to merchants is unchanged).
* Performance: exclude-mode category filters now cut at the database level, the same way include-mode filters do since 8.0.14 — feeds excluding large categories no longer scan the excluded products at all.

= Version 8.0.15 =
* Fix: category mappings resolve the most specific mapped category again. On stores whose older categories were later re-organised under new parent categories, mapped subcategories shipped an empty value — or the parent's generic value — because the "deepest category" was guessed from the newest category ID instead of the real hierarchy. The product's deepest mapped category now always wins (the ctxfeed_cmapping_v5_max_id filter restores the previous pick if a feed depended on it).
* Fix: a feed could be reported "failed — one of these products is likely crashing PHP" minutes after it had published successfully. With the admin page open, the in-browser batch runner could execute the same batches WP-Cron had already claimed, so the whole run raced itself; a leftover batch then flagged the finished run as still generating and the watchdog eventually declared it dead. The runner now leaves claimed batches to WP-Cron, a leftover batch from an already-finished run is discarded on sight (this also closes a rare path where a partial file could overwrite the good feed), and the "gave up" message now names what actually kept failing instead of blaming a product.
* Fix: the deactivation feedback dialog now also appears when deactivating CTX Feed Pro, and the survey records which of the two plugins was deactivated.
* Added: a "Check for updates" button on the Version Control page's Pro card — it asks webappick.com immediately instead of waiting out the 12-hour update cache after a new Pro release.

= Version 8.0.14 =
* Fix: CSV, TSV and TXT feeds stopped updating at their original URLs on current WordPress. A recent WordPress change renamed the feed's file-type folder (google/tsv/ became google/unnamed-file.tsv/), so the file your merchant platform polls was never refreshed again — while a copy kept updating at a forked address. Feeds now write to their original folders again, the plugin cleans up the forked copies automatically after the next generation, and support-ticket attachments (which hit the same fault) find the feed file again. No reconfiguration needed in Merchant Center — the existing URL simply starts updating.
* Performance: category-filtered feeds no longer scan the whole catalog. A feed whose category filter is in include mode now narrows the product list at the database level first — a 5-product category feed on a 500,000-product store finds its products in one small query instead of walking every product. Exclude-mode and advanced filters still evaluate per product, exactly as before.
* Change: a variation's additional images now come only from that variation's own gallery — WooCommerce's built-in variation gallery and all supported gallery plugins (Woo Variation Gallery, RT Variation Gallery, Woodmart, WooCommerce Additional Variation Images). A variation with 2 images ships 2 image fields and leaves the rest empty; the parent product's gallery is no longer substituted automatically. To fall back to the parent's images, use the "parent if empty" output command on the image attribute.
* Added: the System status page now lists every product type in use on your site with its product count — Simple, Variable, Variations, and custom types like Auction or Bundle — even when the plugin that registered a type is deactivated. The same breakdown reaches support tickets automatically.
* Improved: support tickets now attach diagnostics as files instead of pasting raw text — system-status.txt (the full System status page), system-status.log (the relevant generation log), and feed-config.txt (the selected feed's configuration, credentials redacted) alongside the generated feed file.

= Version 8.0.13 =
* Fix: a large feed could finish as a 1-byte file. When a slow finalization step was retried while the original was still running, the duplicate overwrote the freshly published feed with an empty one; a duplicated finalization is now recognised and skipped, and the published feed is left untouched.
* Fix: turning auto-update OFF now actually stops the feed. Runs already queued kept starting on their own after the toggle was switched off; the toggle now cancels the feed's queued batches and in-flight run on the spot, unblocking editing immediately — and after a plugin update, every feed with auto-update off gets its leftover queue cleared automatically.
* Fix: feed prices no longer inherit the store's display separators. A store showing prices as "2.169,00" on the front end shipped that formatting into machine-read feeds; feeds now always use dot-decimal with no thousands grouping unless you explicitly configure separators in the feed's Number Format settings (an empty thousands separator now genuinely means none).
* Fix: All in One SEO titles and descriptions rendered as raw templates (e.g. "#post_title #separator_sa #site_title") in feeds; AIOSEO's smart tags are now rendered through AIOSEO itself.
* Added: the Version Control page shows a CTX Feed Pro card — installed version, latest release, and a one-click update (an active license is required to download; without one the card links to the License page). Release notes on the page now render as tagged change lists instead of a wall of text.
* Security: the "Our Plugins" one-click installer now requires the real plugin-install capability and only accepts WebAppick's own catalog; category-mapping data is unserialized with object instantiation disabled; the feed-log download path is additionally sanitised. None of these were publicly reported; all are defence-in-depth hardening.
* Note (CTX Feed Pro 8.0.4): WPML secondary-language feeds no longer export 0 products when generation runs from a scheduled task or an admin session in another language — the product query now runs in the feed's language, with translation mapping as a safety net. Pro 8.0.4 also adds in-dashboard update notifications for the Pro plugin (this is the last Pro update that must be installed manually).

= Version 8.0.12 =
* Fix: the ChatGPT (OpenAI) template now outputs the spec's primary column names is_eligible_search and is_eligible_checkout (the old enable_search / enable_checkout are OpenAI's legacy aliases and keep working for existing feeds), alongside the is_ads_eligible attribute required for OpenAI Ads.
* Fix (with CTX Feed Pro 8.0.3): WPML secondary-language feeds now match the shop. When WPML's product mode is "use translation if available or fallback", products without a translation stay in the feed as their original-language post instead of disappearing — a 4,500-product store no longer exports a 558-product Danish feed.
* Fix: the dashboard's channel performance grid showed raw channel slugs (e.g. "Chatgpt" instead of "ChatGPT (OpenAI)") and logged a harmless error per channel on every load.
* Note (CTX Feed Pro 8.0.3): currency and multilingual integrations are now mutually exclusive — with two currency plugins or two multilingual plugins active, CTX Feed uses one, ignores the other, and shows a clear warning naming both, instead of converting prices twice or emptying the feed.

= Version 8.0.11 =
* Performance: feed generation is several times faster. On our 2,400-product test store a full run dropped from 42 to 9 seconds, and variation-heavy catalogs gain the most: a variation's parent product data is now resolved once per parent instead of once per variation, product images are bulk-loaded per batch instead of queried one by one, and category/tag lookups are served from the already-warmed cache. Every value served from the new caches is spot-checked against a freshly computed one during the run; on any difference the plugin logs it and finishes the run on the slower, always-correct path.
* Fix: a feed whose batch was killed by the server without any error (the run froze with no failure message) now restarts itself from the exact product it reached, with a smaller batch; if the same spot keeps dying the feed is marked failed and the log names the products to check. The performance trace now shows where each batch's time went and names unusually slow products.
* Fix: the "Feed generation is taking longer than expected" warning no longer interrupts a long feed that is still making progress — the page keeps watching as long as the product count moves, and only gives up after 4 hours.
* Change: batches are capped at 2,000 products for manual generation and 1,000 for scheduled auto-updates, on top of the automatic sizing and the time limit — large stores get steady, predictable batches instead of ever-growing ones.
* Fix: a batch now stops on its own before the background scheduler's time limit and hands the remaining products to the next batch, so a large batch can no longer be stamped "failed" and run twice. The generation log shows the product count climbing inside a batch, and a run that really stops is reported in the log instead of a vanishing "stalled" message.
* New: every feed writes its generation log — no need to turn on "error & debug logging" first, so support can always ask for the log of a failed run. The debug setting now only controls the extra system diagnostics log. (Sites that must not write logs can disable them with the ctxfeed_feed_log_enabled filter.)
* Fix: an out-of-stock variation with quantity 0 no longer inherits its parent product's total stock in the feed — zero stays zero, matching the classic engine.
* Change: the first batch of a run is sized from the previous run's measured speed instead of a fixed estimate, so slow stores no longer overshoot on batch one and fast stores ramp up sooner.
* New: the performance trace in the log now breaks each batch down by attribute, counts database queries per pipeline stage, and records how long the background scheduler idled between batches — the numbers support needs to diagnose a slow feed on your host.

= Version 8.0.10 =
* New: "Parent Brand (WooCommerce)" and "Child Brand (WooCommerce)" attributes for the hierarchical WooCommerce Brands taxonomy (the top-level brand and the assigned sub-brand), and the WooCommerce Brands taxonomy is available to free users in the attribute dropdown.
* Fix: "Test connection" on the FTP / SFTP tab did nothing when clicked; it now runs, fails fast on an unreachable host or port, and reports the actual reason (unreachable, wrong port for SFTP, sign-in rejected, cannot write to the directory). The "File will land at" preview shows the real feed file name.
* Fix: batch sizing now also respects Action Scheduler's 5-minute action limit, not only the PHP time limit — on hosts with a long PHP limit, batches grew until Action Scheduler stamped them "failed" and an hourly feed took most of the hour. The fixed 2,000-product batch cap is gone: a server with the memory and time can process larger batches.
* Fix: the auto-update interval now counts from the start of a run, not from its end — a 1-hour feed whose generation takes 50 minutes no longer drifts to every ~2 hours — and a completed run no longer leaves a duplicate recurring schedule behind.
* Fix: with the "Plain" permalink setting every CTX Feed admin request returned 404 since 8.0.5 (feed list, template list, settings) — the cache-buster was appended after a second "?" — now fixed.
* Fix: TXT feeds honour the configured delimiter and enclosure again (V5 parity): with a double/single-quote enclosure every field is wrapped and inner quotes are doubled, so a title like 22 mm (7/8") no longer breaks a strict TSV parser.
* Change: in the attribute dropdown only the product taxonomies CTX Feed creates itself (Settings → Product attributes: Brand, GTIN, MPN, …) are free; the store's other taxonomies stay Pro but no longer hide the free ones.
* Fix: clicking Regenerate while a feed was already generating (another tab, another admin, or during the scheduled run) started a second, parallel run of the same feed that wrote into the same file — it is now refused with "This feed is already generating", and the feeds list shows the live log for a run started anywhere (cron, another tab).
* Fix: Variations now inherit their parent product's Tags (and the new Brand attribute) in the feed. Dynamic-attribute rules such as "Tags contains …" failed on every variation because variations carry no tags of their own.
* Fix: Variation titles include ALL variation attributes again (e.g. "Locker - Large , Blue , Two doors"). WooCommerce itself drops the attribute summary from a variation's name once it has three or more attributes, so products with size + colour + style shipped the bare parent title.
* Fix: Rank Math's primary product category exports the category name instead of its term ID (e.g. "Blenders" instead of "332"), and the value is read from the parent for variations.
* New: "Brand (WooCommerce)" attribute — the WooCommerce core Brands taxonomy is now a first-class value in every plan.
* Fix: an old CTX Feed Pro (below 8.0) beside CTX Feed 8 now raises a red notice on every CTX Feed page and a critical System status row, with a one-click "Update CTX Feed Pro now" button when the license is active or a link to your WebAppick account downloads otherwise.
* Fix: CRITICAL for stores whose price format uses a thousand separator — prices of 1,000 and above could be silently corrupted in the feed (e.g. 1.499 exported as 1) because the price was number-formatted more than once along the pipeline. Every formatting stage now parses the already-formatted value back with the feed's own separators first, so formatting is idempotent. Thanks to Käpprätt AB for the report.
* Fix: A retried feed batch no longer duplicates products. When a batch fails and is retried at a smaller size, the rows the failed attempt had already written are rolled back first, so every product appears exactly once.
* Fix: Product save, Quick Edit and checkout no longer touch the database on CTX Feed's behalf. The cache clean-up that ran inline on those requests is now a single deferred background job, so CTX Feed adds no time to saving a product or completing an order.
* New: Leftover temporary files from the previous feed engine (wf_store_* files that could grow to gigabytes and exhaust PHP memory) are removed automatically — once after updating, and before each feed generates.
* New: The feed log now names the filter behind every product it leaves out ("3 excluded by filters (visibility: 3)") and warns when a whole batch was filtered away, so an unexpectedly empty feed points straight at the setting responsible.
* Changed: WooCommerce → Status → Logs now contains a single CTX Feed source, "ctxfeed", and it carries PHP errors only — caught errors plus PHP fatal errors raised inside the plugin, with file and line. Progress and performance chatter is gone from WooCommerce logs; with "Enable error debugging" on, it is written to the plugin's own uploads/woo-feed/logs/ctxfeed-system.log instead.
* Changed: One log file per feed. Each feed's log starts over on every run (no rotated copies), is downloadable from the feed's row menu, and is deleted together with the feed.
* Changed: Auto-update interval. A feed with auto-update on and no interval of its own now runs every 24 hours (the old global "Update interval" setting is no longer consulted). The Schedule column shows the interval the scheduler will actually use — feeds that previously read "Manual" while running daily now show "24h" — and "Manual" appears only when auto-update is off.
* Fix: No more "Function _load_textdomain_just_in_time was called incorrectly" notices on every page load (WordPress 6.7+). Three early-translation paths in the plugin boot were deferred to init — this also removes the "Action Scheduler data store was not initialized" notices.
* New: A live generation log console appears directly under a feed while it regenerates — batch progress dots, the current batch line (products written / skipped), a step counter and a progress bar. The "generation started" toast is gone (the console is the feedback now), and duplicate "generated successfully" toasts on one run are fixed.
* New: One-click AI connect (with CTX Feed Pro 8.0.2): the AI assistant screen now leads with an OAuth server address — your AI app connects with a login + approval on your own site, no application password or header to copy. The header-based flow remains available under Advanced for AI apps without one-click sign-in.
* Fix: "Generate your access header" now works for WordPress usernames in any language (non-Latin usernames previously failed silently), and a failed clipboard copy is now visible ("Copy failed — select the text") instead of silently pasting nothing.
* Improvement: Manage Feeds — long feed names truncate with an ellipsis (full name on hover) instead of breaking the layout, Schedule and Last Generated use compact time labels (24h, 2h ago), the Schedule column sits beside the Feed URL, and "Manual only" is now "Manual".
* Security: The CTXFEED_DEV_MODE wp-config constant no longer exists — feature gates are unlockable only by the Pro plugin's license-checked filters.

= Version 8.0.9 =
* Fix: Mapping the "Shipping (Google Format)" attribute could kill feed generation on stores with many shipping methods — the batch silently died mid-run and the feed never finished. Shipping prices are now computed by pricing each configured shipping method directly against the product (no cart round-trip), which is 50-100x faster and immune to slowdowns from cart-aware checkout/marketing plugins. An 11,000-product store with 14 shipping methods that could not finish at all now completes in about a minute.
* Fix: Product variations no longer show a wrong 0.00 shipping price — they are now priced with their own price and shipping class.
* New: Shipping resolution has a safety time budget (filter: ctxfeed_shipping_time_budget, default 20s per batch) — if a shipping plugin is pathologically slow, remaining products emit their shipping entries without computed prices instead of the whole feed dying. For shipping plugins that genuinely require a real cart to price, the previous cart-based computation is available via the ctxfeed_shipping_use_cart_api filter.
* Improvement: The per-batch start line in the feed log is written immediately, so a batch killed by the server stays visible in the log instead of vanishing.

= Version 8.0.8 =
* Fix: The feed generation progress bar now self-heals against a mis-configured CDN. It is driven from the always-fresh background-run response (which a CDN cannot cache) and only ever moves forward, so it can no longer sit frozen at a stale percentage (e.g. "stuck at 60%") while the feed has actually progressed or already finished.

= Version 8.0.7 =
* New: A failing feed batch now automatically retries with a smaller batch size instead of aborting the whole feed. If a batch is too big for the server (a PHP timeout or memory-limit fatal), the plugin halves the batch and retries that same point — stepping down toward a safe size — so large catalogues on tighter hosts keep generating instead of stopping. It recovers from both catchable errors and uncatchable fatals (max-execution-time / out-of-memory), and only gives up once the size is already at the minimum.

= Version 8.0.6 =
* New: System status now shows a WARNING (instead of a neutral note) when WP-Cron is disabled AND scheduled feed jobs are genuinely piling up unprocessed — telling you that automatic feed updates won't run until a working server cron is set up. It stays a quiet heads-up on servers that pair a disabled WP-Cron with a real cron (where auto-update works fine), so it never cries wolf.
* New: System status shows a warning with fix-it instructions when it detects that Cloudflare is challenging the plugin's own requests — the usual cause of a feed progress bar that looks "stuck" — pointing you to the WAF "Skip" and Cache "Bypass" rules to add for /wp-json/.

= Version 8.0.5 =
* Fix: The feed-generation progress bar could appear "stuck" behind a CDN that caches API responses (e.g. a Cloudflare "cache everything" rule) — the CDN served a frozen copy of the status even after generation had finished, and the same stale-cache could affect license status and settings. Live admin reads now carry a per-request cache-buster so the CDN can't serve a stale response.
* Note: This is a plugin-side safeguard; the fully reliable fix remains a CDN cache-bypass rule for /wp-json/ on sites that force-cache everything.

= Version 8.0.4 =
* New: Facebook (Meta) feeds output product videos as repeated <video><url>…</url></video> blocks in XML and JSON/API. Map the single "Video" attribute — once per video, to a meta field or product attribute — and each mapping becomes its own <video> element.
* Changed: The 20 fixed "Video URL 0…19" columns are replaced by one "Video" attribute; map it multiple times for multiple videos. Feeds that used the old Video URL columns need remapping to "Video".
* Note: The video attribute is available for XML and JSON/API feeds only — it is skipped for CSV/TSV/TXT, which have no nested-column form.

= Version 8.0.3 =
* Fix: Comparison-shopping channels (BestPrice, Skroutz, Pricerunner, Trovaprezzi) no longer force their own availability values onto products — availability now passes through exactly as it did in v5, so catalogs are no longer rejected for a mismatched in-stock / out-of-stock value.
* Improved: Large catalogs generate faster and more reliably — the adaptive batch size no longer collapses to its minimum on big feeds, so generation keeps climbing toward the server's capacity instead of crawling.
* New: Feeds keep generating even when WordPress background tasks (WP-Cron) are disabled or blocked — while the Manage Feeds screen is open, the plugin drives the queued batches itself, so large catalogs finish instead of stalling.
* New: A clearer, honest progress bar with a dedicated "finalizing" stage, driven by the real server-side status.
* New: An all-pages notice warns when the background scheduler isn't processing queued feed jobs, with a link to the cron setup guide — shown only when there is a genuine stalled backlog, so it stays quiet on servers with a working cron.
* Improved: A disabled WP-Cron is now reported as a neutral heads-up (with a cron-setup guide) rather than an alarming warning — a real server cron is the recommended setup on many hosts.
* Improved: More resilient to a CDN/WAF (e.g. Cloudflare) that intermittently challenges requests — REST calls automatically retry through admin-ajax when a challenge is detected. (A persistent firewall challenge still needs an allow rule on your CDN.)
* Fix: License activation/deactivation now explains a firewall/CDN block clearly instead of failing silently.
* Fix: The per-feed log opens inside the admin instead of showing a 404 page.

= Version 8.0.0 =
* Major update: CTX Feed 8.0 is a ground-up rewrite. Please back up your site and database before updating. Your existing feeds and settings are carried over automatically — no reconfiguration needed. Found any issue after updating? Contact our support team at support@webappick.com.
* New: Ground-up V8 feed engine — up to 10x faster generation via cache priming, streaming output, and Action Scheduler batching; no open browser tab required, and large catalogs no longer time out.
* New: Redesigned React admin under a single "CTX Feed" menu, with a performance dashboard, feed health scoring, and an in-app help centre.
* New: 220+ merchant channels — Google, Meta (Facebook & Instagram), Bing, Pinterest, TikTok, Snapchat, Idealo, Skroutz, Pricerunner and many more — with every channel's attributes and templates included free.
* New: Six output formats (XML, CSV, TSV, TXT, JSON) plus Custom Template 1 and Custom Template 2 (XML pattern).
* New: Feed scheduling and automatic updates, FTP/SFTP delivery, and downloadable per-feed logs.
* Improved: Full V5 attribute parity — attribute mapping, category mapping, dynamic attributes, prefix/suffix, find & replace, conditional rules and WP-option attributes are all carried over.
* Improved: More reliable product data — reads use WooCommerce built-in functions (no raw SQL), with better variable/grouped/bundle price, image, shipping-zone and tax-rate resolution; per-product errors are skipped and logged instead of failing the whole feed, and feed files are written atomically.
* Note: Requires PHP 7.4 or higher. Sites on older PHP stay on 6.6.23 until PHP is updated.

= Version 6.6.23 (February 09, 2026) =
* Compatibility Fix: PHP 8.3 compatibility issue

= Version 6.6.22 (February 02, 2026) =
* Bug Fix: Subscription period attribute issue in Google shopping feed

= Version 6.6.21 (January 27, 2026) =
* Documentation Update: Enhanced plugin information for better user guidance.

= Version 6.6.20 (January 26, 2026) =
* Bug Fix: Checkout link template attribute issue
* Documentation Update: Enhanced plugin information for better user guidance.

= Version 6.6.19 (January 19, 2026) =
* Security Update: Fixed missing authorization (broken access control) vulnerability (CVE-2026-22461) to protect your store data.

= Version 6.6.18 (January 13, 2026) =
* Compatibility Fix: Fixed conflict with the Ninja Forms plugin for seamless WordPress form integration.

= Version 6.6.17 (January 6, 2026) =
* UI Cleanup: Removed Happy Holiday promotional banner.

= Version 6.6.16 (January 5, 2026) =
* Performance Improvement: Refactored compatibility code for better WooCommerce integration and faster feed generation.

= Version 6.6.15 (December 30, 2025) =
* WooCommerce 10.4 Compatible: Tested and verified compatibility with WooCommerce version 10.4 for reliable product feed management.

= Version 6.6.14 (December 18, 2025) =
* Documentation Update: Enhanced plugin information for better user guidance.

= Version 6.6.13 (December 16, 2025) =
* Seasonal Promotion: Added Happy Holiday discount banner.

= Version 6.6.12 (December 11, 2025) =
* New Feature: Added Parent Description attribute for improved product data flexibility in Google Shopping and Facebook feeds.
* Security Patch: Fixed a security vulnerability issue to ensure safe product feed generation.

= Version 6.6.11 (December 8, 2025) =
* UI Cleanup: Removed Black Friday promotional banner.

= Version 6.6.10 (December 2, 2025) =
* WordPress 6.9 Compatible: Verified full compatibility with WordPress 6.9 for stable product feed creation.

= Version 6.6.9 (November 28, 2025) =
* Marketing Update: Updated discount banner UTM tracking links for better analytics.

= Version 6.6.8 (November 25, 2025) =
* Documentation Enhancement: Improved plugin information and documentation.

= Version 6.6.7 (November 25, 2025) =
* Seasonal Promotion: Added Black Friday discount banner.

= Version 6.6.6 (November 20, 2025) =
* SEO Fix: Resolved canonical URL attribute issue for better search engine optimization in product feeds.

= Version 6.6.5 (November 17, 2025) =
* Special Promotion: Added 10th Anniversary discount banner.

= Version 6.6.4 (November 6, 2025) =
* Documentation Update: Enhanced plugin documentation and information.

= Version 6.6.3 (November 3, 2025) =
* UI Cleanup: Removed Halloween promotional banner.

= Version 6.6.2 (October 27, 2025) =
* Code Optimization: Refactored codebase for improved performance and maintainability of WooCommerce product feeds.

= Version 6.6.1 (October 27, 2025) =
* UI Improvements: Updated the Manage Feed Page sidebar and Make Feed Page sidebar for a better user experience.

= Version 6.6.0 (October 22, 2025) =
* Major Feature: Added ChatGPT (OpenAI) Product Feed Template for AI-powered product feed optimization and content generation.

= Version 6.5.88 (October 20, 2025) =
* Seasonal Promotion: Added Halloween discount banner.

= Version 6.5.87 (October 13, 2025) =
* Code Optimization: Refactored core code for enhanced performance.

= Version 6.5.86 (October 13, 2025) =
* UI Enhancement: Updated the Manage Feed Page interface for improved usability.

= Version 6.5.85 (October 7, 2025) =
* Bug Fix: Resolved Settings Page UI display issues.

= Version 6.5.84 (September 30, 2025) =
* UI Improvements: Enhanced Attributes Mapping Page, Filter, and Advanced Filter interfaces for easier product feed configuration.

= Version 6.5.83 (September 25, 2025) =
* Documentation Update: Updated plugin information.

= Version 6.5.82 (September 23, 2025) =
* Documentation Enhancement: Improved plugin description for better understanding.

= Version 6.5.81 (September 18, 2025) =
* Bug Fix: Fixed PHP warning errors for cleaner operation.

= Version 6.5.80 (September 10, 2025) =
* Code Optimization: Refactored code for better performance.

= Version 6.5.79 (September 3, 2025) =
* Google Shopping Enhancement: Updated excluded_destination attribute to allow multiple values in Google Shopping feeds.

= Version 6.5.78 (August 26, 2025) =
* Bug Fix: Resolved PHP warning errors.

= Version 6.5.77 (August 20, 2025) =
* UI Update: Updated Status Page icons for better visual clarity.

= Version 6.5.76 (August 12, 2025) =
* Bug Fix: Fixed Status Page UI display issues.

= Version 6.5.75 (August 6, 2025) =
* Bug Fix: Resolved Status Page right sidebar display issues.

= Version 6.5.74 (July 28, 2025) =
* Code Optimization: Refactored codebase for improved efficiency.

= Version 6.5.73 (July 21, 2025) =
* WooCommerce 10.0 Compatible: Tested and verified compatibility with WooCommerce 10.0 for seamless product feed generation.

= Version 6.5.72 (July 15, 2025) =
* Code Optimization: Refactored code for enhanced performance.

= Version 6.5.71 (July 8, 2025) =
* Documentation Update: Updated our Plugins page content.

= Version 6.5.70 (July 2, 2025) =
* UI Cleanup: Removed summer sale promotional banner.

= Version 6.5.69 (June 30, 2025) =
* WooCommerce 9.9 Compatible: Verified compatibility with WooCommerce 9.9.

= Version 6.5.68 (June 24, 2025) =
* Seasonal Promotion: Added summer sale discount banner. Documentation Update: Updated Settings page text for clarity.

= Version 6.5.67 (June 16, 2025) =
* Developer Feature: Added filter hook for JSON file type customization in product feeds.

= Version 6.5.66 (June 3, 2025) =
* UI Enhancement: Updated the Status page table for better data display.

= Version 6.5.65 (May 26, 2025) =
* Compliance Fix: Fixed Plugin Check (PCP) errors for WordPress.org guidelines compliance.

= Version 6.5.64 (May 20, 2025) =
* Code Optimization: Refactored code for improved performance.

= Version 6.5.63 (May 15, 2025) =
* New Feature: Added support for Appointment product type in WooCommerce product feeds.

= Version 6.5.62 (May 8, 2025) =
* Code Optimization: Refactored codebase for better efficiency.

= Version 6.5.61 (April 23, 2025) =
* WordPress 6.8 Compatible: Updated for full compatibility with WordPress 6.8.

= Version 6.5.60 (April 23, 2025) =
* Code Optimization: Refactored code for enhanced performance.

= Version 6.5.59 (April 16, 2025) =
* Compatibility Updates: Tested and verified compatibility with WordPress 6.8 and WooCommerce 9.8.

= Version 6.5.58 (April 8, 2025) =
* Documentation Update: Improved documentation page content.

= Version 6.5.57 (March 25, 2025) =
* Code Optimization: Refactored code for better performance.

= Version 6.5.56 (March 19, 2025) =
* UI Update: Updated Status page title.

= Version 6.5.55 (March 13, 2025) =
* WooCommerce Integration: Added WooCommerce default GTIN, UPC, EAN, and ISBN identifiers to the attribute list for enhanced Google Shopping compliance.

= Version 6.5.54 (March 11, 2025) =
* Bug Fix: Fixed custom field value removal issue in product feeds.

= Version 6.5.53 (March 6, 2025) =
* Facebook Enhancement: Added "internal label" attribute to Facebook product feed template.

= Version 6.5.52 (March 4, 2025) =
* Code Optimization: Refactored code for improved performance.

= Version 6.5.51 (February 25, 2025) =
* Bug Fix: Resolved quantity value display issue in product feeds.

= Version 6.5.50 (February 17, 2025) =
* New Feature: Added our Plugins page for easy plugin discovery.
* Marketing Update: Updated dashboard banner UTM tracking links.

= Version 6.5.49 (February 10, 2025) =
* UI Update: Updated dashboard banner display.

= Version 6.5.48 (February 4, 2025) =
* Code Optimization: Refactored codebase for enhanced efficiency.

= Version 6.5.47 (January 28, 2025) =
* Code Optimization: Refactored code for better performance.

= Version 6.5.46 (January 23, 2025) =
* Bug Fix: Fixed cron job update issue for automated feed generation.

= Version 6.5.45 (January 20, 2025) =
* Documentation Update: Enhanced plugin information.

= Version 6.5.44 (January 13, 2025) =
* Developer Feature: Added filter hook for adding extra data to product feeds.

= Version 6.5.43 (January 8, 2025) =
* Bug Fix: Resolved cron event removal issue for scheduled feed updates.

= Version 6.5.42 (January 1, 2025) =
* UI Cleanup: Removed Merry Christmas promotional banner.

= Version 6.5.41 (December 23, 2024) =
* Seasonal Promotion: Added Merry Christmas dashboard discount banner.

= Version 6.5.40 (December 20, 2024) =
* Seasonal Promotion: Added Merry Christmas discount banner. Bug Fix: Fixed plugin installation error for smoother setup.

= Version 6.5.39 (December 18, 2024) =
* Google Shopping Enhancement: Added certified pre-owned attribute to the Google Shopping template for better product categorization.

= Version 6.5.38 (December 11, 2024) =
* Bing Shopping Enhancement: Added excluded/exclude_destination attributes to Bing Shopping feeds.

= Version 6.5.37 (December 6, 2024) =
* UI Cleanup: Removed Cyber Monday promotional banner.

= Version 6.5.36 (December 4, 2024) =
* Google Shopping Enhancement: Added Ads attribute for Google Shopping feeds to improve advertising integration.

= Version 6.5.35 (November 30, 2024) =
* Seasonal Promotion: Added Cyber Monday discount banner.

= Version 6.5.34 (November 27, 2024) =
* Facebook Fix: Resolved the Facebook feed template XML version display issue.

= Version 6.5.33 (November 15, 2024) =
* Seasonal Promotion: Added Black Friday discount banner.

= Version 6.5.32 (November 13, 2024) =
* WordPress 6.7 Compatible: Tested and verified compatibility with WordPress 6.7.

= Version 6.5.31 (November 4, 2024) =
* UI Cleanup: Removed Halloween promotional banner. Code Optimization: Refactored code for improved performance.

= Version 6.5.30 (October 28, 2024) =
* Marketing Update: Updated Halloween discount banner.

= Version 6.5.29 (October 22, 2024) =
* Seasonal Promotion: Added Halloween discount banner.

= Version 6.5.28 (October 21, 2024) =
*  Documentation Enhancement: Updated plugin description for better clarity.

= Version 6.5.27 (October 17, 2024) =
* Bug Fix: Fixed issue with variations of pending parent variable products being incorrectly included in feeds.

= Version 6.5.26 (October 15, 2024) =
* PHP Compatibility: Fixed PHP deprecated warnings for modern PHP versions. Code Optimization: Refactored code for better performance.

= Version 6.5.25 (October 7, 2024) =
* Pricing Fix: Resolved parent variable products sale price display issue in product feeds.

= Version 6.5.24 (October 3, 2024) =
* Google Enhancement: Updated Google Local Inventory feed template for improved local product advertising.

= Version 6.5.23 (September 30, 2024) =
* Code Optimization: Refactored compatibility code for better integration.

= Version 6.5.22 (September 24, 2024) =
* Bug Fixes: Fixed cron event creation for all feeds issue and template loading problems.

= Version 6.5.21 (September 23, 2024) =
* Bug Fix: Resolved feed type display issue in edit mode.

= Version 6.5.20 (September 17, 2024) =
* Code Optimization: Refactored code for improved performance.

= Version 6.5.19 (September 10, 2024) =
* Pricing Fix: Fixed cheapest variation selection issue for variable products.
