== Changelog ==

= 1.2.9 =
* Needs Rank Forge Pro 1.2.5 or newer if you run the add-on, as before.
* Fixed: when the Rank Forge Pro add-on is active but its licence does not cover Search Console, Performance and Content Decay told you to connect Google Search Console, which could not load any data. They now say that the licence is missing and link to the add-on's licence page, whether or not Google is connected. This needs Rank Forge Pro 1.2.13 or newer.
* Content Decay: when no Search Console data has been loaded yet and none is waiting to load, the screen now says so and offers a "Load Search Console data now" button, instead of sending you to Performance. This needs Rank Forge Pro 1.2.13 or newer; with an older add-on the previous text stays.

= 1.2.8 =
* Needs Rank Forge Pro 1.2.5 or newer if you run the add-on, as before.
* Content Decay and Performance: when the Pro add-on does not load Search Console data on the site, the screen says so, gives the reason and links to the add-on's licence page, instead of telling you to click a Refresh button that starts nothing. Performance hides its Refresh button then. The message needs Rank Forge Pro 1.2.13.
* Fixed: in the edition distributed through avakode.com, with debug logging on, wp-admin no longer writes "_load_textdomain_just_in_time was called incorrectly" notices for this plugin on every request.
* Fixed: on PHP 8.1 and later the plugin no longer writes "trim(): Passing null to parameter" deprecations to debug.log on every front-end request of a site installed at the root, or on a request for an address with no path (such as //).
* Fixed: deleting the plugin now also removes the end date and the saved Search Console comparison that A/B tests keep on posts (not when you chose to keep the data).

= 1.2.7 =
* Needs Rank Forge Pro 1.2.5 or newer if you run the add-on, as before.
* Product markup: a product's brand now comes from its own brand (WooCommerce Brands, Perfect Brands for WooCommerce or YITH WooCommerce Brands), a "brand" product attribute, or the new Default brand field under Settings, Search Appearance. The name of your site is no longer printed as the brand, so a shop that has not set a brand now prints no brand property.
* Product markup: the GTIN set on the product in WooCommerce is printed as gtin8, gtin12, gtin13 or gtin14, by its length; a number of any other length is not printed.
* Product markup: new MPN field next to the SKU on the product's Inventory tab (a product attribute named "mpn" works too), printed as mpn.
* Product markup: every offer with a price now says until when the price holds: the end of a running sale, otherwise 31 December of next year.
* Product markup: new Product Markup card under Settings, Search Appearance with shipping details (country, cost or free shipping, handling and delivery days). They are printed only when every field is filled in, and not for virtual or external products.
* Product markup: the same card holds the return policy (country, days, method, who pays for return shipping), printed only when every field is filled in, and not for virtual or external products.
* A/B test (Rank Forge Pro): the meta title, Open Graph title and Twitter title now come from one place, so a Variant B title can reach all of them. A title typed by hand for Open Graph or Twitter still wins.
* Content Decay: the empty-state text and button now send you to Performance, the screen that exists, instead of Rankings.
* Performance and Content Decay show when Search Console data is loading, why a load failed (with a Try again button), or that a property still has to be chosen.
* Hints about connecting Google open the screen that has the Connect Google button; the dashboard card appears only when the connection is available.
* Site Audit: WooCommerce products show their type in the list; the AI works out a product's focus keyword from its name, short description and description.
* Site Audit: the AI never rewrites the description of a product; a fix that would write it says so and changes nothing. The AI can write a product's meta title, meta description and focus keyword.
* Fixed: bulk fixes no longer strip backslashes from the content they save, and an applied meta title, description or focus keyword keeps its backslashes.

= 1.2.6 =
* Needs Rank Forge Pro 1.2.5 or newer if you run the add-on, as before.
* Video SEO: a Thumbnail URL or Description typed in the Video SEO box is no longer replaced by an automatic one when the Video URL field is empty and the post has a video in it. A field left empty still takes the automatic value.
* Redirects: saving a redirect with a type that is not supported now shows an error instead of storing a rule that visitors got as a 301. Rules saved earlier are not changed.
* Schema Builder: choosing a schema type (Event, Review, WebPage, VideoObject and so on) without filling in a form no longer replaces the automatic schema of the page with an empty type. A chosen Review, Event, VideoObject or Product now prints only when the post has what it needs (a rating from 1 to 5, a start date, a video address, a price), and a Review no longer gets a rating of 5 that nobody gave.

= 1.2.5 =
* Needs Rank Forge Pro 1.2.5 or newer if you run the add-on, as before.
* Auto-Link (Pro add-on): when no internal link could be added, the button no longer says "Linked!" and reloads the page; it shows why nothing was added and leaves the post as it was.
* Redirects: a rule of type 410 (Gone), for example one imported from SEOPress, now answers "410 Gone" with your theme's 404 page. Before, the visitor saw a WordPress error page.
* Settings: saving the Settings screen no longer deletes settings that have no field on it, such as the switch that turns off the cleaning of image file names.
* Local SEO: the Veterinarian and Locksmith business types now use the real schema.org types (VeterinaryCare and Locksmith); the old names are not schema.org types, so search engines skipped them. A type saved earlier is carried over by itself.
* Local SEO: saving the form no longer drops the business image address that an import or code had set, so "image" stays in the markup.
* Content Brief (Pro add-on): the heading structure and the target word count of a brief now show on the screen, in new briefs and in saved ones.
* Video schema: embedUrl now belongs to the same video as contentUrl, not to another video on the page.

= 1.2.4 =
* Needs Rank Forge Pro 1.2.5 or newer if you run the add-on, as before.
* The AI buttons on the Local SEO and Schema screens, the Fix buttons in the SEO box and its "AI-Powered" mark show only while Rank Forge Pro reports its AI features running, so no button leads to "Pro add-on is not running".
* The AI buttons can now be paid with the credits of your Avakode account. The Settings screen has an "AI credits" card where the AI features are on: press "Connect Avakode account", sign in at avakode.com and approve the site; the card then shows the account, the credits left and a Buy credits link, and "Disconnect" removes the connection (the token is revoked on avakode.com and always deleted from your site, even when avakode.com cannot be reached).
* The free trial is still spent first. When the service refuses a trial request because its credits are used up, it has ended or its token is not accepted, and an account is connected, the same press is repeated once on the account. When the trial's credits are used up and no account is connected, the press that finds it out is still sent with the trial and refused by the service, and the button answers "Connect your Avakode account to use AI credits" with a link to the card; once the site knows the trial's credits are used up, it sends nothing and asks you to connect. A connection avakode.com no longer accepts is removed and the card asks you to connect again.
* The connection uses the WordPress address of the site (Settings → General) everywhere, so it works where WordPress sits in its own folder and on a network site that has a path.

= 1.2.3 =
* Deleting the plugin now cleans up on every site of a network, not only the main one. When it is the last Forge product on the site, everything the Forge plugins keep in common goes too; while another Forge product is still installed, that shared data stays for it.

= 1.2.2 =
* robots.txt: the physical /robots.txt file is now written only through WordPress's own file API, and only where WordPress can write to the site root directly. On a host that would ask for FTP details nothing is written and no credentials are requested; the screen then says WordPress is not allowed to write there and what to do (delete the file over FTP or in the hosting control panel, and Rank Forge serves the robots.txt built from your settings).
* The Google Search Console card (Settings, Integrations) no longer carries the sentence about where the sign-in runs; External services above says it. The Connect Google button stays. Where the add-on offers neither the button nor its Connect card, the card now points to the add-on's Analytics & Traffic screen instead of a sentence that led nowhere.
* The AI status line no longer says "Powered by Forge AI", the hint for a robots.txt that visitors get from somewhere else no longer names Cloudflare, and the code comments no longer name the services behind the add-on. Nothing the plugin does has changed.
* Five new sentences in all 15 translations (four are rewordings of messages that were there); six sentences left the catalogue with the code that carried them.

= 1.2.1 =
* When a shortcode in an FAQ answer or in a HowTo or Recipe step throws while Rank Forge builds the schema markup, the fragment still goes in with its shortcodes stripped, as before, and the new action `rankforge_schema_shortcode_failed` now tells your site, with what was thrown, the post and the fragment. Nothing is written to a log by default: hook your own logging onto the action if you want to know. What a handler prints stays out of the page head, and an error it throws goes no further.
* French: a non-breaking space now comes before the colon in 13 more strings.
* Recent activity on the Forge Suite dashboard measures every entry on one clock. On a site whose time zone differs from the database server's, a form submission from a minute ago could read “5 hours ago”. Entries from the same second keep a fixed order, and a “fields saved” entry shows when its post was last saved instead of an invented time.

= 1.2.0 =
* The Dashboard's first card runs the site-wide analysis on the card itself, with its progress, and then names your weakest post, its main issue and a link to its editor, instead of sending you to Settings. While only some of your posts have a score it shows “N of M analyzed” rather than “No urgent fixes”, and “Analyze the remaining” finishes an interrupted run without starting over.
* The site-wide analysis, from that card and from Settings → Automation, now covers every type of post Rank Forge analyzes (pages, products and other public types, not only posts) and any number of them, instead of the first 100 posts. It no longer fails on a site in a sub-directory or with plain permalinks. Posts that cannot be analyzed are counted with a link to the first one, and failed requests get a “Try again” button.
* The Dashboard's “posts without description” and “posts without keyword” counts cover the same post types as the analysis (products and other custom types included, not only posts and pages), and a post you cannot edit is listed without a link.
* The Dashboard cards “Add missing meta descriptions” and “Set focus keywords” open the posts they counted: the list of the post type with the most of them, with a line saying what is shown and a “Show all” link, and the other types that have such posts as links with their counts. The list stays narrowed when you search or filter it.
* “Most common issues” on the Dashboard counts each check once, in your language: the same check with other numbers in its text used to be several lines, and a site analyzed in two languages showed every check twice.
* The XML sitemap writes every `<lastmod>` in UTC. On a site set to a time zone behind UTC the dates ran ahead of the real time, and search engines can ignore a date in the future. A post without a valid modified date has no `<lastmod>`.
* The “AI Search Readiness” report that the Pro add-on runs from the post editor now lists its strengths and suggestions under the score (only the score showed until now), and shows them as plain text.
* The automatic FAQ markup and the HowTo and Recipe steps now contain what the page shows: shortcodes in a question, answer or step are rendered before the tags are removed, and words in separate blocks no longer run together. The answer to the last question now has an end: it stops at a form, aside, navigation or footer and keeps its first 150 words. A shortcode that throws or prints can no longer break the page head. The `rankforge_schema_render_shortcodes` filter turns the rendering off.
* The Indexing tab of the Analytics section no longer opens “Sorry, you are not allowed to access this page.” when the Pro add-on is active without a licence; the screen that names the add-on is shown instead.
* New filter `rankforge_canonical_url`: another plugin can change a post's custom canonical URL, or withdraw it by returning an empty string, in which case Rank Forge prints no canonical tag for that post.
* The Forge Suite dashboard leaves Form Forge test submissions (the “Send a test submission” button) out of the 30-day Form submissions counter, the conversion rate built on it and the activity feed.

= 1.1.13 =
* Deleting the plugin leaves the job queue the Forge plugins share in place while another Forge plugin or add-on is still on the site. The check used to miss add-ons, and Rank Forge installed from wordpress.org, so the queue could be dropped while a neighbour still had jobs in it.
* The readme no longer says the XML sitemap is hreflang-aware when Lang Forge is active: the sitemap lists no language alternates, with or without Lang Forge.
* Deleting the plugin removes the hourly statistics event, and now the site's Avakode account binding too, only when it is the last Forge plugin on the site. The event used to be removed every time.
* The dashboard's “Run diagnostics” request to api.avakode.com/health no longer carries your site's address: it identifies itself as ForgeSuite/health-check instead of using WordPress's default User-Agent, which includes the address.
* The Forge Suite screen lists Renew Forge, shows Guard Forge and Velocity Forge as available on wordpress.org, and carries the other products' current plans and taglines.
* The readme's External services section lists every request the plugin can make and what goes with it, and says that an AI request is passed on to OpenAI through Cloudflare AI Gateway, with the licence key held back. The list of AI buttons no longer names an “SEO analysis”: no button sends one.
* The unused SEO-analysis request is removed from the plugin's API client.

= 1.1.12 =
* **This release needs Rank Forge Pro 1.2.5 or newer if you run the add-on.** The licence screen, the upgrade prompt and the upgrade banner moved into the separate Rank Forge Pro add-on; this plugin only notes which features the add-on provides, with a link to its product page. An older add-on stays switched off until it is updated, and an admin notice names both versions. Nothing already saved is changed.
* The post editor shows no AI buttons unless the add-on runs them — no locked "AI" buttons and no upsell dialog. One line under the SEO title and description says where the AI suggestions come from.
* Settings no longer link to an upgrade: the AI, auto internal linking and Google Search Console sections say that they come with the add-on.
* The screens the add-on provides (Google Search Console, Site Audit, Content Brief) name it, with a link, instead of showing a locked page.

= 1.1.11 =
* The PRO badge in the menu and in the section tabs marks a screen the Rank Forge Pro add-on provides and this site does not have. It follows whether the add-on is installed, not the licence.
* The screens the add-on provides check for it themselves before they open, not only through the menu entry that leads to them. No visible change.
* The wordpress.org package no longer loads bundled translation files it does not carry: its translations arrive as language packs, which WordPress loads by itself.
* Fixed: on a site that installed Rank Forge from wordpress.org, which puts it in the rank-forge folder, the Forge Suite screen reported it as not installed and its Activate link pointed at a file that is not there.
* The Forge Suite screen looks for installed plugins only where WordPress keeps them, so a site that moved its content or plugin folder is read correctly.
* The Forge Suite licence panel finds Form Forge again: its licence code now ships in Form Forge Pro, so the free plugin is recognised by its own version.
* The Forge Suite menu entry is registered by the shared screen itself, so it appears even on a site where only the newer Forge plugins are active.

= 1.1.10 =
* The Forge Suite dashboard links Guard Forge, Velocity Forge and Flow Forge to their sites: guardforge.app, velocityforge.app and flowforgewp.app.

= 1.1.9 =
* Screens that need the paid add-on now check that its code is actually installed instead of trusting the licence. On a site whose licence is live but whose add-on is inactive or older than this release, the Search Engine Submission panel, the AI actions in the editor, the content optimiser and the automatic internal links could end a request with a fatal error; they now fall back to what this plugin does on its own.
* The price badge on AI buttons is drawn only where the credits widget exists, so the button itself no longer depends on it.
* Deleting the last Forge product on a site now clears the job queue the Forge plugins share — its table, its two scheduled events and its version marker. While any other Forge product is still installed, deleting this one leaves the queue exactly as it is, because the pending jobs in those rows are that product's too.
* A Rank Forge Pro add-on older than 1.2.0 is switched off instead of left running on an entitlement this version can no longer check, and an admin notice names the version you have, the version you need and what is unavailable until you update. Nothing already published is rewritten and your settings are kept.

= 1.1.8 =
* Suite banner: the eleven products and the three-step set discount are up to date.

= 1.1.7 =
* Forge Suite dashboard: results are the first screen — each tool's own results with window and completeness, detected and confirmed apart, a Needs-attention filter and a local CSV export for administrators.
* Set discounts in the Suite banner follow the three-step ladder (2 tools 15%, 3 tools 25%, 4 or more 35%).
* Translations refreshed for all catalogues.

= 1.1.6 =
* Licensing no longer depends on a third-party SDK. The plugin asks avakode.com whether this site is licensed and caches the answer for a day; if the check cannot be completed — a network hiccup, a timeout, our own error — your paid features stay on. Only a clear “this licence is not active” turns them off.
* Deactivating from the Forge Suite dashboard now releases the site slot directly, instead of the three-step fallback the old SDK needed when a licence had been cancelled server-side.
* Smaller package and one less admin surface: the SDK’s own menu, opt-in screen and promotional notices are gone.

= 1.1.5 =
* Forge Suite dashboard: names of the builder-rail tools (Clearway, Profit, Inclusive Forge) no longer truncate next to the “Not installed” badge.

= 1.1.4 =
* The Forge Suite dashboard now shows the whole seven-tool line-up from the product registry — Clearway Forge, Profit Forge and Inclusive Forge join the four WordPress tools — counts active tools against seven, and its cross-sell banner points at the Forge Builder on avakode.com (one checkout, set discount up to 45%) instead of the retired Freemius bundle.

= 1.1.3 =
* Generated CSS and JavaScript is assembled as a string instead of being captured through an output buffer, so the plugin no longer opens a buffer that another component's hook could interleave with.
* Menu pages decide what to show by whether the class that renders them is loaded, not by asking the licence. Redirects and Local SEO ship in this download and now open with no check at all.

= 1.1.2 =
* The custom canonical tag is now printed directly at its hook. The plugin used to buffer the entire head output between two hooks so competing canonical tags could be stripped from it; that buffer is gone. WordPress core's canonical is still suppressed while a per-post custom canonical is set, and Yoast's through its filter, so the URL you set is still the one that ships.
* Every value handed from PHP to inline JavaScript is JSON-encoded with hex escaping for the characters that could end a script block, so translations and settings can never terminate the tag they sit in.
* The bulk AI-fix endpoint no longer raises the PHP memory limit — its capped, sequential work never needed the headroom.
* Removed an unused helper that assigned window globals.

= 1.1.1 =
* CSS and JavaScript that screens build from PHP state now go through the WordPress enqueue API instead of being written into the page as tags, so other code can deregister, reorder or defer them.
* Filenames: uploads are cleaned only for images, and only for files you actually upload. The rule used to apply to every filename WordPress touched, and it stripped non-Latin scripts entirely — a file named in Russian, Japanese or Greek came out as a timestamp. Accented Latin now transliterates, and a name that leaves nothing behind is kept as WordPress sanitised it. Add 'image_filename_cleanup' => false to the settings to turn it off.
* The sitemap stylesheet is located from the plugin's own file rather than a hardcoded directory name, so it resolves whatever folder the plugin is installed under.
* Publishing robots.txt no longer empties the whole LiteSpeed cache; only the robots.txt URL is purged.
* Removed a stray closing tag from the feedback widget markup.

= 1.1.0 =
* The plugin is now called Rank Forge. Nothing about what it does has changed; the name did.
* Everything the old name stored is carried over on first load: the analysis, redirect and breadcrumb tables, every setting, and the SEO fields on every post. Redirects keep working, stored analyses stay, and the meta on your posts stays. If the takeover is interrupted it resumes on the next request rather than half-applying.
* Scheduled jobs left under the old names are unscheduled, and the old cached values are dropped so they regenerate under the new ones.

= 1.0.40 =
* Removed the last licence checks that stood over code shipped in this download. The settings screen asked the licence before writing two flags, "auto_meta" and "internal_links_enabled" — neither was ever read by anything, while the meta generation they appeared to control (title and description templates, canonical URLs, Open Graph tags; no external calls) is part of this plugin and has always run for everyone. Both flags are gone rather than merely ungated.
* Auto internal linking, Search Console and Site Audit now show as unavailable based on whether their implementation is loaded, not on a licence call. Those three are implemented in the separate add-on and are not present here, so nothing shipped is being withheld.
* The Site Audit screen guarded itself with a plan check; it now checks for the class it needs, which is what actually decides whether the page can render.

= 1.0.39 =
* Chinese: parentheses in running text are full-width, as the WordPress core Chinese catalogue writes them. Two strings also carried a second, unused plural form left over from the English two-form scheme; Chinese has one form, so it was dead data.
* Japanese: parentheses in running text are half-width with a space outside, following the Japanese translation style guide. Reported by the Japanese locale team.

= 1.0.38 =
* The broken-link scanner is now part of this plugin with no restriction. It was marked Pro while its whole implementation shipped here — the crawler, the SSRF-hardened request wrapper and the results screen — which meant built-in functionality was gated. Internal link *suggestions* remain a separate add-on feature, because that code genuinely is not in this download.
* Removed licence checks that could never fail: image SEO, Local SEO, redirects, the Schema Builder and Video SEO have been free since the 2026-05-29 rebalance, but the code still asked for a licence and the readme still listed several of them as Pro.
* Availability of add-on features is now decided by whether the add-on is installed, not by a licence call.

= 1.0.37 =
* Security hardening: all dynamic output is now escaped late at the output site with the context-appropriate function (esc_html/esc_attr/esc_url, esc_html__ for translated strings used as format strings, and wp_kses for trusted pre-built admin/field markup). No behavioural changes.

= 1.0.35 =
* Security: hardened JSON-LD structured-data output (schema, breadcrumbs, local business, video) against script-context breakout by escaping `<`, `>` and `&` (JSON_HEX_TAG / JSON_HEX_AMP).
* Fix: Organization structured data no longer emits an empty "description" property when the site tagline is unset.

= 1.0.32 =
* New: Support menu item that opens the Avakode support dashboard.
* New: Opt-in anonymous usage analytics (OFF by default) — see Third-Party Services.
* New: Contextual, dismissible Pro feature tips on the plugin dashboard (Free users only).


= 1.0.29 =
* Numbers / power words in the SEO title are now shown as optional "Optimization ideas" instead of issues — they affect click-through, not Google rankings.
* Clearer one-time setup guidance for the Google Indexing API ("Submit to Google Index").
* WordPress.org compliance and code-quality improvements.

= 1.0.28 =
* Fixed: the XML sitemap no longer 301-redirects to a trailing slash, so Google Search Console can fetch the sitemap index.
* Kept Rank Forge admin submenus accessible when multiple Forge plugins are active.

= 1.0.27 =
* Fix: Rank Forge admin sub-pages (Settings, Analytics, Content and Tools) now stay accessible when other Forge plugins are active alongside Rank Forge Pro.

= 1.0.26 =
* Security: the Google Account connection (Search Console / Analytics) now starts via a one-time token, so the license key is never placed in a URL.

= 1.0.25 =
* WordPress.org compliance and licensing hardening.
* Pro entitlement is now resolved by the Rank Forge Pro add-on; the free plugin bundles no licensing SDK.
* Removed a deprecated Google sitemap-ping request fired on publish.
* readme metadata cleanup.

= 1.0.0 =
* Initial release.
