{"id":294906,"date":"2026-04-11T07:07:29","date_gmt":"2026-04-11T07:07:29","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/essiow-ai-seo-suite-for-woocommerce\/"},"modified":"2026-09-18T23:00:05","modified_gmt":"2026-09-18T23:00:05","slug":"essiow","status":"publish","type":"plugin","link":"https:\/\/pl.wordpress.org\/plugins\/essiow\/","author":23472740,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.4.0","stable_tag":"1.4.0","tested":"6.9.9","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Essiow \u2014 AI SEO Suite for WooCommerce","header_author":"Essiow","header_description":"All-in-one AI SEO suite for WooCommerce. Auto-generate optimized product descriptions, category pages, blog articles (1500-5000 words), and add an AI sales chatbot to your store. Supports Yoast SEO, Rank Math, AIOSEO. 8 languages, bulk optimization, JSON-LD schema.","assets_banners_color":"ffffff","last_updated":"2026-09-18 23:00:05","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/essiow.com\/plugin","header_author_uri":"https:\/\/essiow.com","rating":0,"author_block_rating":0,"active_installs":20,"downloads":1920,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.10":{"tag":"1.1.10","author":"boni58","date":"2026-05-06 09:46:08","revision":3524143},"1.1.11":{"tag":"1.1.11","author":"boni58","date":"2026-05-06 09:52:11","revision":3524153},"1.1.12":{"tag":"1.1.12","author":"boni58","date":"2026-05-06 10:07:02","revision":3524179},"1.1.13":{"tag":"1.1.13","author":"boni58","date":"2026-05-06 10:27:52","revision":3524214},"1.1.14":{"tag":"1.1.14","author":"boni58","date":"2026-05-06 11:55:10","revision":3524360},"1.1.15":{"tag":"1.1.15","author":"boni58","date":"2026-05-06 14:38:28","revision":3524530},"1.1.16":{"tag":"1.1.16","author":"boni58","date":"2026-05-06 15:33:20","revision":3524587},"1.1.17":{"tag":"1.1.17","author":"boni58","date":"2026-05-06 16:54:30","revision":3524665},"1.1.18":{"tag":"1.1.18","author":"boni58","date":"2026-05-07 12:36:43","revision":3525532},"1.1.19":{"tag":"1.1.19","author":"boni58","date":"2026-05-07 13:09:49","revision":3525557},"1.1.20":{"tag":"1.1.20","author":"boni58","date":"2026-05-07 14:01:15","revision":3525611},"1.1.21":{"tag":"1.1.21","author":"boni58","date":"2026-05-07 14:11:37","revision":3525625},"1.1.22":{"tag":"1.1.22","author":"boni58","date":"2026-05-07 15:02:02","revision":3525670},"1.1.23":{"tag":"1.1.23","author":"boni58","date":"2026-05-07 15:21:30","revision":3525706},"1.1.24":{"tag":"1.1.24","author":"boni58","date":"2026-05-07 15:38:00","revision":3525740},"1.1.25":{"tag":"1.1.25","author":"boni58","date":"2026-05-07 15:49:25","revision":3525753},"1.1.26":{"tag":"1.1.26","author":"boni58","date":"2026-05-07 16:06:04","revision":3525780},"1.1.27":{"tag":"1.1.27","author":"boni58","date":"2026-05-07 17:05:51","revision":3525835},"1.1.28":{"tag":"1.1.28","author":"boni58","date":"2026-05-07 18:07:29","revision":3525869},"1.1.29":{"tag":"1.1.29","author":"boni58","date":"2026-05-07 18:40:28","revision":3525888},"1.1.30":{"tag":"1.1.30","author":"boni58","date":"2026-05-07 19:46:18","revision":3525925},"1.1.31":{"tag":"1.1.31","author":"boni58","date":"2026-05-07 20:28:58","revision":3525941},"1.1.32":{"tag":"1.1.32","author":"boni58","date":"2026-05-07 20:43:40","revision":3525951},"1.1.33":{"tag":"1.1.33","author":"boni58","date":"2026-05-07 21:05:32","revision":3525965},"1.1.34":{"tag":"1.1.34","author":"boni58","date":"2026-05-07 21:14:36","revision":3525975},"1.1.35":{"tag":"1.1.35","author":"boni58","date":"2026-05-07 21:45:04","revision":3525996},"1.1.36":{"tag":"1.1.36","author":"boni58","date":"2026-05-07 22:10:29","revision":3526009},"1.1.37":{"tag":"1.1.37","author":"boni58","date":"2026-05-07 22:49:57","revision":3526024},"1.1.38":{"tag":"1.1.38","author":"boni58","date":"2026-05-07 23:12:18","revision":3526038},"1.1.39":{"tag":"1.1.39","author":"boni58","date":"2026-05-07 23:39:05","revision":3526047},"1.1.40":{"tag":"1.1.40","author":"boni58","date":"2026-05-08 00:02:15","revision":3526063},"1.1.41":{"tag":"1.1.41","author":"boni58","date":"2026-05-08 00:21:22","revision":3526067},"1.1.42":{"tag":"1.1.42","author":"boni58","date":"2026-05-08 07:54:51","revision":3526252},"1.1.43":{"tag":"1.1.43","author":"boni58","date":"2026-05-08 08:00:34","revision":3526258},"1.1.44":{"tag":"1.1.44","author":"boni58","date":"2026-05-08 08:07:51","revision":3526262},"1.1.45":{"tag":"1.1.45","author":"boni58","date":"2026-05-08 08:19:54","revision":3526279},"1.1.46":{"tag":"1.1.46","author":"boni58","date":"2026-05-08 08:50:35","revision":3526300},"1.1.47":{"tag":"1.1.47","author":"boni58","date":"2026-05-08 09:16:32","revision":3526315},"1.1.48":{"tag":"1.1.48","author":"boni58","date":"2026-05-08 09:57:32","revision":3526348},"1.1.49":{"tag":"1.1.49","author":"boni58","date":"2026-05-08 10:13:12","revision":3526366},"1.1.5":{"tag":"1.1.5","author":"boni58","date":"2026-04-11 07:22:48","revision":3503805},"1.1.50":{"tag":"1.1.50","author":"boni58","date":"2026-05-08 10:44:28","revision":3526405},"1.1.51":{"tag":"1.1.51","author":"boni58","date":"2026-05-08 10:51:50","revision":3526419},"1.1.52":{"tag":"1.1.52","author":"boni58","date":"2026-05-08 11:12:54","revision":3526444},"1.1.53":{"tag":"1.1.53","author":"boni58","date":"2026-05-08 11:27:53","revision":3526461},"1.1.54":{"tag":"1.1.54","author":"boni58","date":"2026-05-08 11:47:32","revision":3526473},"1.1.55":{"tag":"1.1.55","author":"boni58","date":"2026-05-08 12:34:35","revision":3526527},"1.1.56":{"tag":"1.1.56","author":"boni58","date":"2026-05-08 13:16:22","revision":3526568},"1.1.57":{"tag":"1.1.57","author":"boni58","date":"2026-05-08 13:44:19","revision":3526590},"1.1.58":{"tag":"1.1.58","author":"boni58","date":"2026-05-08 14:14:38","revision":3526607},"1.1.59":{"tag":"1.1.59","author":"boni58","date":"2026-05-13 08:41:03","revision":3530718},"1.1.6":{"tag":"1.1.6","author":"boni58","date":"2026-04-29 05:45:56","revision":3517976},"1.1.60":{"tag":"1.1.60","author":"boni58","date":"2026-05-13 09:51:17","revision":3530781},"1.1.61":{"tag":"1.1.61","author":"boni58","date":"2026-05-13 11:42:35","revision":3530880},"1.1.62":{"tag":"1.1.62","author":"boni58","date":"2026-05-13 12:39:29","revision":3530947},"1.1.63":{"tag":"1.1.63","author":"boni58","date":"2026-05-14 13:16:53","revision":3532034},"1.1.64":{"tag":"1.1.64","author":"boni58","date":"2026-05-14 13:28:02","revision":3532052},"1.1.65":{"tag":"1.1.65","author":"boni58","date":"2026-05-14 15:16:11","revision":3532190},"1.1.66":{"tag":"1.1.66","author":"boni58","date":"2026-05-14 15:31:46","revision":3532203},"1.1.67":{"tag":"1.1.67","author":"boni58","date":"2026-05-14 15:56:58","revision":3532237},"1.1.68":{"tag":"1.1.68","author":"boni58","date":"2026-05-14 17:15:15","revision":3532330},"1.1.69":{"tag":"1.1.69","author":"boni58","date":"2026-05-14 17:35:33","revision":3532357},"1.1.7":{"tag":"1.1.7","author":"boni58","date":"2026-05-06 08:12:10","revision":3524066},"1.1.70":{"tag":"1.1.70","author":"boni58","date":"2026-05-14 18:25:08","revision":3532401},"1.1.71":{"tag":"1.1.71","author":"boni58","date":"2026-05-14 20:23:49","revision":3532468},"1.1.72":{"tag":"1.1.72","author":"boni58","date":"2026-05-14 20:32:26","revision":3532474},"1.1.73":{"tag":"1.1.73","author":"boni58","date":"2026-05-14 20:48:14","revision":3532478},"1.1.74":{"tag":"1.1.74","author":"boni58","date":"2026-05-14 20:57:03","revision":3532485},"1.1.75":{"tag":"1.1.75","author":"boni58","date":"2026-05-14 21:28:59","revision":3532499},"1.1.76":{"tag":"1.1.76","author":"boni58","date":"2026-05-21 10:25:51","revision":3541556},"1.1.77":{"tag":"1.1.77","author":"boni58","date":"2026-05-21 10:32:57","revision":3541592},"1.1.78":{"tag":"1.1.78","author":"boni58","date":"2026-09-17 11:50:47","revision":3700211},"1.1.8":{"tag":"1.1.8","author":"boni58","date":"2026-05-06 09:18:16","revision":3524120},"1.1.81":{"tag":"1.1.81","author":"boni58","date":"2026-09-17 18:00:28","revision":3700762},"1.1.9":{"tag":"1.1.9","author":"boni58","date":"2026-05-06 09:37:49","revision":3524136},"1.2.0":{"tag":"1.2.0","author":"boni58","date":"2026-09-18 11:20:50","revision":3701873},"1.3.0":{"tag":"1.3.0","author":"boni58","date":"2026-09-18 17:07:05","revision":3702383},"1.4.0":{"tag":"1.4.0","author":"boni58","date":"2026-09-18 23:00:05","revision":3702839}},"upgrade_notice":{"1.4.0":"<p>New Merchant Center page: a 95-point audit of your shop against what Google checks before it accepts an offer, reversible one-click fixes, the optional Google connection, and the account and product problems Google reports. Feed and markup prices now come from the same source as your product page. The audit table, the new options and the crons are created at the first request after the update \u2014 no reactivation, nothing lost. Essiow prepares and fixes; Google decides. Requires WordPress 5.8+ and PHP 7.4+.<\/p>","1.3.0":"<p>Four new modules \u2014 Speed (Core Web Vitals and technical audit), Off-site (brand mentions, outreach targets, lost links), Product feeds (Google Merchant Center, Meta, Pinterest) and the Content plan \u2014 plus <code>ProductGroup<\/code> schema for variable products, image sitemap and hreflang. New tables and options are created at the first request after the update; no reactivation, nothing lost. Requires WordPress 5.8+ and PHP 7.4+.<\/p>","1.2.0":"<p>Major admin redesign (dashboard, products, categories, blog, internal links, Search Console, redirects, automation, AI agent), persistent SEO scores, and automatic data migration at the first request after the update \u2014 no reactivation needed, your API key, settings, optimizations and redirects are kept. Requires WordPress 5.8+ and PHP 7.4+.<\/p>","1.1.81":"<p>All source strings are now in English with complete French, Spanish, German, Italian, Portuguese and Dutch translations; new Automation menu. Safe update.<\/p>","1.1.29":"<p>Massive SEO release : AI re-optimize uses your real Search Console queries (top 10 \/ striking distance), new Opportunities tab (cannibalization, low CTR, lost rankings), Issues report, Audit tab (image SEO + schemas), auto BreadcrumbList + FAQPage JSON-LD. Required.<\/p>","1.1.28":"<p>Adds Pause \/ Resume \/ Cancel controls during bulk optimization. Leaving the page now cancels the bulk automatically (saved items stay, pending queue is dropped). Auto-resume on page load removed by design.<\/p>","1.1.27":"<p>Fixes Search Console KPIs stuck at 0 when the WP server returns 503 on admin-ajax (Wordfence\/Cloudflare overload). JS now retries with exponential backoff. Recommended.<\/p>","1.1.26":"<p>Auto-syncs Search Console data on page load (no more empty Overview after connecting), populates the Performance tab with striking-distance keywords, and auto-picks the property variant with the most actual data.<\/p>","1.1.25":"<p>Cosmetic fix: replaces the misleading &quot;Traitement en cours\u2026&quot; placeholder with a clearer empty state on the Search Console Indexation overview.<\/p>","1.1.24":"<p>Removes the manual &quot;Change property&quot; UI now that auto-fallback handles property variants automatically.<\/p>","1.1.23":"<p>Search Console connection is now self-healing: tries every property variant (sc-domain, www, http) until one works, and surfaces Google&#039;s real error message when none does. Recommended.<\/p>","1.1.22":"<p>Fixes Search Console 404 sync errors when your GSC property URL doesn&#039;t exactly match the WP site URL (sc-domain, www, http variants). Adds a manual &quot;Change property&quot; picker. Recommended.<\/p>","1.1.21":"<p>Critical fixes for 1.1.20 Search Console: OAuth response format, missing cryptography dependency, empty Indexation tab, indexation column on categories, <code>is_connected<\/code> guards, missing strings. Required if you upgraded to 1.1.20.<\/p>","1.1.20":"<p>Major release: full Google Search Console + IndexNow integration. New &quot;Search Console&quot; admin menu with stats, indexation status, sitemap submission, auto IndexNow on publish, and a per-product &quot;Indexation&quot; column. Recommended.<\/p>","1.1.19":"<p>Removes the page reload after a single category optimize (so concurrent optimizations don&#039;t get killed) and silences the spurious &quot;Task not found&quot; toast on page reload. Recommended.<\/p>","1.1.18":"<p>Fixes three concurrency bugs in 1.1.17 bulk: filtered re-selection re-running everything, items getting stuck in queue from parallel poll-driven processing, and spurious &quot;Task not found&quot; errors during transient races. Recommended.<\/p>","1.1.17":"<p>Critical fix for bulk and parallel optimizations stopping after 3-5 items. Each Flask call is now isolated to its own short-lived PHP process so <code>max_execution_time<\/code> and FPM worker saturation can&#039;t interrupt the queue. Recommended.<\/p>","1.1.16":"<p>Polish on 1.1.15 bulk: stuck-item recovery, clean cancel\/error UX, missing strings. Recommended.<\/p>","1.1.15":"<p>Major bulk overhaul: full async dispatch (no more 504 on category bulk), per-row progress states like single optimize, percentage bar everywhere, cancel button, auto-resume on page reload. Recommended for anyone using bulk optimization.<\/p>","1.1.14":"<p>Adds a filemtime-based cache buster so the new admin JS is loaded immediately after update, plus session\/timeout hardening on legacy sync endpoints. Recommended for anyone still seeing 504 on category optimize after 1.1.13.<\/p>","1.1.13":"<p>Fixes 504 Gateway Timeout on single-product and single-category optimization (same async dispatch as blog), and bans colons in AI-generated titles. Recommended update.<\/p>","1.1.12":"<p>Definitive fix for &quot;Erreur r\u00e9seau \/ 504&quot; on sites behind Cloudflare + Wordfence (or similar). Concurrent polls no longer block on PHP sessions, the loopback dispatch is removed, and the JS tolerates transient network errors. Recommended update for everyone on 1.1.8 \u2192 1.1.11.<\/p>","1.1.11":"<p>Critical fix for &quot;Erreur r\u00e9seau \/ 504&quot; when generating blog articles on hosts behind Cloudflare\/Caddy\/strict NGINX. The browser response now closes before the AI call runs. Recommended update.<\/p>","1.1.10":"<p>Fixes a payload mismatch that prevented categories and blog links from reaching the AI for articles and category pages, and adds JSON-LD Article schema. Recommended update for anyone on 1.1.8 or 1.1.9.<\/p>","1.1.9":"<p>Major content quality fix: AI now writes intent-driven titles (no more &quot;guide complet&quot; clich\u00e9s), stops paraphrasing the brief (&quot;Introduction&quot;, &quot;voici les liens&quot;), and articles publish as real Gutenberg blocks instead of a single HTML block. Recommended update.<\/p>","1.1.6":"<p>Fixes a &quot;Network error&quot; that could appear when generating blog articles on hosts with short HTTP proxy timeouts. Recommended update.<\/p>","1.0.0":"<p>Initial release of Essiow AI SEO Suite for WooCommerce.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3503791,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3503791,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3503791,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3503791,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.10","1.1.11","1.1.12","1.1.13","1.1.14","1.1.15","1.1.16","1.1.17","1.1.18","1.1.19","1.1.20","1.1.21","1.1.22","1.1.23","1.1.24","1.1.25","1.1.26","1.1.27","1.1.28","1.1.29","1.1.30","1.1.31","1.1.32","1.1.33","1.1.34","1.1.35","1.1.36","1.1.37","1.1.38","1.1.39","1.1.40","1.1.41","1.1.42","1.1.43","1.1.44","1.1.45","1.1.46","1.1.47","1.1.48","1.1.49","1.1.5","1.1.50","1.1.51","1.1.52","1.1.53","1.1.54","1.1.55","1.1.56","1.1.57","1.1.58","1.1.59","1.1.6","1.1.60","1.1.61","1.1.62","1.1.63","1.1.64","1.1.65","1.1.66","1.1.67","1.1.68","1.1.69","1.1.7","1.1.70","1.1.71","1.1.72","1.1.73","1.1.74","1.1.75","1.1.76","1.1.77","1.1.78","1.1.8","1.1.81","1.1.9","1.2.0","1.3.0","1.4.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3702837,"resolution":"1","location":"assets","locale":"","width":1280,"height":1000},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3702837,"resolution":"10","location":"assets","locale":"","width":1280,"height":1000},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3702837,"resolution":"11","location":"assets","locale":"","width":1280,"height":1000},"screenshot-12.png":{"filename":"screenshot-12.png","revision":3702837,"resolution":"12","location":"assets","locale":"","width":1280,"height":1000},"screenshot-13.png":{"filename":"screenshot-13.png","revision":3702837,"resolution":"13","location":"assets","locale":"","width":1280,"height":1000},"screenshot-14.png":{"filename":"screenshot-14.png","revision":3702837,"resolution":"14","location":"assets","locale":"","width":1280,"height":1000},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3702837,"resolution":"2","location":"assets","locale":"","width":1280,"height":1000},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3702837,"resolution":"3","location":"assets","locale":"","width":1280,"height":1000},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3702837,"resolution":"4","location":"assets","locale":"","width":1280,"height":1000},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3702837,"resolution":"5","location":"assets","locale":"","width":1280,"height":1000},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3702837,"resolution":"6","location":"assets","locale":"","width":1280,"height":1000},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3702837,"resolution":"7","location":"assets","locale":"","width":1280,"height":1000},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3702837,"resolution":"8","location":"assets","locale":"","width":1280,"height":1000},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3702837,"resolution":"9","location":"assets","locale":"","width":1280,"height":1000}},"screenshots":{"1":"Dashboard: site SEO score, KPI, prioritized to-do list and module overview","2":"Products: SEO score per product, server-side filters, bulk optimization and audit panel","3":"Categories: same workflow for product categories","4":"Blog: three-step article generator with SEO research, article list and bulk generation","5":"Internal links: overview, suggestions, automatic mesh and link graph","6":"Search Console: connection status, performance, indexation, opportunities","7":"Redirects, 404 monitor and lost links","8":"Automation: automations, content plan, queue and log","9":"Speed: Core Web Vitals, Lighthouse per template and technical audit","10":"Off-site: brand mentions, outreach targets and recovered visits","11":"Feeds: feed URLs per platform and free-listing eligibility","12":"Merchant Center: readiness score, the 95-point diagnostic grouped by family with its one-click fixes, the Google connection, the account and product problems reported by Google","13":"AI sales agent: settings with live preview, conversations and leads","14":"Settings and help"}},"plugin_section":[],"plugin_tags":[2353,65424,127115,186,286],"plugin_category":[45,55],"plugin_contributors":[259943],"plugin_business_model":[],"class_list":["post-294906","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-merchant-center","plugin_tags-search-console","plugin_tags-seo","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_category-seo-and-marketing","plugin_contributors-boni58","plugin_committers-boni58"],"banners":{"banner":"https:\/\/ps.w.org\/essiow\/assets\/banner-772x250.png?rev=3503791","banner_2x":"https:\/\/ps.w.org\/essiow\/assets\/banner-1544x500.png?rev=3503791","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/essiow\/assets\/icon-128x128.png?rev=3503791","icon_2x":"https:\/\/ps.w.org\/essiow\/assets\/icon-256x256.png?rev=3503791","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/essiow\/assets\/screenshot-1.png?rev=3702837","caption":"Dashboard: site SEO score, KPI, prioritized to-do list and module overview"},{"src":"https:\/\/ps.w.org\/essiow\/assets\/screenshot-2.png?rev=3702837","caption":"Products: SEO score per product, server-side filters, bulk optimization and audit panel"},{"src":"https:\/\/ps.w.org\/essiow\/assets\/screenshot-3.png?rev=3702837","caption":"Categories: same workflow for product categories"},{"src":"https:\/\/ps.w.org\/essiow\/assets\/screenshot-4.png?rev=3702837","caption":"Blog: three-step article generator with SEO research, article list and bulk generation"},{"src":"https:\/\/ps.w.org\/essiow\/assets\/screenshot-5.png?rev=3702837","caption":"Internal links: overview, suggestions, automatic mesh and link graph"},{"src":"https:\/\/ps.w.org\/essiow\/assets\/screenshot-6.png?rev=3702837","caption":"Search Console: connection status, performance, indexation, opportunities"},{"src":"https:\/\/ps.w.org\/essiow\/assets\/screenshot-7.png?rev=3702837","caption":"Redirects, 404 monitor and lost links"},{"src":"https:\/\/ps.w.org\/essiow\/assets\/screenshot-8.png?rev=3702837","caption":"Automation: automations, content plan, queue and log"},{"src":"https:\/\/ps.w.org\/essiow\/assets\/screenshot-9.png?rev=3702837","caption":"Speed: Core Web Vitals, Lighthouse per template and technical audit"},{"src":"https:\/\/ps.w.org\/essiow\/assets\/screenshot-10.png?rev=3702837","caption":"Off-site: brand mentions, outreach targets and recovered visits"},{"src":"https:\/\/ps.w.org\/essiow\/assets\/screenshot-11.png?rev=3702837","caption":"Feeds: feed URLs per platform and free-listing eligibility"},{"src":"https:\/\/ps.w.org\/essiow\/assets\/screenshot-12.png?rev=3702837","caption":"Merchant Center: readiness score, the 95-point diagnostic grouped by family with its one-click fixes, the Google connection, the account and product problems reported by Google"},{"src":"https:\/\/ps.w.org\/essiow\/assets\/screenshot-13.png?rev=3702837","caption":"AI sales agent: settings with live preview, conversations and leads"},{"src":"https:\/\/ps.w.org\/essiow\/assets\/screenshot-14.png?rev=3702837","caption":"Settings and help"}],"raw_content":"<!--section=description-->\n<p><strong>Essiow turns your WooCommerce store into a search-traffic machine.<\/strong> It plugs into Google Search Console, watches what your customers actually search for, and rewrites your product pages, category pages and blog articles to capture every query you nearly rank on.<\/p>\n\n<p>You don't write SEO. You don't pick keywords. You don't guess what works. You click a button and the right pages get fixed.<\/p>\n\n<h4>What Essiow does for you<\/h4>\n\n<p><strong>1. Auto-rewrites your product pages.<\/strong> Long description, short pitch, meta title, meta description, focus keyword, image alt texts \u2014 all generated from your real GSC queries when connected, in 8 languages, in your store's tone. Compatible with Yoast SEO, Rank Math and All in One SEO.<\/p>\n\n<p><strong>2. Turns empty category pages into landing pages.<\/strong> Bare category pages don't rank. Essiow generates 1,500-2,500 words of category content with FAQ, comparison tables and links to your top products \u2014 the page Google needs to rank you in position 1 instead of position 30.<\/p>\n\n<p><strong>3. Writes blog articles that pull traffic to your products.<\/strong> 1,500-5,000 word articles with internal links to the products mentioned, a structured FAQ, automatic featured image. Suggestions based on what your audience already searches.<\/p>\n\n<p><strong>4. Spots and grabs every \"almost-ranking\" keyword.<\/strong> When Google Search Console is connected, Essiow surfaces every query where your store sits at position 11-20 \u2014 the closest gains. One click rewrites the matching page targeting that exact query.<\/p>\n\n<p><strong>5. Resolves cannibalization in two clicks.<\/strong> Two of your pages competing for the same query? Essiow detects it, picks the strongest one, and consolidates the canonical from the others \u2014 without deleting anything.<\/p>\n\n<p><strong>6. Indexes everything instantly.<\/strong> Bing, Yandex, Naver, Seznam, Amazon and Yep are pinged the second you publish. Google gets the URL pushed via sitemap re-submit + URL Inspection refresh + a one-click manual indexation request. The Search Console page shows clicks, impressions, CTR and position over 7 days to 16 months, the Google status of every URL, and a diagnostics panel when a sync returns nothing.<\/p>\n\n<p><strong>7. Builds your internal mesh.<\/strong> Every page gets a click depth and an inbound \/ outbound count (menus, archives, cross-sells included). Orphans, weakly linked pages and dead-ends are listed with one-click fixes, suggestions can be inserted in batches or from the post editor, and the automatic mesh links the right pages together \u2014 reversible, with a mesh score \/ 100 and an anchor report.<\/p>\n\n<p><strong>8. Keeps your link equity.<\/strong> 301 \/ 302 \/ 410 rules (exact or regex) with a live source tester, automatic redirects when a product, category or article is deleted or renamed, a grouped 404 monitor with one-click fixes, CSV import \/ export, and an on\/off switch per rule.<\/p>\n\n<p><strong>9. Runs on autopilot.<\/strong> New products and categories are optimized when published, declining pages are re-optimized, missing alt texts are written on upload, articles are scheduled from your Search Console data, and a weekly e-mail report sums it up \u2014 all within a daily credit cap you control.<\/p>\n\n<p><strong>10. AI sales agent on your storefront.<\/strong> A chatbot that knows your full catalog, handles objections, can issue promo codes within your discount limit, and quotes your delivery \/ returns \/ payment policy. Conversations and leads are listed in the admin (CSV export, GDPR retention).<\/p>\n\n<p><strong>11. Exposes your catalog to ChatGPT, Perplexity and Claude.<\/strong> Toggle on and Essiow serves a clean <code>\/llms.txt<\/code> at your root. It is an answer-engine signal, not a Google one: Google states it ignores the file, the other assistants read it.<\/p>\n\n<p><strong>12. Puts your catalog in the shopping feeds.<\/strong> One <code>ProductGroup<\/code> markup with an offer per variant makes your variable products eligible for Google free listings, and a product feed file (Google Merchant Center, Meta, Pinterest) is served by your shop and fetched automatically. The file alone needs no connection: you paste its URL in the platform and it fetches daily.<\/p>\n\n<p><strong>13. Watches your page experience.<\/strong> Core Web Vitals from real Chrome users (LCP, INP, CLS) plus a Lighthouse score per page template, a ~40-point technical audit of your server, database, assets and images, and one-click fixes for the safe ones \u2014 each reversible.<\/p>\n\n<p><strong>14. Finds your off-site opportunities.<\/strong> Essiow searches for pages that mention your brand without linking to it, lists sites worth contacting, and reports external links that now hit a 404 so you can redirect them in one click. It detects and drafts the e-mail \u2014 <strong>it never creates a link for you<\/strong>, and buying links is not part of the product.<\/p>\n\n<p><strong>15. Publishes on a rhythm you set.<\/strong> The content plan turns keywords, your categories and your Search Console gaps into a 14-day calendar: pick how many articles per day or per week, the days, the hour and the output (draft, scheduled or published). An activity register keeps every long action marked until it finishes \u2014 closing the tab or reloading the page changes nothing.<\/p>\n\n<p><strong>16. Gets your shop ready for Google Merchant Center.<\/strong> Most refusals and suspensions are about the <em>shop<\/em>, not the feed: a return policy left as a draft, the WooCommerce template text still in place, guest checkout closed, prices shown excluding tax, a page nobody can reach. Essiow audits 95 of those points the way a Google reviewer reads your site, tells you what is missing in plain words, and fixes what can safely be fixed \u2014 every fix reversible. Connect your Merchant Center account and you also get the account and product problems Google reports, in your own language, with the exact attribute in cause, plus an e-mail the day the account gets suspended. <strong>Essiow prepares, diagnoses and fixes; Google decides<\/strong> \u2014 no plugin can promise an approved account, which is why the review request stays locked until every blocking check is green (you only get one real appeal).<\/p>\n\n<h4>Why it ranks better<\/h4>\n\n<p>When Search Console is connected, every optimization sees the actual queries the page is already ranking on, the striking-distance keywords just outside page 1, and the CTR alerts when a title is converting poorly. The AI doesn't guess keywords \u2014 it gets them from Google itself, and writes around what's already working.<\/p>\n\n<h4>Made for shop owners, not SEOs<\/h4>\n\n<ul>\n<li>No keyword research needed<\/li>\n<li>No technical setup beyond pasting an API key<\/li>\n<li>Every action shows its credit cost upfront \u2014 no surprise billing<\/li>\n<li>Bulk optimize, pause, resume, restore original \u2014 your content is always recoverable<\/li>\n<li>8 languages, 4 writing tones, 3 content lengths<\/li>\n<li>A persistent SEO score \/ 100 on every product and category, with a factor-by-factor audit, filters and sorting<\/li>\n<li>One consistent admin: a dashboard with a site score and a prioritized to-do list, KPI on every page, server-side filters, side panels for previews, a floating bar for bulk actions<\/li>\n<li>Every long action stays marked until it ends, survives a page reload, and is listed in one activity centre<\/li>\n<\/ul>\n\n<h4>Compatible &amp; safe<\/h4>\n\n<ul>\n<li>WooCommerce HPOS compatible<\/li>\n<li>Works alongside Yoast SEO \/ Rank Math \/ All in One SEO (writes to all three)<\/li>\n<li>GDPR compliant (auto-delete chat data after 90 days)<\/li>\n<li>Original content backed up the first time you optimize \u2014 one-click restore<\/li>\n<\/ul>\n\n<h4>How credits work<\/h4>\n\n<ul>\n<li><strong>1 credit<\/strong> per product optimization<\/li>\n<li><strong>1 credit<\/strong> per category optimization<\/li>\n<li><strong>3 credits<\/strong> per blog article<\/li>\n<li><strong>2 credits<\/strong> per AI Vision alt text generation<\/li>\n<li>All indexation actions, audits, internal-link suggestions, mesh-score, \/llms.txt, product feeds, Core Web Vitals, the off-site scan and the whole Merchant Center diagnostic \u2014 <strong>free<\/strong> (no AI involved)<\/li>\n<li>Inside Merchant Center, only the <strong>assisted<\/strong> fixes call the AI (a return, shipping or contact page written from your own settings, a product title or description rewritten to the feed rules). Automatic fixes \u2014 publishing a draft page, reopening guest checkout, switching prices to tax-included \u2014 cost nothing.<\/li>\n<li>Credits are debited only on success. Failed AI calls don't consume credits.<\/li>\n<li>Purchased credits never expire (free trial credits expire after 30 days)<\/li>\n<\/ul>\n\n<h4>External Service<\/h4>\n\n<p>This plugin connects to the Essiow API at <code>https:\/\/essiow.com\/api\/v1<\/code> to process AI content generation. Your product data (names, descriptions, prices, categories) is sent to the Essiow servers where it is processed using OpenAI's models. No data is stored beyond what is needed to track your credit usage.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/essiow.com\/terms\">Essiow Terms of Service<\/a><\/li>\n<li><a href=\"https:\/\/essiow.com\/privacy\">Essiow Privacy Policy<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>essiow<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress<\/li>\n<li>Go to <strong>Essiow &gt; Settings<\/strong> and enter your API key from <a href=\"https:\/\/essiow.com\">essiow.com<\/a><\/li>\n<li>Click \"Test Connection\" to verify<\/li>\n<li>Start optimizing from <strong>Essiow &gt; Products<\/strong> or <strong>Essiow &gt; Categories<\/strong><\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20essiow%20account%3F\"><h3>Do I need an Essiow account?<\/h3><\/dt>\n<dd><p>Yes. Create a free account at <a href=\"https:\/\/essiow.com\">essiow.com<\/a> to get your API key and 10 free credits.<\/p><\/dd>\n<dt id=\"do%20i%20need%20technical%20skills%3F\"><h3>Do I need technical skills?<\/h3><\/dt>\n<dd><p>No. If you can install a WordPress plugin, you can use Essiow. Everything is done in a few clicks.<\/p><\/dd>\n<dt id=\"do%20i%20need%20to%20know%20seo%3F\"><h3>Do I need to know SEO?<\/h3><\/dt>\n<dd><p>No. Essiow does the SEO work : it picks the keywords (from Google Search Console when connected), writes the meta tags, generates the schema, builds the internal links and submits everything to search engines. You just click \"Optimize\".<\/p><\/dd>\n<dt id=\"why%20does%20connecting%20google%20search%20console%20matter%3F\"><h3>Why does connecting Google Search Console matter?<\/h3><\/dt>\n<dd><p>With GSC connected, every optimization is fed with the real queries your page already ranks on. Essiow finds queries where you sit at position 11-20 (just outside page 1) and rewrites the matching page targeting that exact query. Without GSC, optimizations are still good \u2014 but generic. With GSC, they're surgical.<\/p><\/dd>\n<dt id=\"will%20optimizing%20break%20my%20existing%20content%3F\"><h3>Will optimizing break my existing content?<\/h3><\/dt>\n<dd><p>No. The first time a product or category is optimized, the original content is backed up automatically. One click in the preview modal restores it.<\/p><\/dd>\n<dt id=\"which%20seo%20plugins%20are%20supported%3F\"><h3>Which SEO plugins are supported?<\/h3><\/dt>\n<dd><p>Essiow works with Yoast SEO, Rank Math, and All in One SEO. It writes to all three formats simultaneously, so switching SEO plugin later does not lose your data.<\/p><\/dd>\n<dt id=\"is%20my%20data%20safe%3F\"><h3>Is my data safe?<\/h3><\/dt>\n<dd><p>Your product data is sent to Essiow servers only during optimization. It is processed in real-time and not stored beyond credit-tracking metadata. Chat conversations are auto-deleted after 90 days per GDPR requirements.<\/p><\/dd>\n<dt id=\"do%20credits%20expire%3F\"><h3>Do credits expire?<\/h3><\/dt>\n<dd><p>Purchased credits never expire. The 10 free credits expire after 30 days.<\/p><\/dd>\n<dt id=\"can%20i%20cancel%20a%20bulk%20optimization%3F\"><h3>Can I cancel a bulk optimization?<\/h3><\/dt>\n<dd><p>Yes. Pause \/ Resume \/ Cancel buttons appear during a bulk run. Closing the tab also auto-cancels \u2014 items already processed remain saved.<\/p><\/dd>\n<dt id=\"can%20i%20try%20before%20buying%3F\"><h3>Can I try before buying?<\/h3><\/dt>\n<dd><p>Yes. Create a free account and get 10 credits to test all features. No credit card required.<\/p><\/dd>\n<dt id=\"what%20is%20the%20seo%20score%20shown%20on%20products%20and%20categories%3F\"><h3>What is the SEO score shown on products and categories?<\/h3><\/dt>\n<dd><p>A local audit out of 100 (title and meta lengths, focus keyword, description length and structure, image alt texts, FAQ, schema\u2026). It is computed by the plugin, never costs a credit, and is stored so you can filter and sort the catalog by score. Rating a large catalog happens progressively in the background of the Products page.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20slow%20down%20my%20store%3F\"><h3>Does the plugin slow down my store?<\/h3><\/dt>\n<dd><p>No. Nothing runs on the storefront except the optional chat widget, the JSON-LD schemas (cached) and the redirect lookup (cached). Bulk jobs, syncs and automations run through WP-Cron or on the Essiow servers.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20update%20the%20plugin%3F\"><h3>What happens when I update the plugin?<\/h3><\/dt>\n<dd><p>Nothing to do: the plugin migrates its own data at the first request after an update (database tables, new options with safe defaults, expired caches). Your API key, settings, optimizations and redirects are kept.<\/p><\/dd>\n<dt id=\"what%20is%20removed%20when%20i%20delete%20the%20plugin%3F\"><h3>What is removed when I delete the plugin?<\/h3><\/dt>\n<dd><p>All options, cached data, scheduled tasks, tables (agent conversations and leads, redirects, 404 log, automation queue, content plan, speed runs, off-site findings) and Essiow metadata. If \"Restore originals on uninstall\" is enabled in Settings, the original titles, descriptions, SEO meta and alt texts are put back and the internal links added by Essiow are removed.<\/p><\/dd>\n<dt id=\"does%20essiow%20build%20backlinks%20for%20me%3F\"><h3>Does Essiow build backlinks for me?<\/h3><\/dt>\n<dd><p>No, and it never will. The Off-site module searches for pages that already mention your brand without linking to it, lists sites worth contacting and reports external links that now hit a 404. It prepares the outreach e-mail; you send it and the other site decides. Nothing is posted, bought or published anywhere on your behalf.<\/p><\/dd>\n<dt id=\"what%20does%20%2Fllms.txt%20actually%20do%3F\"><h3>What does \/llms.txt actually do?<\/h3><\/dt>\n<dd><p>It exposes a clean summary of your catalog to AI assistants. It is an answer-engine signal, not a Google ranking factor: Google has stated it ignores the file. Keep it on if you care about ChatGPT, Perplexity or Claude citing your shop; it costs nothing either way.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20google%20api%20key%20for%20the%20speed%20module%3F\"><h3>Do I need a Google API key for the Speed module?<\/h3><\/dt>\n<dd><p>Only for the Field tab. Core Web Vitals from real users and the Lighthouse score come from the free PageSpeed Insights API. The technical audit and its fixes work without any key.<\/p><\/dd>\n<dt id=\"does%20the%20product%20feed%20need%20a%20google%20merchant%20center%20connection%3F\"><h3>Does the product feed need a Google Merchant Center connection?<\/h3><\/dt>\n<dd><p>No. Essiow serves the feed file at your own domain and you paste that URL in the platform (Google Merchant Center, Meta or Pinterest), which fetches it daily. The Eligibility tab lists what each item is still missing. Connecting your Merchant Center account is a separate, optional step that adds Google's own verdict on top.<\/p><\/dd>\n<dt id=\"will%20essiow%20get%20my%20merchant%20center%20account%20approved%3F\"><h3>Will Essiow get my Merchant Center account approved?<\/h3><\/dt>\n<dd><p>No, and no plugin can: Google decides. What Essiow does is remove the reasons for a refusal before you ask \u2014 it audits 95 points the way a reviewer reads your shop, explains each failure in plain words, and fixes the ones that can be fixed safely. The review request button stays locked until every blocking check is green, on purpose: you only get one real appeal, and each refusal lengthens the wait.<\/p><\/dd>\n<dt id=\"what%20does%20the%20merchant%20center%20diagnostic%20actually%20check%3F\"><h3>What does the Merchant Center diagnostic actually check?<\/h3><\/dt>\n<dd><p>Your shop, not your feed: HTTPS and reachability, return and shipping policies (published, not the WooCommerce template, complete), contact details and legal identity, the checkout end to end (guest checkout, payment method, terms, order e-mails), prices and tax display, placeholder content, structured data, and your product data (titles, descriptions, images, GTIN, category, variants). The probe reads your shop from your own server, so it cannot see blocking that depends on the visitor's country or IP \u2014 those checks say so instead of claiming to be covered.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20google%20cloud%20project%20to%20connect%20merchant%20center%3F\"><h3>Do I need a Google Cloud project to connect Merchant Center?<\/h3><\/dt>\n<dd><p>No. The authorization goes through essiow.com: you sign in with Google, accept the access, and come back. No WordPress.com account, no Cloud project, no API key to create. Disconnecting removes the link on both sides.<\/p><\/dd>\n<dt id=\"if%20i%20close%20the%20tab%20during%20a%20long%20job%2C%20do%20i%20lose%20it%3F\"><h3>If I close the tab during a long job, do I lose it?<\/h3><\/dt>\n<dd><p>No. Optimizations, bulk generations, scans and measurements are registered server-side. The item stays marked until the job finishes, the state comes back after a reload, and the activity centre in the top bar lists everything currently running.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.4.0<\/h4>\n\n<ul>\n<li><strong>New \u2014 Merchant Center.<\/strong> A new page that audits your shop the way a Google reviewer reads it: 95 checks in eight families (reachability and indexability, policy pages, identity and contact, checkout, prices and tax, content quality, structured data, product data), each failure explained by what is actually missing \u2014 \"the return policy does not say who pays the return shipping\", not \"policy incomplete\". Checks run in steps, products in batches, and the run survives a page reload.<\/li>\n<li><strong>Merchant Center \u2014 fixes.<\/strong> Automatic fixes publish a policy page left as a draft, leave \"coming soon\" mode, remove a noindex or a password, attach the terms to the checkout, reopen guest checkout, switch the price display to tax-included, or replace a main image that is too small with a compliant one from the gallery. Assisted fixes write a return, shipping or contact page from your own shop settings, or rewrite a product title, description, category or attributes. Manual fixes ask you only for what you alone know. Everything is logged, reversible, and re-checked right after it is applied. A text that falls back to the WooCommerce template or still carries a <code>{{\u2026}}<\/code> marker is never published \u2014 that template text is exactly what Google sanctions.<\/li>\n<li><strong>Merchant Center \u2014 Google connection.<\/strong> One click through essiow.com: no WordPress.com account, no Google Cloud project, no API key. Pick or create the account, verify then claim the site, declare the Essiow feed as a data source with its daily fetch hour, run the first fetch. A permanent status banner and a five-step connection check, on the Search Console model. Site claimed by another account, business identity pending, account suspended and revoked token each get a short message and one action.<\/li>\n<li><strong>Merchant Center \u2014 what Google reports.<\/strong> Account problems rendered by Google in your own language, with severity, explanation, documentation and the local check that fixes them; per-product serving status with the exact reason and the attribute in cause, filters, search, server-side pagination and bulk re-read. Statuses are read in batches, never product by product. A daily check e-mails you on a suspension or a new blocking issue \u2014 and the review request stays locked until every blocking check is green.<\/li>\n<li><strong>Feed.<\/strong> Feed and markup prices now come from the same source as the page (<code>wc_get_price_to_display<\/code>), so the feed can no longer contradict the shop. <code>sale_price<\/code> is only sent while the sale actually runs, with its effective date. The brand is no longer filled with the site name, and <code>identifier_exists<\/code> is only sent when the answer is known. New columns: Google product category, age group, gender, size type and system, custom labels 0-4. A title or description written by the AI is declared to Google as such (<code>structured_title<\/code> \/ <code>structured_description<\/code> with <code>digital_source_type<\/code>), as Merchant Center requires.<\/li>\n<li><strong>Product markup.<\/strong> Every published product is marked up, not only the ones optimized by Essiow. The duplicate-markup guard now observes whether another plugin really writes a Product block instead of assuming it. No aggregate rating unless reviews actually carry a rating.<\/li>\n<li><strong>Consistency.<\/strong> The Feeds page and the Merchant Center page say what each of their counters measures and link to each other; the eligibility lights can no longer be green where the diagnostic is red (they name the failing checks instead); one date format per screen; the Merchant Center entry sits in the menu, the top bar, the Help modules list and the screenshots in the same order.<\/li>\n<li><strong>Upgrade &amp; uninstall.<\/strong> The audit table and the new options are created at the first request after the update, crons are armed, nothing is lost \u2014 no reactivation, no need to open the page. Uninstall removes the new table, options and scheduled tasks; two long-standing causes of leftovers were fixed at the root (the activity register recreating its own option, and WordPress rescheduling a recurring event through <code>spawn_cron()<\/code> seconds after the purge).<\/li>\n<li><strong>Honest documentation.<\/strong> No promise that Merchant Center will accept the account: Essiow prepares, diagnoses and fixes, Google decides. The probe says what it cannot see (it reads your shop from your own server, so no geo-blocking or WAF), and the checks that depend on it are marked partial instead of being presented as covered.<\/li>\n<li><strong>Developer.<\/strong> New AJAX actions <code>essiow_gmc_*<\/code> (22, all covered by the smoke test), the <code>{prefix}essiow_gmc_audit<\/code> table, the <code>essiow_gmc_audit_weekly<\/code> and <code>essiow_gmc_daily<\/code> crons, the <code>essiow_gmc_tabs<\/code> and <code>essiow_gmc_state<\/code> filters for adding a tab to the page without touching it, a Merchant Center API mock with six failure modes, an upgrade scenario from 1.3.0 across the 15 admin pages, and an updated inventory in <code>CONTRIBUTING.md<\/code> and <code>docs\/DESIGN.md<\/code>.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li><strong>New \u2014 Speed.<\/strong> Core Web Vitals from real Chrome users (LCP, INP, CLS, FCP, TTFB) with a 10-month trend, a Lighthouse score per page template (mobile \/ desktop) with its \"what to fix first\" list, and a technical audit of about forty checks on your server, database, assets and images. The safe fixes are applied in one click and can be undone; the risky ones stay behind an explicit confirmation. Weekly measurement, optional e-mail alert, free PageSpeed API key needed only for the field data.<\/li>\n<li><strong>New \u2014 Off-site.<\/strong> Finds pages that mention your brand without linking to it, lists sites worth contacting, and drafts the outreach e-mail for you. A \"Lost links\" tab in Redirects shows the external links that now hit a 404 with the visits they used to bring, and turns them into a 301 in one click. <strong>Essiow never creates, buys or posts a link<\/strong> \u2014 it detects and prepares, you decide.<\/li>\n<li><strong>New \u2014 Product feeds.<\/strong> One feed file per platform (Google Merchant Center, Meta, Pinterest) served by your own shop and fetched daily \u2014 no OAuth, no app review. Built-in validation lists every rejected or incomplete item, and an Eligibility tab explains what is still missing for Google free listings. Optional exclusion of out-of-stock items and a cap on the number of items.<\/li>\n<li><strong>New \u2014 Content plan.<\/strong> Turn keywords, your product categories and your Search Console gaps into a publishing rhythm: N articles per day or per week, active days, generation hour, publishing window, and output as draft, scheduled or published. A 14-day calendar shows what comes next, items can be reordered by priority, and the plan shares the same daily credit cap as the rest of the automations. Catch-up after a missed run, pause when credits run low, e-mail when the plan is done.<\/li>\n<li><strong>Product schema.<\/strong> Variable products now emit a single <code>ProductGroup<\/code> with one offer per variant (instead of an aggregate), variant attributes as <code>variesBy<\/code>, product specifications, and shipping details read from your real WooCommerce shipping zones \u2014 which is what Google asks for to consider a variable product for free listings.<\/li>\n<li><strong>Front-end SEO.<\/strong> Image sitemap, <code>hreflang<\/code> with <code>x-default<\/code> on multilingual sites (Polylang, WPML), complete sharing tags, and business-profile fields (coordinates, price range, area served, Google Business Profile link, X \/ Twitter handle) feeding the Organization \/ LocalBusiness schema.<\/li>\n<li><strong>Search Console reliability.<\/strong> The connection banner now shows a real health state (healthy, degraded, reconnection required) that survives a reload, a \"Check the connection\" button, and an explicit diagnostic whenever a sync returns nothing. Sync results and quota cooldowns are reported everywhere instead of failing silently.<\/li>\n<li><strong>Activity register.<\/strong> Every long action (optimizations, generations, scans, measurements) is registered server-side: the item stays marked until the job ends, the state comes back after a reload or in another tab, AI generations run one at a time per site, and the top-bar activity centre lists what is running. One loading indicator per zone, everywhere \u2014 a toast now announces a result, never the start of an action.<\/li>\n<li><strong>Consistency.<\/strong> The Essiow menu follows the same order as the top navigation, action columns fit on one line at 1280 px, \"Top queries\" and \"Top pages\" no longer overflow their card, the dashboard and the Products page count optimized products the same way, and duplicated buttons (\"Run queue now\", \"Bulk generation\") appear once per screen. Lighter wording across every page: shorter subtitles, one line of help per block, no repeated explanations.<\/li>\n<li><strong>Upgrade &amp; uninstall.<\/strong> <code>essiow_run_upgrade()<\/code> creates the new tables (speed runs, off-site findings, content plan) and their default options at the first request after the update \u2014 no reactivation, no need to open the module's page. Crons for the new modules are armed automatically, and uninstall removes every new table, option and scheduled task.<\/li>\n<li><strong>Honest documentation.<\/strong> No FAQ rich-snippet promise, <code>\/llms.txt<\/code> described for what it is (an answer-engine signal Google states it ignores), the IndexNow engine list kept accurate (Bing, Yandex, Naver, Seznam, Amazon, Yep), and no backlink-building claim anywhere.<\/li>\n<li><strong>Developer.<\/strong> New AJAX actions <code>essiow_speed_*<\/code>, <code>essiow_offsite_*<\/code>, <code>essiow_lost_*<\/code>, <code>essiow_feeds_*<\/code>, <code>essiow_plan_*<\/code> and <code>essiow_activity_*<\/code>, all covered by the smoke test; a real upgrade scenario from 1.2.0 (<code>bin\/upgrade-test.sh<\/code>) checking data, schema, defaults and crons across the 14 admin pages; <code>bin\/shot.sh<\/code> covering every page; inventory of actions, options, tables, crons and storage keys in <code>CONTRIBUTING.md<\/code> and <code>docs\/DESIGN.md<\/code>; regenerated translation template.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li><strong>Design<\/strong> : the whole admin is rebuilt on one design system \u2014 top bar with module navigation, connection \/ credits \/ Search Console \/ IndexNow status and a quick search, a header with primary actions on every page, KPI tiles, server-side filters remembered per page, 44 px tables with sticky headers, a floating bar for bulk actions, side panels for previews and details, styled confirmations (no more browser dialogs), illustrated empty states, skeleton loaders, SVG icons (Lucide) instead of Dashicons, keyboard-friendly panels and tabs, and layouts checked at 1280 \/ 1024 \/ 782 px.<\/li>\n<li><strong>Dashboard<\/strong> : site SEO score ring with breakdown and \"Fix\" links that open the right tab, four KPI (products, articles, Search Console clicks, indexed pages), a second row for the modules (average SEO score, internal mesh score, automation queue, redirects and 404), a prioritized \"To do now\" list that also reports the week's 404s and failed or paused automations, recent activity and shortcuts. The setup wizard is kept for new sites.<\/li>\n<li><strong>Products &amp; Categories<\/strong> : a persistent SEO score \/ 100 on every product and category (<code>_essiow_seo_score<\/code>, rated progressively in batches), global KPI with score distribution, server-side filters (name \/ SKU, status, score, category, sort, page size) kept in the URL and in the browser, a fixed paginated table, \"select the page\" or \"select the whole filter\" with a floating bar, a preview panel with a factor-by-factor audit, before \/ after scores, FAQ and restore, and a restyled bulk job (pause, resume, cancel, failed items). Optimizing or restoring no longer reloads the page.<\/li>\n<li><strong>Search Console<\/strong> : an always-visible connection banner (account, property with selector, last sync, rows stored, diagnostics when a sync returns nothing), a single Overview tab (7 days to 16 months, KPI with deltas, clicks and impressions curve, indexation summary, top queries and pages), plus Indexation, Opportunities, Issues, Submission (sitemap, IndexNow queue with \"flush now\", llms.txt) and Audit tabs; daily totals kept for 16 months, weighted average position, titles decoded.<\/li>\n<li><strong>Internal links<\/strong> : inventory rules made explicit (published content only, noindex \/ password-protected \/ system pages excluded, WordPress pages optional, manual exclusions), click depth per page, server-side metrics and mesh score, a real automesh plan with configurable quotas, batch suggestions with one-way insertion and ignored pairs, a force-directed SVG graph with filters and focus, an anchor report, settings tab, and a repaired editor meta box.<\/li>\n<li><strong>Blog<\/strong> : a three-step generator (topic with SEO research and Search Console ideas, options for length \/ tone \/ language \/ linked products \/ featured image, progress), preview in a side panel (score, audit, FAQ, sources; publish, schedule or draft), a server-side article list (search, status, source, score, pagination, bulk IndexNow), bulk generation as a wizard with job details, and E-E-A-T settings (default author, default status, publishing window).<\/li>\n<li><strong>Automation<\/strong> : one card per automation with an on \/ off switch, inline settings saved automatically, next run and last result, a paused-queue notice, and queue \/ log tables with retry and clear actions.<\/li>\n<li><strong>Redirects<\/strong> : KPI, server-side filters (type, status, sort), an add \/ edit panel with a live test of the source path, CSV import in a panel, a grouped 404 monitor with suggested targets, a settings tab, and an active \/ inactive switch per rule (new <code>active<\/code> column, migrated automatically). Duplicate regex patterns are refused.<\/li>\n<li><strong>AI Agent<\/strong> : status and quota KPI (messages per hour), Settings \/ Conversations \/ Leads tabs, identity and widget cards with a live preview, knowledge, delivery and returns, behaviour, coupons, bank details and privacy cards, conversation transcripts in a side panel with deletion, leads list with CSV export, and a modernized storefront widget (SVG icons, Escape to close, <code>#essiow-chat<\/code> deep link).<\/li>\n<li><strong>Upgrade &amp; uninstall<\/strong> : <code>essiow_maybe_upgrade()<\/code> runs idempotent migrations at the first request after any update (default options, database tables via dbDelta, expired caches purged, orphan cron hooks removed, <code>essiow_upgraded<\/code> action for extensions) \u2014 no reactivation needed. Uninstall now removes every option, transient, table, cron, post \/ term \/ user meta added since 1.1.79 and still restores the original content when the option is enabled.<\/li>\n<li><strong>Developer<\/strong> : page styles live in <code>assets\/css\/pages\/&lt;slug&gt;.css<\/code> (loaded automatically), <code>Essiow_Admin::icon \/ page_header \/ kpi \/ empty_state<\/code> and <code>EssiowUI.icon \/ confirm \/ drawer \/ bulkBar \/ pagination \/ setKpi<\/code> helpers documented in <code>docs\/DESIGN.md<\/code>, a demo environment (<code>bin\/smoke.sh<\/code> with <code>SEED=1<\/code>, mock API, <code>bin\/shot.sh<\/code> screenshots), an upgrade scenario (<code>bin\/upgrade-test.sh<\/code>) and an uninstall check (<code>UNINSTALL=1<\/code>) in the smoke test, the smoke test covering every page, AJAX action, cron and front page, new server filters on the products \/ categories \/ articles \/ redirects lists, and a regenerated translation template.<\/li>\n<\/ul>\n\n<h4>1.1.81<\/h4>\n\n<ul>\n<li><strong>Langues<\/strong> : toutes les cha\u00eenes sources unifi\u00e9es en anglais (convention WordPress.org), catalogue r\u00e9g\u00e9n\u00e9r\u00e9 (1 665 cha\u00eenes) et traductions compl\u00e8tes livr\u00e9es en fran\u00e7ais, espagnol, allemand, italien, portugais et n\u00e9erlandais (.po + .mo). Sur les sites multilingues (Polylang, WPML), la langue de g\u00e9n\u00e9ration suit celle du produit, de la cat\u00e9gorie ou de l'article ; le chatbot r\u00e9pond dans la langue de la page.<\/li>\n<li><strong>Automatisation<\/strong> (nouveau menu) : file d'attente avec plafond de cr\u00e9dits par jour, optimisation automatique des nouveaux produits et cat\u00e9gories \u00e0 la publication, blog en pilote automatique (sujets tir\u00e9s de Search Console ou des cat\u00e9gories sans article, N articles par semaine), r\u00e9-optimisation des pages en d\u00e9clin, texte alternatif \u00e0 l'upload, rapport hebdomadaire par email, journal et boutons \u00ab Ex\u00e9cuter maintenant \u00bb.<\/li>\n<li><strong>Design<\/strong> : pages Produits, Cat\u00e9gories, Blog, Search Console, Maillage et Agent align\u00e9es sur le tableau de bord (bandeaux KPI, filtres par statut \/ score \/ cat\u00e9gorie, tri, s\u00e9lection des non optimis\u00e9s, \u00e9tats vides, chargements, dashicons \u00e0 la place des emoji, g\u00e9n\u00e9rateur d'articles en deux colonnes, cartes de jobs, responsive).<\/li>\n<li><strong>Performance et robustesse<\/strong> : JavaScript d\u00e9coup\u00e9 par \u00e9cran (seul le script de la page est charg\u00e9), sch\u00e9mas Product et Organization mis en cache, cat\u00e9gorie des articles bulk \u00ab produits \u00bb retrouv\u00e9e, lien support du chat corrig\u00e9, int\u00e9gration continue (lint PHP 7.4 \/ 8.3, syntaxe JS, catalogue \u00e0 jour, test d'ex\u00e9cution complet dans WordPress + WooCommerce).<\/li>\n<\/ul>\n\n<h4>1.1.80<\/h4>\n\n<ul>\n<li><strong>SEO technique complet sans plugin SEO<\/strong> : title, meta description, canonical, OpenGraph et Twitter sur produits, cat\u00e9gories, boutique et accueil (mod\u00e8les configurables) ; sch\u00e9ma Organization \/ LocalBusiness \/ Store avec logo, profils sociaux et horaires ; WebSite + SearchAction.<\/li>\n<li><strong>Robots<\/strong> : noindex des produits en rupture (option), des archives d'\u00e9tiquettes et de la recherche interne, canonical propre et noindex sur les vues filtr\u00e9es (<code>orderby<\/code>, <code>filter_*<\/code>, prix, utm\u2026), exclusion des produits noindex du sitemap.<\/li>\n<li><strong>Sch\u00e9ma Product enrichi<\/strong> : marque, SKU, GTIN\/MPN, disponibilit\u00e9 (pr\u00e9commande, r\u00e9assort), <code>priceValidUntil<\/code>, politique de retour, frais et d\u00e9lais de livraison, AggregateOffer pour les variables \u2014 sans doublon avec Yoast WooCommerce \/ Rank Math \/ AIOSEO.<\/li>\n<li><strong>FAQ produit g\u00e9n\u00e9r\u00e9e par l'IA<\/strong> : 3 \u00e0 5 questions d'acheteur stock\u00e9es \u00e0 l'optimisation, affich\u00e9es en accord\u00e9on sur la fiche et balis\u00e9es FAQPage.<\/li>\n<li><strong>Redirections et 404<\/strong> (nouveau menu) : r\u00e8gles 301 \/ 302 \/ 410 avec regex, redirection automatique des produits, cat\u00e9gories et articles supprim\u00e9s et des changements de slug, journal des 404 avec suggestion de cible et cr\u00e9ation en un clic, import \/ export CSV, alerte par email au-del\u00e0 d'un seuil.<\/li>\n<li><strong>Blog E-E-A-T<\/strong> : encart auteur avec profils sociaux et sch\u00e9ma Person, blocs \u00ab \u00c0 lire aussi \u00bb et \u00ab Produits li\u00e9s \u00bb, publication \u00e9tal\u00e9e du bulk sur N jours, rafra\u00eechissement \/ remplacement d'un article existant sans doublon, liste enrichie (score, intention, temps de lecture, indexation), alertes qualit\u00e9 avant publication.<\/li>\n<li><strong>Interface<\/strong> : design system unifi\u00e9, barre sup\u00e9rieure avec \u00e9tat de connexion, cr\u00e9dits, Search Console et IndexNow, navigation transversale, tableau de bord avec KPIs, d\u00e9tail du score, actions rapides et activit\u00e9s r\u00e9centes, assistant de d\u00e9marrage en 4 \u00e9tapes, r\u00e9glages par onglets, page d'aide avec statut syst\u00e8me.<\/li>\n<\/ul>\n\n<h4>1.1.79<\/h4>\n\n<ul>\n<li><strong>S\u00e9curit\u00e9 de l'agent IA<\/strong> : les coordonn\u00e9es bancaires ne sont plus envoy\u00e9es \u00e0 l'IA ni expos\u00e9es sans activation explicite, les remises cr\u00e9ent un coupon \u00e0 usage unique r\u00e9serv\u00e9 au client au lieu de modifier le prix r\u00e9el, coupons et remises d\u00e9sactiv\u00e9s par d\u00e9faut, limitation de d\u00e9bit par empreinte client et globale, jeton anti-abus sur l'endpoint public, conversations li\u00e9es au visiteur (plus de reprise d'une conversation tierce), produits non publi\u00e9s invisibles, email admin retir\u00e9 des pages, leads stock\u00e9s + export\/effacement RGPD, mention de confidentialit\u00e9 dans le widget, widget absent du panier\/checkout\/compte.<\/li>\n<li><strong>S\u00e9curit\u00e9 des donn\u00e9es catalogue<\/strong> : plus aucun for\u00e7age de stock \u00e0 l'optimisation, sauvegardes unifi\u00e9es (titre, nom, descriptions, meta SEO, alt d'images) restaurables depuis la liste produits et cat\u00e9gories, jamais d'\u00e9crasement par une valeur vide, renommage des cat\u00e9gories en option, choix des champs \u00e0 r\u00e9\u00e9crire et respect des meta SEO existantes.<\/li>\n<li><strong>Bulk produits\/cat\u00e9gories<\/strong> : verrou anti-doublon, budget de temps, reprise idempotente, items en \u00e9chec signal\u00e9s au lieu de bloquer le job, cron actif uniquement pendant un job.<\/li>\n<li><strong>Search Console<\/strong> : IndexNow asynchrone (plus jamais de publication bloqu\u00e9e), s\u00e9lecteur de propri\u00e9t\u00e9 r\u00e9tabli, canonical r\u00e9versible et liste des canonicals actives (Yoast, Rank Math, AIOSEO, SEOPress), d\u00e9tails par page (requ\u00eates top 10 \/ striking distance), export CSV des opportunit\u00e9s et de l'indexation, vue \u00ab pages en d\u00e9clin \u00bb avec r\u00e9-optimisation en un clic, corrections OAuth (state), sous-r\u00e9pertoires, llms.txt en cache sans email.<\/li>\n<li><strong>Maillage interne<\/strong> : injection s\u00fbre (jamais dans une balise, un shortcode, un bloc ou un titre), orphelins r\u00e9els (archives, menus, ventes crois\u00e9es compt\u00e9s), plafonds respect\u00e9s dans toutes les passes, plans d\u00e9terministes, meta box de suggestions dans l'\u00e9diteur, auto-link \u00e0 la publication (option), rapport d'ancres avec alerte de sur-optimisation, revert permanent et retrait de tous les liens Essiow, plus de r\u00e9visions ni de dates modifi\u00e9es en masse.<\/li>\n<li><strong>Blog<\/strong> : planification de publication (date et heure).<\/li>\n<li><strong>Connexion et r\u00e9glages<\/strong> : d\u00e9connexion et rotation de cl\u00e9 enfin effectives, cl\u00e9 test\u00e9e avant enregistrement, r\u00e9glages r\u00e9serv\u00e9s aux administrateurs, valeurs valid\u00e9es, journal des erreurs API, tableau de bord avec d\u00e9tail du score et checklist de lancement, nouvelles options (champs optimis\u00e9s, IndexNow \u00e0 la mise \u00e0 jour, restauration des originaux \u00e0 la d\u00e9sinstallation, multisite).<\/li>\n<li><strong>Cycle de vie<\/strong> : tous les crons sont retir\u00e9s \u00e0 la d\u00e9sactivation, d\u00e9sinstallation propre avec restauration optionnelle des contenus d'origine.<\/li>\n<li>Nettoyage : une vingtaine d'endpoints morts supprim\u00e9s, requ\u00eates <code>ORDER BY RAND()<\/code> retir\u00e9es, pagination des cat\u00e9gories, cha\u00eenes dupliqu\u00e9es et non traduites corrig\u00e9es.<\/li>\n<\/ul>\n\n<h4>1.1.78<\/h4>\n\n<ul>\n<li><strong>Articles ultra-optimis\u00e9s SEO \u2014 recherche avant r\u00e9daction<\/strong> : avant de g\u00e9n\u00e9rer, Essiow interroge Google (People Also Ask, recherches associ\u00e9es, pages qui rankent, sous-titres des 3 meilleurs concurrents, longueur moyenne) et des sources externes autoritaires R\u00c9ELLES. L'IA r\u00e9pond \u00e0 chaque question PAA, couvre tous les sous-th\u00e8mes des concurrents et ne peut citer que des URLs v\u00e9rifi\u00e9es. Bouton \u00ab Recherche SEO \u00bb sur la page Blog pour voir le dossier avant de lancer.<\/li>\n<li><strong>R\u00e9ponse directe en premier paragraphe<\/strong> (40-60 mots, featured snippet \/ AI Overviews), chaque H2 ouvre sur la r\u00e9ponse, tableaux comparatifs, \u00e9tapes num\u00e9rot\u00e9es, points \u00ab \u00c0 retenir \u00bb, sommaire cliquable (ancres H2 conserv\u00e9es dans Gutenberg), FAQ normalis\u00e9e, section \u00ab Sources \u00bb.<\/li>\n<li><strong>Score SEO \/100 et checklist<\/strong> renvoy\u00e9s pour chaque article (mots, mot-cl\u00e9 dans titre\/intro\/H2\/meta, longueurs meta, H2\/H3, images + alt, liens internes\/externes, FAQ). Affich\u00e9s dans l'onglet SEO avant publication et stock\u00e9s (<code>_essiow_seo_score<\/code>).<\/li>\n<li><strong>Liens invent\u00e9s supprim\u00e9s<\/strong> : toute URL absente du catalogue (produits, articles, cat\u00e9gories, sources autoris\u00e9es) est transform\u00e9e en texte \u2014 plus jamais de 404 publi\u00e9. Les liens externes re\u00e7oivent <code>rel=\"noopener\"<\/code> (+ <code>nofollow<\/code> hors sources autoritaires).<\/li>\n<li><strong>Slug SEO<\/strong> issu du mot-cl\u00e9 (<code>post_name<\/code>), <strong>FAQPage<\/strong> depuis les donn\u00e9es structur\u00e9es (plus de regex cass\u00e9e par les blocs Gutenberg), <strong>BreadcrumbList<\/strong>, <code>BlogPosting<\/code> enrichi (wordCount, timeRequired, articleSection) \u2014 et <strong>plus de doublon<\/strong> de sch\u00e9ma quand Yoast \/ Rank Math \/ AIOSEO sont actifs.<\/li>\n<li><strong>Meta title \/ description \/ OG \/ Twitter rendus par Essiow<\/strong> quand aucun plugin SEO n'est install\u00e9 ; support SEOPress ajout\u00e9 ; le focus keyword est toujours \u00e9crit (bug de l'ancien early-return).<\/li>\n<li><strong>Maillage inverse automatique<\/strong> : \u00e0 la publication, 3 articles Essiow plus anciens et proches (tags \/ cat\u00e9gorie) re\u00e7oivent un lien \u00ab \u00c0 lire aussi \u00bb vers le nouveau \u2014 le nouvel article a des liens entrants d\u00e8s la premi\u00e8re minute (d\u00e9sactivable : option <code>essiow_auto_backlinks<\/code>).<\/li>\n<li><strong>Fixes<\/strong> : le champ \u00ab Titre (optionnel) \u00bb et la longueur sont enfin envoy\u00e9s \u00e0 l'API ; <code>$keywords<\/code> non d\u00e9fini \u00e0 la publication (focus keyword vide, exclusion GSC cass\u00e9e) ; auteur 0 en cron bulk ; score dashboard IndexNow lisait la mauvaise option ; la longueur \u00ab court \/ moyen \/ long \u00bb du bulk \u00e9tait ignor\u00e9e (2 500 mots forc\u00e9s).<\/li>\n<\/ul>\n\n<h4>1.1.77<\/h4>\n\n<ul>\n<li><strong>Parit\u00e9 compl\u00e8te bulk \u2194 individuel \u2014 contexte GSC ajout\u00e9 au worker bulk<\/strong> : c'\u00e9tait la derni\u00e8re diff\u00e9rence restante. La g\u00e9n\u00e9ration individuelle d'articles enrichissait son prompt avec les vraies queries Google Search Console matchant le keyword (28 derniers jours, agr\u00e9g\u00e9es par impressions), permettant \u00e0 l'IA de cibler ce que l'audience tape d\u00e9j\u00e0. Le bulk g\u00e9n\u00e9rait \"\u00e0 l'aveugle\". D\u00e9sormais : avant chaque g\u00e9n\u00e9ration bulk, le worker appelle <code>_build_gsc_context_for_article(site, item.keyword)<\/code> et injecte le r\u00e9sultat dans le prompt \u2014 exactement comme l'individuel.<\/li>\n<\/ul>\n\n<h4>1.1.76<\/h4>\n\n<ul>\n<li><strong>CAUSE RACINE TROUV\u00c9E \u2014 toutes les images bulk \u00e9taient bloqu\u00e9es par un filtre silencieux c\u00f4t\u00e9 backend<\/strong> : depuis 1.1.69, le plugin envoyait soigneusement le <code>wp_context<\/code> (produits avec image_id\/image_url, articles, cat\u00e9gories, pool d'images vedette) au backend Flask. Mais <code>BulkArticleService.create_job<\/code> reconstruisait le dict de configuration en ne retenant qu'une <strong>whitelist de cl\u00e9s<\/strong> (<code>tone<\/code>, <code>length<\/code>, <code>language<\/code>, <code>blog_id<\/code>, etc.) \u2014 <code>wp_context<\/code> n'\u00e9tait PAS dans la whitelist, donc <strong>silencieusement \u00e9limin\u00e9<\/strong>. Cons\u00e9quences en cascade :\n\n<ol>\n<li>Le worker Celery recevait <code>cfg.get('wp_context')<\/code> \u2192 <code>None<\/code> \u2192 <code>products = []<\/code>, <code>blog_posts = []<\/code>, <code>featured_image_pool = []<\/code><\/li>\n<li>L'IA recevait un prompt SANS produits \u2192 aucune <code>&lt;img&gt;<\/code> g\u00e9n\u00e9r\u00e9e (l'IA ne pouvait pas inventer des URLs valides)<\/li>\n<li>Pas de pool d'images vedette \u2192 pas d'image vedette attach\u00e9e au post<\/li>\n<li>Le sanitizer auto-injection ajout\u00e9 en 1.1.75 s'appuyait sur <code>article_data.products<\/code> (vide aussi) \u2192 ne pouvait rien injecter non plus<\/li>\n<li>Conclusion : tous les fixes images depuis 1.1.69 \u00e9taient <strong>bloqu\u00e9s en amont<\/strong>, c'est pour cela que les corrections successives ne donnaient rien visible.<\/li>\n<\/ol><\/li>\n<li><strong>Fix<\/strong> : ajout de <code>wp_context<\/code> et <code>site_url<\/code> dans la whitelist. Les NOUVEAUX jobs bulk recevront enfin le contexte produit complet, et toute la cha\u00eene d'images (g\u00e9n\u00e9ration IA + auto-injection sanitizer + image vedette via attachment_id) fonctionnera bout en bout.<\/li>\n<li><strong>Note<\/strong> : les jobs cr\u00e9\u00e9s AVANT 1.1.76 ont un <code>config<\/code> immuable en DB sans wp_context \u2014 relancer un nouveau bulk job pour b\u00e9n\u00e9ficier du fix.<\/li>\n<\/ul>\n\n<h4>1.1.75<\/h4>\n\n<ul>\n<li><strong>Fix d\u00e9finitif \u2014 images vedette + images inline dans les articles bulk<\/strong> :\n\n<ol>\n<li><strong>Featured image via attachment ID<\/strong> : avant, le plugin recevait une URL <code>https:\/\/site.com\/wp-content\/uploads\/2024\/10\/widget-1024x768.jpg<\/code> (taille <code>large<\/code>) et tentait <code>attachment_url_to_postid<\/code> \u2192 souvent \u00e9chec car cette fonction n'accepte que l'URL ORIGINALE sans suffixe <code>-WxH<\/code>. D\u00e9sormais le plugin envoie l'<code>image_id<\/code> directement dans <code>featured_image_pool<\/code> ; le worker stocke <code>featured_image_id<\/code> dans <code>generated_payload<\/code> ; le plugin attache via <code>set_post_thumbnail($post_id, $id)<\/code> \u2014 <strong>z\u00e9ro HTTP, indestructible<\/strong>.<\/li>\n<li><strong>Auto-injection des images inline<\/strong> : l'IA esquivait parfois les <code>&lt;img&gt;<\/code> m\u00eame quand on lui listait les produits dans le prompt. Le sanitizer compte maintenant les <code>&lt;img&gt;<\/code> valides apr\u00e8s g\u00e9n\u00e9ration. Si moins de 3, il injecte automatiquement les images des produits restants, plac\u00e9es apr\u00e8s les premi\u00e8res <code>&lt;h2&gt;<\/code>, wrapp\u00e9es dans des <code>&lt;a&gt;<\/code> vers la page produit pour le SEO. Le plugin re\u00e7oit un article qui a TOUJOURS au moins 3 images contextuelles, peu importe ce que l'IA a fait.<\/li>\n<li><strong>Prompt durci<\/strong> : section IMAGES d\u00e9plac\u00e9e en MANDATORY (non-n\u00e9gociable), exige 3-6 <code>&lt;img&gt;<\/code> minimum, format explicite avec wrap <code>&lt;a href=\"PRODUCT_URL\"&gt;<\/code> pour cumuler valeur SEO.<\/li>\n<\/ol><\/li>\n<li><strong>Fix HTTP 429 sur ping IndexNow<\/strong> : avant, un 429 (rate limit) cassait l'op\u00e9ration sans recovery. D\u00e9sormais le retry honore le header <code>Retry-After<\/code> quand IndexNow l'envoie, sinon backoff plus long. C\u00f4t\u00e9 UI, le toast affiche un message clair (\u00ab IndexNow rate-limited. Try again in a few minutes. \u00bb) au lieu d'un cryptique \u00ab HTTP 429 \u00bb.<\/li>\n<li><strong>Fix bouton \u00ab Indexer \u00bb qui ouvrait GSC dans une nouvelle fen\u00eatre<\/strong> : avant, apr\u00e8s IndexNow + sitemap submit, le plugin ouvrait automatiquement Google Search Console sur la page d'inspection de l'URL \u2014 Google affichait son texte par d\u00e9faut \u00ab URL is not on Google. Couldn't fetch it... \u00bb et l'utilisateur croyait \u00e0 un \u00e9chec de l'indexation. D\u00e9sormais aucune ouverture automatique ; le toast affiche un r\u00e9cap clair des \u00e9tapes effectu\u00e9es (\u00ab \u2713 IndexNow \u00b7 Sitemap re-submitted \u00b7 Indexation status refreshed \u00bb). L'URL GSC reste accessible si besoin via <code>data-hint-url<\/code> sur le bouton (extensible plus tard pour une UI d\u00e9di\u00e9e).<\/li>\n<li><strong>R\u00e9cap d'\u00e9tapes d\u00e9taill\u00e9<\/strong> dans <code>ajax_request_indexing<\/code> : chaque sous-action (IndexNow, sitemap, inspection cache) renvoie son statut individuel. Les \u00e9checs partiels sont annonc\u00e9s (<code>\u26a0 IndexNow rate-limited<\/code>) sans planter l'op\u00e9ration globale.<\/li>\n<\/ul>\n\n<h4>1.1.74<\/h4>\n\n<ul>\n<li><strong>Audit de v\u00e9rification 1.1.73<\/strong> : aucun handler legacy orphelin, lock transient correct, idempotence du pull garantie, sanitizer appel\u00e9 avant le d\u00e9bit cr\u00e9dit. 1 seul vrai bug remont\u00e9, corrig\u00e9 ici.<\/li>\n<li><strong>Fix critique \u2014 page-close n'annule plus le job<\/strong> : avant 1.1.74, le <code>cancelAllBulksOnUnload<\/code> annulait toujours les bulks au refresh \/ fermeture d'onglet via <code>navigator.sendBeacon<\/code>, ce qui \u00e9tait directement contraire \u00e0 l'architecture jobs-serveur d\u00e9ploy\u00e9e en 1.1.72-73 (\u00ab rien ne s'arr\u00eate quand l'utilisateur ferme \u00bb). Le handler a \u00e9t\u00e9 neutralis\u00e9 : les jobs continuent c\u00f4t\u00e9 serveur, le polling reprend automatiquement au rechargement.<\/li>\n<li><strong>Fix sites HTTP + installs en sous-r\u00e9pertoire<\/strong> : le sanitizer c\u00f4t\u00e9 Flask reconstruisait <code>https:\/\/{domain}<\/code> en ignorant le protocole et le subpath r\u00e9els (info perdue c\u00f4t\u00e9 serveur). Les sites en HTTP ou dans <code>\/shop\/<\/code> voyaient tous leurs liens internes strip\u00e9s. D\u00e9sormais le plugin envoie son <code>site_url<\/code> complet (via <code>home_url('\/')<\/code>) dans le wp_context et dans le payload de <code>\/optimize\/article<\/code> \u2014 le sanitizer l'utilise comme base de r\u00e9solution.<\/li>\n<li><strong>IndexNow retry exponentiel<\/strong> : avant, un seul shot avec timeout 5s. Un blip r\u00e9seau ou un 503 transitoire perdait d\u00e9finitivement la soumission. D\u00e9sormais : jusqu'\u00e0 3 tentatives avec backoff 0s \/ 1s \/ 3s. Les 4xx (cl\u00e9 \/ URLs invalides) court-circuitent \u2014 pas de retry sur erreurs d\u00e9terministes. Timeout port\u00e9 \u00e0 10s. Le log historique inclut maintenant <code>attempts<\/code> et <code>error<\/code> pour audit.<\/li>\n<li><strong>Cleanup auto des cannibalisations dismissed\/resolved obsol\u00e8tes<\/strong> : \u00e0 chaque chargement de la page Search Console, on compare les cl\u00e9s stock\u00e9es en options WP avec les paires (query|primary|secondary) actuellement pr\u00e9sentes dans les donn\u00e9es GSC live. Toute cl\u00e9 absente du live \u2192 entr\u00e9e stale \u2192 supprim\u00e9e. \u00c9vite l'accumulation ind\u00e9finie (plusieurs centaines par an sur sites actifs).<\/li>\n<li><strong>Helper <code>apiError(xhr, defaultMsg)<\/code> c\u00f4t\u00e9 JS<\/strong> : les erreurs AJAX \u00e9taient toutes affich\u00e9es comme <code>'Network error'<\/code> quelle que soit la cause. D\u00e9sormais d\u00e9tection automatique via le code HTTP et <code>responseJSON.data.code<\/code> :\n\n<ul>\n<li>Status 0 \u2192 \u00ab Cannot reach the server. Check your internet connection. \u00bb<\/li>\n<li>401\/403 ou code <code>invalid_api_key<\/code> \u2192 \u00ab API key invalid or expired. Reconfigure in Settings. \u00bb<\/li>\n<li>402 ou code <code>insufficient_credits<\/code> \u2192 \u00ab Plan ran out of credits. Upgrade in Settings. \u00bb<\/li>\n<li>429 ou code <code>rate_limited<\/code> \u2192 \u00ab Too many requests. Try again in a minute. \u00bb<\/li>\n<li>503\/504 ou code <code>overloaded<\/code> \u2192 \u00ab Server overloaded. Try again in 30 seconds. \u00bb<\/li>\n<li>5xx \u2192 \u00ab Server error. Try again or contact support. \u00bb<\/li>\n<\/ul><\/li>\n<li><strong>i18n<\/strong> : 7 nouvelles strings traduisibles (err_network, err_auth, err_no_credits, err_rate_limit, err_overloaded, err_server, no_urls_selected, sync_ok, rows, property_set, rechecked, pinged) + \u00e9limination des strings hardcod\u00e9es (fran\u00e7ais durci <code>'Serveur surcharg\u00e9 \u00b7 r\u00e9essayez dans 30s'<\/code>, anglais durci <code>'No URLs selected'<\/code>, <code>'Pinged'<\/code>, <code>'Re-checked'<\/code>, etc.).<\/li>\n<\/ul>\n\n<h4>1.1.73<\/h4>\n\n<ul>\n<li><strong>Audit complet du plugin + backend<\/strong> \u2014 4 axes audit\u00e9s en parall\u00e8le (bulk produits\/cat\u00e9gories, g\u00e9n\u00e9ration articles, Search Console, UX). 14 bugs et am\u00e9liorations livr\u00e9s en une release.<\/li>\n<li><strong>Phase 2 wir\u00e9e sur l'UI<\/strong> : les boutons \u00ab Optimiser s\u00e9lection \u00bb des pages Produits et Cat\u00e9gories utilisent d\u00e9sormais le nouveau syst\u00e8me jobs serveur (<code>essiow_bulk_opt_create<\/code>). Concr\u00e8tement : vous lancez, vous pouvez fermer l'onglet, vous revenez 1 heure plus tard \u2014 le job a continu\u00e9 c\u00f4t\u00e9 serveur, le WP-Cron a appliqu\u00e9 les optimisations au fur et \u00e0 mesure, et l'UI affiche l'\u00e9tat final.<\/li>\n<li><strong>Auto-resume au chargement de la page<\/strong> : si un job \u00e9tait en cours quand vous avez quitt\u00e9, l'UI red\u00e9marre automatiquement le polling et affiche la progression (via <code>sessionStorage<\/code> c\u00f4t\u00e9 navigateur).<\/li>\n<li><strong>Sanitizer HTML appliqu\u00e9 aussi \u00e0 la g\u00e9n\u00e9ration individuelle<\/strong> (<code>\/optimize\/article<\/code>) : avant 1.1.73, le post-processing des images placeholder et liens relatifs ne tournait que sur le bulk. Les articles g\u00e9n\u00e9r\u00e9s un par un h\u00e9ritaient des m\u00eames bugs. Maintenant la m\u00eame protection s'applique partout \u2014 <code>&lt;img src=\"IMAGE_URL\"&gt;<\/code> \u2192 strip ou fallback, <code>&lt;a href=\"produit\/x\"&gt;<\/code> relatif \u2192 URL absolue canonique, sinon unwrap.<\/li>\n<li><strong>Race condition sync-pull + WP-Cron pull supprim\u00e9e<\/strong> : un transient lock par job (<code>essiow_bulk_pull_lock_{id}<\/code>) emp\u00eache les deux processus de pull les m\u00eames items simultan\u00e9ment et d'appeler <code>wp_insert_post<\/code> deux fois \u2192 plus de duplicates c\u00f4t\u00e9 WP.<\/li>\n<li><strong>Idempotence du pull renforc\u00e9e<\/strong> : chaque post WP est marqu\u00e9 <code>_essiow_bulk_item_id<\/code>. Si Flask renvoie le m\u00eame item apr\u00e8s un retry, on d\u00e9tecte le post existant et on re-confirme \u00e0 Flask au lieu d'ins\u00e9rer un duplicate.<\/li>\n<li><strong>Subdirectory install support\u00e9<\/strong> dans <code>resolve_url_to_local<\/code> : si WordPress est install\u00e9 dans <code>\/wp\/<\/code> (ou autre sous-r\u00e9pertoire), GSC renvoie l'URL avec le pr\u00e9fixe subdir, mais <code>url_to_postid()<\/code> attend le path relatif. Le r\u00e9solveur retire maintenant le pr\u00e9fixe et retente.<\/li>\n<li><strong>Cleanup hourly des state tokens OAuth Google expir\u00e9s<\/strong> (Celery beat) \u2014 sans ce nettoyage, la table <code>gsc_oauth_states<\/code> accumulait une ligne par d\u00e9marrage de flow OAuth, m\u00eame ceux abandonn\u00e9s en route.<\/li>\n<li><strong>Confirms actionnables<\/strong>  &hellip;<\/li>\n<\/ul>","raw_excerpt":"Get more Google traffic on WooCommerce. AI rewrites your products, categories and articles using your real Google Search Console data \u2014 and pings ever &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/294906","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pl.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pl.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=294906"}],"author":[{"embeddable":true,"href":"https:\/\/pl.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/boni58"}],"wp:attachment":[{"href":"https:\/\/pl.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=294906"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=294906"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=294906"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=294906"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=294906"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=294906"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}