Title: Essiow — AI SEO Suite for WooCommerce
Author: boni58
Published: <strong>એપ્રિલ 11, 2026</strong>
Last modified: મે 8, 2026

---

પ્લગીન શોધો

![](https://ps.w.org/essiow/assets/banner-772x250.png?rev=3503791)

![](https://ps.w.org/essiow/assets/icon-256x256.png?rev=3503791)

# Essiow — AI SEO Suite for WooCommerce

 [boni58](https://profiles.wordpress.org/boni58/) દ્વારા

[ડાઉનલોડ](https://downloads.wordpress.org/plugin/essiow.1.1.58.zip)

 * [વિગતો](https://gu.wordpress.org/plugins/essiow/#description)
 * [સમીક્ષાઓ](https://gu.wordpress.org/plugins/essiow/#reviews)
 *  [સ્થાપન](https://gu.wordpress.org/plugins/essiow/#installation)
 * [ડેવલપમેન્ટ](https://gu.wordpress.org/plugins/essiow/#developers)

 [સપોર્ટ](https://wordpress.org/support/plugin/essiow/)

## વર્ણન

**Essiow turns your WooCommerce store into a search-traffic machine.** 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.

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.

#### What Essiow does for you

**1. Auto-rewrites your product pages.** Long description, short pitch, meta title,
meta description, focus keyword, image alt texts — 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.

**2. Turns empty category pages into landing pages.** 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 — the page Google needs to rank you in position
1 instead of position 30.

**3. Writes blog articles that pull traffic to your products.** 1,500-5,000 word
articles with internal links to the products mentioned, FAQ schema, automatic featured
image. Suggestions based on what your audience already searches.

**4. Spots and grabs every “almost-ranking” keyword.** When Google Search Console
is connected, Essiow surfaces every query where your store sits at position 11-20—
the closest gains. One click rewrites the matching page targeting that exact query.

**5. Resolves cannibalization in two clicks.** Two of your pages competing for the
same query? Essiow detects it, picks the strongest one, and consolidates the canonical
from the others — without deleting anything.

**6. Indexes everything instantly.** Bing, Yandex, Naver, Seznam are pinged the 
second you publish. Google gets the URL pushed via sitemap re-submit + URL Inspection
refresh + a one-click manual indexation request.

**7. Builds your internal mesh in a graph view.** See orphan pages (no incoming 
links), dead-ends (no outgoing), and connect any two pages with a drag — Essiow 
injects reciprocal anchor links on the strongest shared keyword. A live mesh score/
100 tells you how healthy your site structure is.

**8. AI sales agent on your storefront.** A chatbot that knows your full catalog,
handles objections, can issue promo codes within your discount limit, and quotes
your delivery / returns / payment policy.

**9. Exposes your catalog to ChatGPT, Perplexity and Claude.** Toggle on and Essiow
serves a clean `/llms.txt` at your root — the standard AI search engines read to
find products to recommend.

#### Why it ranks better

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—
it gets them from Google itself, and writes around what’s already working.

#### Made for shop owners, not SEOs

 * No keyword research needed
 * No technical setup beyond pasting an API key
 * Every action shows its credit cost upfront — no surprise billing
 * Bulk optimize, pause, resume, restore original — your content is always recoverable
 * 8 languages, 4 writing tones, 3 content lengths

#### Compatible & safe

 * WooCommerce HPOS compatible
 * Works alongside Yoast SEO / Rank Math / All in One SEO (writes to all three)
 * GDPR compliant (auto-delete chat data after 90 days)
 * Original content backed up the first time you optimize — one-click restore

#### How credits work

 * **1 credit** per product optimization
 * **1 credit** per category optimization
 * **3 credits** per blog article
 * **2 credits** per AI Vision alt text generation
 * All indexation actions, audits, internal-link suggestions, mesh-score, /llms.
   txt — **free** (no AI involved)
 * Credits are debited only on success. Failed AI calls don’t consume credits.
 * Purchased credits never expire (free trial credits expire after 30 days)

#### External Service

This plugin connects to the Essiow API at `https://essiow.com/api/v1` 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.

 * [Essiow Terms of Service](https://essiow.com/terms)
 * [Essiow Privacy Policy](https://essiow.com/privacy)

## સ્થાપન

 1. Upload the `essiow` folder to `/wp-content/plugins/`
 2. Activate the plugin through the ‘Plugins’ menu in WordPress
 3. Go to **Essiow > Settings** and enter your API key from [essiow.com](https://essiow.com)
 4. Click “Test Connection” to verify
 5. Start optimizing from **Essiow > Products** or **Essiow > Categories**

## એફએક્યુ (FAQ)

### Do I need an Essiow account?

Yes. Create a free account at [essiow.com](https://essiow.com) to get your API key
and 10 free credits.

### Do I need technical skills?

No. If you can install a WordPress plugin, you can use Essiow. Everything is done
in a few clicks.

### Do I need to know SEO?

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”.

### Why does connecting Google Search Console matter?

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 — but generic. With GSC, they’re surgical.

### Will optimizing break my existing content?

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.

### Which SEO plugins are supported?

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.

### Is my data safe?

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.

### Do credits expire?

Purchased credits never expire. The 10 free credits expire after 30 days.

### Can I cancel a bulk optimization?

Yes. Pause / Resume / Cancel buttons appear during a bulk run. Closing the tab also
auto-cancels — items already processed remain saved.

### Can I try before buying?

Yes. Create a free account and get 10 credits to test all features. No credit card
required.

## સમીક્ષાઓ

આ પ્લગઇન માટે કોઈ સમીક્ષાઓ નથી.

## ફાળો આપનાર & ડેવલપર્સ

આ ઓપન સોર્સ સોફ્ટવેર છે. નીચેના લોકો એ આ પ્લગિન માટે ફાળો આપ્યો છે.

ફાળો આપનારા

 *   [ boni58 ](https://profiles.wordpress.org/boni58/)

[“Essiow — AI SEO Suite for WooCommerce” ને તમારી ભાષામાં અનુવાદ કરો.](https://translate.wordpress.org/projects/wp-plugins/essiow)

### વિકાસમાં રસ ધરાવો છો?

[કોડ બ્રાઉઝ કરો](https://plugins.trac.wordpress.org/browser/essiow/), જોવો[અસ્વીએન રેપોઝિટરીમાંથી](https://plugins.svn.wordpress.org/essiow/),
અથવા સબ્સ્ક્રાઇબ કરો[ડેવલપમેન્ટ](https://plugins.trac.wordpress.org/log/essiow/)
દ્વારા[આરઅસઅસ](https://plugins.trac.wordpress.org/log/essiow/?limit=100&mode=stop_on_copy&format=rss).

## ચેન્જલૉગ

#### 1.1.58

 * **Fix critical**: Automesh stuck on “0 / undefined pages processed” on shared/
   low-spec hosts (EazyWP, Hostinger, low-tier OVH, etc).
 * Two combined root causes :
    1. **Truncated AJAX response** from `ajax_automesh_start` : on a 1000+ page site,
       computing the plan takes 30-60s. PHP’s default `max_execution_time` (30s) on
       shared hosting truncates the JSON response mid-write. The plugin received a 
       partial response with `success:true` but `total` undefined  `0 / undefined` 
       displayed.
    2. **WP-Cron broken / disabled** : many shared hosts disable `DISABLE_WP_CRON` 
       without setting up a real cron, or block loopback HTTP (used by `spawn_cron()`).
       The worker `cron_automesh_run` was scheduled but never executed  0 pages processed
       indefinitely.
 * Fix 1 (server-side hardening) : `ajax_automesh_start` now wraps the plan computation
   in `try/catch`, sets `set_time_limit(300)`, raises memory via `wp_raise_memory_limit('
   admin')`, and returns a clean error with detail if it crashes — instead of a 
   truncated 200 response.
 * Fix 2 (worker stall detection + sync fallback) : `ajax_automesh_status` now detects
   when a task has been pending/running for 20s+ without any tick. When stalled,
   it (a) re-schedules the WP-Cron event and (b) **executes ONE batch synchronously**
   in the status request itself — using the user’s browser as the cron engine. The
   polling continues to drive progress. No more silent stalls.
 * Fix 3 (JS defensive) : the progress modal handles `total = 0/undefined/NaN` by
   showing `…` until the first status poll. Stall detection client-side after 60s
   shows a hint to the user. AJAX timeout extended to 120s for large-site planning.
 * Fix 4 (resume-on-reload safety) : if the user resumes an existing task, the response
   now includes the original `total` (was missing before, which caused the same “
   undefined” bug on tab reload).

#### 1.1.57

 * **Fix**: Search Console Overview tab stuck on `Clicks: 0 / Impressions: 0` even
   after a successful sync. The auto-sync trigger logic was buggy.
 * Root cause: the auto-sync only fired when BOTH KPIs and indexation were empty.
   If indexation was already populated (by an earlier cron, manual sync, or background
   job), the condition `!hasIndex && !hasKpis` evaluated to `false` and the sync
   never ran — leaving the analytics KPIs forever at 0 even though the database 
   had no analytics rows.
 * Fix: auto-sync now triggers based on KPIs alone (`!hasKpis`). Indexation status
   is independent of analytics rows — they come from different backend tables and
   pipelines, so we can’t infer one from the other. Now any user with empty analytics
   gets an automatic sync on first page load.

#### 1.1.56

 * **Fix**: “Could not resolve secondary URL to a local page” when clicking “Set
   canonical” in the Cannibalization tab. The resolver was relying solely on `url_to_postid()`,
   which silently fails for the WooCommerce Shop page (`/boutique/`, `/shop/`, etc.),
   the front page (`/`), and pages with custom permalinks.
 * New centralized helper `resolve_url_to_local()` with cascading fallbacks: native`
   url_to_postid`  front page  blog page  WooCommerce Shop/Cart/Checkout/My-Account/
   Terms via `wc_get_page_id()`  `get_page_by_path()` for slug lookup  `/product-
   category/<slug>/`, `/category/<slug>/`, `/tag/<slug>/` for terms. Now correctly
   resolves `/boutique/`  Shop page ID, `/`  front page ID, etc.
 * Used by `set_canonical`, `set_canonical_bulk`, and `resolve_url_to_entity` (Indexation
   tab). The cannibalization “Set canonical” button now works for the homepage and
   the Shop page, which are the two most common cases of cannibalization on a WooCommerce
   store.

#### 1.1.55

 * **Fix critical** : after reconnecting Google Search Console, the Overview tab
   stayed stuck on “Processing…” with empty KPIs (—) even though the server was 
   correctly syncing thousands of rows in the background.
 * Root cause: **cache poisoning** in the Search Console overview cache. The cache
   key included the period (`essiow_gsc_overview_cache_28`, `_90`, etc.), but the
   invalidation only deleted the unsuffixed key (`essiow_gsc_overview_cache`). On
   reconnect, the first overview fetch returned KPIs at 0 (sync not finished yet)
   and got cached for 1 hour — every subsequent fetch served the empty cache, never
   updating despite the data arriving in the database.
 * Fix 1: new `invalidate_overview_cache()` helper that deletes ALL period-suffixed
   cache keys (`_1`, `_7`, `_28`, `_90`, `_180`, `_365`, `_480`). Called by all 
   4 places that previously did the broken single-key delete: `ajax_disconnect`,`
   ajax_sync`, `ajax_select_property`, `cron_nightly_sync`.
 * Fix 2: JS `loadScOverview()` now accepts a `force` flag that bypasses the PHP
   cache. Used after the auto-sync triggered when KPIs are detected as empty, and
   after the manual “Refresh stats now” button — guarantees the post-sync fetch 
   always sees fresh data, never the old cached zeros.

#### 1.1.54

 * **Fix definitively**: the GSC quota toast that kept appearing during Product /
   Category optimizations is now suppressed outside the Search Console tab.
 * Root cause analysis: the auto-inspection background batch (50 URLs) re-fired 
   on every table re-render after an optimization, hit the exhausted Google quota,
   and showed the toast — even though the user wasn’t on the indexation tab. The
   1-hour server cooldown was only set if **100%** of the batch errored; in practice
   GSC often returns 49 errors + 1 success, leaving the cooldown unset and the next
   run re-triggering the toast.
 * Fix 1: **Toast confined to Search Console tab**. The auto-inspection still runs
   in background to populate badges, but the error toast only appears when `essiow.
   current_page === 'essiow-search-console'`. On Products / Categories pages, the
   cooldown is silently applied without the toast.
 * Fix 2: **Cooldown threshold lowered to ≥50% errors**. Catches the realistic case(
   49/50 errors) — previously needed exactly 100%.
 * Fix 3: **Cooldown duration extended to 6h** (vs 1h). Google’s quota resets daily;
   a 1-hour cooldown was too short and caused the toast to come back after 1 hour
   of work.
 * Fix 4: **Cooldown propagated immediately in the AJAX response** (`quota_cooldown:
   true, cooldown_until: ts`). The JS applies it without waiting for a page reload,
   so any subsequent inspection batch in the same session is short-circuited.

#### 1.1.53

 * **Major Graph view rewrite**. Visual link graph now shows the actual edges (lines)
   connecting pages — previously you saw nodes but no relationships.
 * New: **Persistent edges** drawn as SVG lines between every pair of internally-
   linked pages. Subdued gray when idle, bold blue when a node is focused. Auto-
   redraws on pan/zoom. Capped at 1500 visible non-focus edges to keep large graphs(
   1000+ pages) responsive.
 * New: **Click an edge to delete it**. Wide invisible hitbox (10px) makes 1px lines
   easy to click. Confirmation prompt, then the `<a>` wrapping is removed from the
   source page (anchor text preserved).
 * New: **Permanently visible drag handle (🔗)**. Top-right of every node, opacity
   0.55 by default, fully visible on hover or focus. Drag it onto another node to
   create a reciprocal link.
 * New: **Click a node to focus it**. Highlights all its edges in blue, shows a 
   status panel with title, URL, edit link, in/out counts and instructions. Re-click
   to defocus.
 * New: **Type filters** (Products / Categories / Articles checkboxes) hide entire
   types — useful on big sites to inspect just the category-product mesh.
 * New: **Toggle labels**. When zoomed-out on dense graphs, you can hide titles 
   and keep only colored dots — much more readable.
 * New: **Reorganize button** (🌀). Resets every node position to a fresh Vogel-
   spiral layout (golden-angle distribution = no visual rays). Preserved manually-
   dragged positions are wiped.
 * New: **Visible legend** under the toolbar : 🔴 orphan / 🟢 hub / ⚪ normal + 
   interaction help.
 * New backend AJAX endpoint: `essiow_il_unlink_pair` (action). Removes `<a href
   ="target">…</a>` wrappers from a source page’s content, keeping the anchor text
   intact. Direction can be `a_to_b`, `b_to_a` or `both`. Used by the click-edge-
   to-delete flow.
 * New: graph cache now exposes a flat `edges` array `[{from, to}, …]` (was previously
   dropped before caching). Allows the frontend to render the full mesh.

#### 1.1.52

 * Polish: rescue caps raised after real-world data (1.1.51 reduced orphans from
   380 to 39 on a 1156-page store, score 87  99/100). PASSE 0 cap raised from 8 
   to 12 (per-source orphan absorption), PASSE B cap raised to 15 (final safety 
   net).
 * New: **PASSE B² — last resort**. If after PASSE 0 + PASSE B + main loop an orphan
   is STILL not covered (its entire fallback chain is saturated at 15), the orphan
   is forced onto the most active category of the site with NO cap. A category with
   30 outgoing links is preferable to a permanent orphan. Closes the last 3% of 
   edge cases.

#### 1.1.51

 * **Major rewrite of the automesh algorithm** based on a full audit. After 1.1.50,
   orphans were still surviving because of multiple subtle bugs identified in the
   chain.
 * New: **PASSE Z — dead-end coverage**. Every page with no outgoing link is now
   FORCED to receive at least 1 outgoing target before the run ends, even if its
   semantic match is zero (last-resort: top active categories). Combined with PASSE
   0 (orphan rescue first) and PASSE B (filet sécurité orphelines via chain), the
   algorithm now guarantees ≥1 incoming AND ≥1 outgoing for every page after a single
   run.
 * Fix critical: **silent injection failures**. Previously, when `_inject_at_smart_position`
   returned `changed:false` (anchor not found in source content, anchor inside an
   existing `<a>`, anchor inside an HTML tag), the link was abandoned silently —
   meaning a planned rescue could fail without any retry. Now we fall back to the“
   Voir aussi” inline injection mode, which is guaranteed to succeed. Every planned
   target now becomes a real link.
 * Fix: **double-counting of orphans_resolved and deadends_resolved**. Previously
   these counters were incremented in multiple passes (PASSE 0 + PASSE B + final
   loop). Now they are computed exactly ONCE at the end via `will_receive_incoming`/`
   will_emit_outgoing` sets.
 * Fix: **anchor registry pollution**. `semantic_append` was being recorded as a
   phantom 4th key in the anchor type ratios, breaking the 10/35/55 diversity calculation.
   Now mapped to `semantic` for registry purposes.
 * Fix: **PASSE B redundancy resolved**. PASSE B used a single-source picker (`_pick_rescue_source`)
   inconsistent with PASSE 0’s chain. Both now use the same multi-source chain with
   a relaxed cap (+2) — orphans abandoned in PASSE 0 get a second chance via the
   same logic, not a different one.

#### 1.1.50

 * **Fix critical** : the orphan rescue PASS 0 (introduced in 1.1.49) was being **
   silently overwritten** by the main planning loop. When a category was used as
   a rescue source for orphan products, its `per_page` entry was created with the
   rescue targets — then the main loop re-assigned `$per_page[$sig] = [...]` with
   its own MUST/SHOULD candidates, **erasing every rescue**. This explained why 
   1.1.49 only resolved -9 orphans instead of -300+. Now the main loop merges with
   existing rescue targets, respects remaining quota slots, and skips already-rescued
   sigs to avoid duplicates.
 * Fix: pages already saturated (8+ existing internal links) are no longer skipped
   if they have rescue targets planned — the no-orphan guarantee bypasses the saturation
   skip.
 * Fix: deadends counter no longer over-counts (only increments when actual targets
   are merged into the plan).

#### 1.1.49

 * Fix: **Orphan rescue now runs FIRST**, before the main planning loop. Previously
   the rescue pass executed after categories had already filled their 5 MUST/SHOULD
   slots, leaving only 2 rescue slots per source — so a single click resolved barely
   8% of orphans. Reordered: orphans get priority allocation with a per-source cap
   of 8, the main plan runs second.
 * New: **Multi-source fallback chain** for orphan rescue. Each orphan now has an
   ordered list of candidate sources (parent category  sibling categories  topical
   articles  top 3 most active categories  product hubs). If one source is saturated,
   the chain tries the next one — guaranteeing every orphan finds a free slot somewhere.
   Replaces the previous single-source picker that gave up on the first saturation.
 * Improvement: rescue cap raised from 7 to 8 targets per source, dedicated to orphan
   resolution exclusively (the main plan still respects the 5-per-page rule for 
   non-orphan links).

#### 1.1.48

 * New: **No-orphan-left-behind** pass at the end of every automesh run. Any orphan
   that wasn’t covered by the main planning is automatically rescued — its parent
   category (for products), nearest sibling (for categories), or the most active
   category (last resort) is forced to add a link to it. Combined with relaxed quotas(
   +2 above the 5-per-page cap when needed), the run guarantees ZERO orphans remain
   after a single click.
 * Fix: **Category MUST targets prioritized for orphans first**. The previous algorithm
   sorted potential MUST products by their existing incoming-link count descending—
   which meant orphan products (in=0) were ALWAYS at the bottom and never picked.
   Categories now boost orphans (+10 000 points) before sorting by title similarity.
   Single-handedly resolves the majority of orphans in 1 run.
 * New: **Relaxed-threshold fallback pass** for pages with no semantic match. If
   the strict Jaccard threshold (0.10) returns zero candidates, we relax to 0.03
   and pick the closest category, article and product. Last resort = the most active
   category of the site (proxy for homepage). Guarantees at least 1 outgoing link
   for every page.
 * Improvement: per-target incoming cap (30 new links/run) still enforced, but the
   orphan rescue pass bypasses the per-page-output cap by up to 2 extra links — 
   the no-orphan guarantee takes priority over the conservative 5-per-page rule.

#### 1.1.47

 * Fix: **GSC quota toast no longer appears when running a product/category optimization**.
   The auto-inspection batch was firing on every page re-render, hitting the exhausted
   quota repeatedly. Now : runs once per session per page, stops trying after the
   first full quota hit, and the toast wording clarifies it is only about indexation
   status (not optimization).
 * New (Automesh): **Anchor registry pre-loaded from existing content**. Before 
   run 1, Essiow scans every existing internal link on the site and tallies anchor
   types (exact / partial / semantic) per target. The diversity check therefore 
   works from the very first automesh — no risk of suddenly creating 50 exact-match
   anchors because the registry was empty.
 * New (Automesh): **Per-target incoming cap of 30 new links per run**. Prevents
   super-popular targets (a top category) from absorbing all the link juice in one
   go. Beyond 30 incoming planned, the algorithm picks the next priority target 
   instead. Avoids over-optimization patterns Google penalizes.
 * New (Automesh): **Backup persistence in wp_options**. The 6-hour transient expiry
   no longer prevents reverting a run. Backups are mirrored to `essiow_il_automesh_last_backups`
   option, so the Revert button still works months after.

#### 1.1.46

 * New: **🔮 One-button Automesh on the Internal Links  Graph tab**. The button 
   appears at the top of the graph and runs a complete topical-cluster mesh across
   the whole site in one click. No setting to configure.
 * The algorithm follows current Google + 2026 SEO best practices :
    - Hub-and-spoke hierarchy (products  category parent + 2 siblings + 1 article
      + 1 cross-cat ; categories  3 top products + 2 sibling cats ; articles  mentioned
      products + similar articles + 1 category)
    - Quota proportional to content length (1 link / 250 words), capped at 5 new
      links per page per run for predictability
    - Anchor diversity tracked globally with target ratios 10/35/55 (exact / partial/
      semantic) — beyond 15% exact for any single target, the algorithm switches
      to partial/semantic
    - Anchor placement in the FIRST third of content (Reasonable Surfer model)
    - 
 * New: **Preview before run** — a modal shows projected new links, orphans resolved,
   dead-ends resolved, mesh score before  after, average click depth before  after,
   estimated time. No surprise.
 * New: **Backup auto-created** for every modified page (post_meta `_essiow_il_backup_
   <hash>`) and one-click **Revert** button at the end + permanent option to revert
   the last run from the modal.
 * New: **Async cron worker** (batches of 20 pages) like the bulk optimize pattern.
   Quitting the page does not crash — the run continues server-side and the modal
   resumes when re-opening.
 * New: **Auto-refresh of graph + mesh score** at completion — no manual reload 
   needed.
 * New: **30+ FR strings translated** for the new automesh UI.

#### 1.1.45

 * Fix: **Indexation badges flickering back to “Erreur”** after a few seconds. The
   JS auto-inspection batch was overwriting the in-memory badge with “error” status
   returned by failed GSC calls (quota exhausted, API timeout). Now the JS keeps
   the previous valid badge when an inspection result has status=error — same logic
   as the server-side fix in 1.1.44. A discreet toast informs the user when the 
   GSC quota is exhausted instead of polluting the UI with red badges.

#### 1.1.44

 * Fix critical: **Front-end critical error on product pages** when one of the schema/
   canonical hooks raised an exception. All four wp_head emitters (Product schema,
   BreadcrumbList schema, Article schema, FAQ schema, custom canonical) are now 
   wrapped in try/catch — a bad page can no longer take down the entire front-end.
   Errors are logged via error_log() when WP_DEBUG is on, never propagated to the
   visitor.
 * Fix: defensive and guards before calling WC-only conditional functions in the
   schema emitters.
 * Fix: **Indexation column showing “Erreur” on every product**. When GSC URL Inspection
   fails (quota exceeded, timeout, transient API error), the per-URL result has .
   The plugin was overwriting the cached with this false status. Now we KEEP the
   previous valid status when the new fetch errored, only updating on real Google
   verdicts.
 * Migration: a one-time admin_init cleanup deletes any existing rows in postmeta
   + termmeta, so the next auto-inspection batch on Products / Categories pages 
   starts fresh.

#### 1.1.43

 * UX: **Site SEO score absorbed into the existing stats row.** No more separate
   full-width card with empty space — the score now sits as the first card in the
   same row as Available credits, Products optimized, Categories optimized, Articles
   by Essiow. Colored top border (green/yellow/red) keeps the level visible at a
   glance.

#### 1.1.42

 * UX: **Site SEO score card simplified** — removed the breakdown list and the descriptive
   paragraph. Only the score on 100 with its colored badge remains on the Dashboard.

#### 1.1.41

 * New: **Global site SEO score** on the Dashboard, computed locally on 100 points
   from 9 objective factors :
    - 20 pts — % of products optimized by Essiow
    - 15 pts — % of categories optimized
    - 10 pts — Essiow blog articles published (3 = max)
    - 15 pts — % of inspected URLs that Google has indexed
    - 15 pts — Internal mesh score (uses the existing graph cache)
    - 10 pts — JSON-LD schemas active
    - 5 pts — IndexNow auto-ping active
    - 5 pts — /llms.txt AEO toggle active
    - 5 pts — Search Console connected
       Big colored card (green ≥ 70 / yellow ≥ 
      40 / red < 40) + breakdown of every factor with its earned points / max. Recomputed
      on every Dashboard load — no API call, all data already on the site.
 * Fix: **Indexation table labels in French** — Indexed / Crawled not indexed / 
   Discovered / Excluded / Error were rendered hardcoded in JS. Moved through `wp_localize_script`
   strings (`s.idx_*`).
 * Fix: **Google coverage_state strings translated** — “Submitted and indexed”, “
   Crawled – currently not indexed”, “URL is unknown to Google”, “Discovered – currently
   not indexed”, “Page with redirect”, “Soft 404”, “Not found (404)”, “Server error(
   5xx)”, and 6 more variants. Map applied at render time via `localizeCoverage()`.
 * Fix: **Type labels translated** — Product / Category / Article / Page in the 
   indexation table type column now use the WP locale.
 * Fix: cleaned remaining `\n` artifacts in `essiow-fr_FR.po`. **783 entries**, **
   50.7 KB compiled .mo**, zero `#-#-#-#-#` marker, zero msgfmt error.

#### 1.1.40

 * Critical fix: **`msguniq` left 43 conflict markers `#-#-#-#-# essiow-fr_FR.po(
   Essiow) #-#-#-#-#` directly inside `msgstr` strings** of the French .po file.
   WordPress was rendering them in the UI (“Credits disponibles #-#-#-#-#… Crédits
   disponibles”, “Non classée #-#-#-#-# Non classé”, “Générer l’article #-#-#-#-#
   Générer un article”, etc). Each conflict resolved automatically by picking the
   longest non-empty alternative, then leading/trailing `\n` markers stripped, then
   comments removed. Result : zero `#-#-#-#-#` in the .po, .mo recompiles clean (
   no warnings, no fatal errors), 648 valid translations.

#### 1.1.39

 * New: **📡 Bulk Ping button on Products + Categories** alongside 🚀 Index selection.
   Two clear options : light IndexNow ping (instant, no Google) vs full request 
   indexing (IndexNow + sitemap + URL Inspection refresh).
 * Fix: **Issues panel labels/descriptions/suggestions are translated**. The Flask
   backend returned hardcoded English strings ; the plugin now intercepts the response
   and replaces them with `__()` translations on the way out. “Crawled but not indexed”,“
   Discovered but not crawled”, “Excluded by Google”, “Indexation errors” + their
   descriptions and suggestions all appear in the WP locale.
 * Fix: **“Dashboard” and “Blog” submenu items** were registered without `__()` 
   calls, so they stayed in English even with French locale. Both now translatable.
 * Fix: **19 fuzzy translations unflagged** in the .po file. WordPress ignores `#,
   fuzzy` entries by default — the FAQ answers (“Yes. The Pause…”, “Yes. Since 1.1.30…”)
   and several other long strings were never displayed in French. Removed all fuzzy
   flags.
 * New: **Plugin description rewritten** — sales-focused, benefit-driven, no technical
   jargon. Explains what Essiow does for the shop owner, not how it works internally.
   Added the new features (cannibalization fix, internal-link graph, /llms.txt for
   AI search engines, GSC-driven optimization, Bulk indexation).
 * New: **20+ FR translations added** for the bulk-ping labels + Issues groups. 
   Total : **748 entries**, **81 KB .mo**.

#### 1.1.38

 * **CRITICAL FIX: `load_plugin_textdomain()` was never called.** The .po/.mo files
   in `/languages/` were ignored by WordPress entirely — that’s why the plugin stayed
   in English even when the WordPress locale was French. Now properly loaded on `
   plugins_loaded` so every translated string in the plugin (Search Console tabs,
   Help guide, Indexation tab, Modules cards, Cannibalization actions, FAQ, etc)
   appears in the WP locale.
 * New: **+196 French translations added** — Help guide modules (Getting started,
   Modules, Recommended workflow, Ping vs Request indexing, Pricing, Tips, FAQ),
   Search Console tabs (Overview, Indexation, Opportunities, Issues, Performance,
   Audit, Submission), all Indexation column states, all Cannibalization actions,
   all Internal Links labels, all bulk action labels. **730 total entries** in `
   essiow-fr_FR.po`, **70 KB compiled .mo**.
 * Fix: **Internal Links graph stops working after creating a link** — fully rewritten
   render :
    - Positions are now preserved per-sig (drag positions survive ilLoad refreshes).
    - Cleanup of stale positions for deleted pages.
    - Handlers bound with `$(document)` event delegation instead of `$canvas` references
      survives canvas DOM rebuilds.
    - `ilGraphBindHandlers()` is now idempotent (`ilHandlersBound` flag) and called
      once at first render.
    - The handlers re-fetch the canvas’s `getBoundingClientRect()` on every drag—
      the rectangle was stale after re-render.
    - Removed obsolete `setTimeout` rebinds on tab-switch.
 * New: **Smart fuzzy local matching** for the “🔍 Find matching pages” modal — 
   produit/catégorie/article search via WP `wpdb` directly, with accent normalization(`
   remove_accents()`) and FR/EN/ES stopword filter. Each match now displays `N tokens
   match` + a one-click ✨ Optimize button targeting the original GSC query.

#### 1.1.37

 * New: **Universal spinner state** for every async action button — Ping, Request
   indexing, bulk Ping/Index, Re-optimize, Rotate API key, Disconnect. The button
   shows a CSS spinner (and stays disabled) until the server responds, so the user
   always knows an action is in flight.
 * New: **Smart query  matching** with fuzzy token search. The “🔍” button on Performance/
   Striking distance now also returns local WordPress products / categories / articles
   whose titles contain ANY of the query tokens (after stop-word filter and accent
   normalization), not just GSC-tracked pages. Each match has a score = number of
   tokens found + a one-click ✨ Optimize button that targets the original query.
 * New: **Drag-to-link in the Internal Links graph (Miro-style)** — hover any node
   and a 🔗 handle appears top-right. Drag it to another node : a dashed SVG line
   follows the cursor + the target node highlights green. Drop  confirmation modal
   Essiow injects reciprocal anchor links in both contents.
 * New: **Bulk Ping + Request indexing in the Search Console  Indexation tab**. 
   Two new buttons next to “Re-check selected” — pick rows with the existing checkboxes,
   then ping or request indexing on all of them in one server round-trip.
 * New: **API key rotation from Settings**. New endpoint `POST /license/rotate-api-
   key` — old key invalidated immediately on the server, new key auto-saved in `
   essiow_api_key`. Use case : suspected leak, or routine rotation hygiene.
 * New: **Disconnect this site** button — clears the local API key + connected flag
   without invalidating the key on the server (so it can be re-pasted later). Combine
   with rotation for a full re-pair.
 * Fix: **Internal mesh score panel** redesigned — left side shows the big score
   in a colored card (green/yellow/red), right side shows the 5 weighted factors
   with their points / max as a clean list. Replaces the previously broken inline-
   text layout.
 * Fix: **Help page hides “Connect Search Console” when GSC is already connected**—
   replaced by a green “Connected ✓” + “Open Search Console” button.
 * Fix: **Typo “Restaurér”  “Restaurer”** in the French translation file (`languages/
   essiow-fr_FR.po` lines 380 and 397). Visible everywhere the Restore button appeared
   in French.
 * Fix: **`audit_seo_factors()` and `audit_category_factors()` now static** — the
   search-console resolver was instantiating Essiow_Products / Essiow_Categories
   per row, re-registering all action hooks each call. Performance regression fixed.
 * Fix: **Cannibalization secondary URLs in French** (`/categorie-produit/`) now
   correctly resolve to terms when setting canonical (the legacy code only matched`/
   product-category/`).
 * Improvement: **300+ new French strings translated** (1.1.30  1.1.37 features).
   The plugin is now fully usable in French — Help & Guide, Cannibalization actions,
   Internal Links module, Pricing tooltips, Bulk action labels, FAQ.

#### 1.1.36

 * Fix critical: **`essiow_inspect_urls` AJAX action name corrected to `essiow_gsc_inspect_urls`**—
   the auto-batch URL Inspection on Products and Categories pages was failing silently
   for every user. Now correctly fires and populates the indexation badges in real
   time.
 * Fix: **`audit_seo_factors` and `audit_category_factors` are now static** — they
   were being called from `Essiow_Search_Console::resolve_url_to_entity()` which
   instantiated `Essiow_Products`/`Essiow_Categories` per row, re-registering all
   action hooks each time (memory + duplicate-handler bug).
 * New: **Help & guide menu** — full submenu with 7 tabs : Getting started, Modules,
   Recommended workflow, Ping vs Request indexing, Credits & pricing, Tips, FAQ.
   Strictly aligned with the actual features of the plugin (no fictional content).
 * New: **Help link injected on every Essiow page** — a discreet `❓ Help` button
   appears in the top-right corner of each header, one click away from the dedicated
   guide.
 * New: **Pricing transparency in the Audit tab** — the Auto-fix alts description
   now reads from the live cost map and shows the actual credit cost.
 * New: **Pricing rebalanced**:
    - Alt text generation : `CREDITS_PER_ALT_TEXT = 2` (was implicitly billed as
      a full product = 1 — the Vision call cost is now accurately billed).
    - Indexing actions (Ping IndexNow + Request indexing + URL Inspection batches
      + sitemap submit) : free — they don’t call the AI.
    - Image audit, llms.txt toggle, schema emission, internal-link suggestions, 
      internal-link graph rendering, internal mesh score : free.
 * New: **`/credits/balance` returns the cost map** so the plugin can display realistic
   prices everywhere without round-tripping the config.
 * New: **`CreditService._costs()` centralized** — single source of truth for all
   credit costs across normal billing, Shopify usage billing, and balance display.
   Removes 3 duplicated cost dicts.
 * Improvement: **“Optimize a product/category”** dashboard quick-link card replaced
   by a direct **Help & guide** card so new users can find the workflow guide instantly.

#### 1.1.35

 * Fix: **Article generation now shows the percentage**. The view’s existing progress
   bar had an `--indeterminate` CSS animation that ignored width updates, and the
   JS was looking for a non-existent `#essiow-blog-progress-text`. Both fixed — `
   0%  100%` now ticks visibly with status label and elapsed time.
 * Fix: **Internal Links titles now decode HTML entities** (`&#8211;`  `–`, `&amp;``&`,
   etc) — applied via `html_entity_decode()` server-side before caching the graph.
 * Fix: **Lost rankings table now renders fully** with a new “Clicks lost” column.
   The Flask service now returns `previous_clicks`, `current_clicks`, `impressions`,`
   potential_clicks` for each lost-ranking page so the user sees the actual revenue
   impact, not just an abstract delta.
 * New: **Floating “Optimizations” panel** (bottom-right) replaces the silent toast.
   Click “Re-optimize”  a row appears with name + progress bar + status + elapsed
   time. When done : button “View content” opens the editor + score badge. Multiple
   optimizations stack in the panel. Minimize/dismiss available.
 * New: **Bulk actions in Existing Articles** :
    - Checkbox per row + “Select all”
    - 📡 Ping selected · 🚀 Request indexing selected
    - Filter dropdown : All / Essiow only / Other / Low score (<40)
 * New: **Bulk actions per Issue group** (Crawled-not-indexed / Discovered / Excluded/
   Error) :
    - Checkbox + “Select all”
    - 📡 Ping all · 🚀 Request indexing all · ✨ Re-optimize all (sequential 1.5s
      spacing)
    - Auto-resolves the URL  product/category/article and fires the right optim 
      endpoint.
 * New: **Bulk for Lost rankings** (Ping / Request indexing on selected rows).
 * New: **Performance tab actions per query** :
    - 🔍 Find matching pages (existing query-explore modal)
    - ✨ Generate article for this query (redirects to Blog with keyword pre-filled
      via `?essiow_keyword=…`)
    - 🎯 Optimize matching products (opens the matching-pages modal where each result
      has its own Re-optimize button)
 * New: **Internal Links graph — Miro-like overhaul** :
    - **Pan** by dragging the background, **zoom** with the mouse wheel (zoom-to-
      cursor), **drag** individual nodes
    - Toolbar : `+` / `−` / `⟲ Reset view`
    - **Click two nodes to create a reciprocal internal link** — the server algorithm
      finds the strongest shared keyword and wraps it as `<a>` in both contents (
      or appends a “Voir aussi” paragraph if none match).
    - **Internal mesh score / 100** computed from 5 factors : `% pages with ≥1 incoming`(
      40 pts), `% pages with ≥1 outgoing` (30 pts), `hub ratio 5-20%` (10 pts), `
      avg in / out ≥ 2` (20 pts).
    - Node now shows `⬅ in / out ➡` mini-stats inline.
    - Layout clusters nodes by type : products on the left, articles in …

## મેટા

 *  વર્ઝન **1.1.58**
 *  છેલ્લી અપડેટ: **3 દિવસ પહેલા**
 *  સક્રિય સ્થાપનો: **10 કરતા ઓછા**
 *  વર્ડપ્રેસ વર્ઝન ** 5.8 અથવા ઉચ્ચતર **
 *  **6.9.4** સુધી પરીક્ષણ કર્યું
 *  PHP સંસ્કરણ ** 7.4 અથવા ઉચ્ચતર **
 *  ભાષા
 * [English (US)](https://wordpress.org/plugins/essiow/)
 * ટૅગ્સ:
 * [AI](https://gu.wordpress.org/plugins/tags/ai/)[chatbot](https://gu.wordpress.org/plugins/tags/chatbot/)
   [product descriptions](https://gu.wordpress.org/plugins/tags/product-descriptions/)
   [seo](https://gu.wordpress.org/plugins/tags/seo/)[woocommerce](https://gu.wordpress.org/plugins/tags/woocommerce/)
 *  [વિગતવાર દૃશ્ય](https://gu.wordpress.org/plugins/essiow/advanced/)

## પૉઇન્ટ્સ

હજુ સુધી કોઈ સમીક્ષા સબમિટ કરવામાં આવી નથી.

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

[બધા  સમીક્ષાઓ જુઓ](https://wordpress.org/support/plugin/essiow/reviews/)

## ફાળો આપનારા

 *   [ boni58 ](https://profiles.wordpress.org/boni58/)

## સપોર્ટ

કંઈક કહેવું છે? મદદ જોઈએ છે?

 [આધાર ફોરમ જુઓ](https://wordpress.org/support/plugin/essiow/)