{"id":379490,"date":"2026-10-19T02:46:21","date_gmt":"2026-10-19T02:46:21","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/geolens-ai-affinity-score-analyser\/"},"modified":"2026-10-19T06:57:59","modified_gmt":"2026-10-19T06:57:59","slug":"geolens","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/geolens\/","author":23578103,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.13.7","stable_tag":"1.13.7","tested":"7.1.3","requires":"6.3","requires_php":"8.1","requires_plugins":null,"header_name":"GeoLens \u2013 AI Search Schema Checker","header_author":"GeoLens","header_description":"Improve how AI search engines see your site through Schema.org JSON-LD optimisation. GeoLens\u2122 analyses and raises your site's AI Affinity Score\u2122.","assets_banners_color":"3d5558","last_updated":"2026-10-19 06:57:59","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/geolens.co\/features\/","header_author_uri":"https:\/\/geolens.co","rating":0,"author_block_rating":0,"active_installs":0,"downloads":80,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.13.6":{"tag":"1.13.6","author":"geolensco","date":"2026-10-19 02:46:03","revision":3753842},"1.13.7":{"tag":"1.13.7","author":"geolensco","date":"2026-10-19 06:57:59","revision":3754144}},"upgrade_notice":{"1.0.6":"<p>Fixes API Key activation issues and dashboard state detection. Recommended update for all users.<\/p>","1.0.5":"<p>Improved Schema detection accuracy with frontend-based JSON-LD collection.<\/p>","1.0.4":"<p>Full Traditional Chinese support and scan quota display fixes.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3753842,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3753842,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3753842,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3753842,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.13.6","1.13.7"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3753842,"resolution":"1","location":"assets","locale":"","width":1730,"height":572},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3753842,"resolution":"2","location":"assets","locale":"","width":1696,"height":522},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3753842,"resolution":"3","location":"assets","locale":"","width":1238,"height":654},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3753842,"resolution":"4","location":"assets","locale":"","width":1721,"height":574},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3753842,"resolution":"5","location":"assets","locale":"","width":988,"height":656}},"screenshots":{"1":"Dashboard \u2014 your AI Affinity Score, operating mode and scan quota, the Three-Dimension Breakdown, and how your site compares with the benchmark","2":"\"What AI Cannot Read Yet\" \u2014 the specific gaps found on your pages, and \"What You Already Got Right\"","3":"Conflict detection \u2014 GeoLens stands aside on pages where Yoast SEO, Rank Math, AIOSEO or Schema Premium already output Schema","4":"Per-Page Scores \u2014 every scanned page with its own score, so you can see which pages hold the site back","5":"Plans &amp; Pricing \u2014 the Free, Pro and Agency plans side by side, with your current plan marked"}},"plugin_section":[],"plugin_tags":[2353,2591,1117,186,1121],"plugin_category":[49,55],"plugin_contributors":[287443],"plugin_business_model":[],"class_list":["post-379490","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-geo","plugin_tags-schema","plugin_tags-seo","plugin_tags-structured-data","plugin_category-maps-and-location","plugin_category-seo-and-marketing","plugin_contributors-geolensco","plugin_committers-geolensco"],"banners":{"banner":"https:\/\/ps.w.org\/geolens\/assets\/banner-772x250.png?rev=3753842","banner_2x":"https:\/\/ps.w.org\/geolens\/assets\/banner-1544x500.png?rev=3753842","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/geolens\/assets\/icon-128x128.png?rev=3753842","icon_2x":"https:\/\/ps.w.org\/geolens\/assets\/icon-256x256.png?rev=3753842","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/geolens\/assets\/screenshot-1.png?rev=3753842","caption":"Dashboard \u2014 your AI Affinity Score, operating mode and scan quota, the Three-Dimension Breakdown, and how your site compares with the benchmark"},{"src":"https:\/\/ps.w.org\/geolens\/assets\/screenshot-2.png?rev=3753842","caption":"\"What AI Cannot Read Yet\" \u2014 the specific gaps found on your pages, and \"What You Already Got Right\""},{"src":"https:\/\/ps.w.org\/geolens\/assets\/screenshot-3.png?rev=3753842","caption":"Conflict detection \u2014 GeoLens stands aside on pages where Yoast SEO, Rank Math, AIOSEO or Schema Premium already output Schema"},{"src":"https:\/\/ps.w.org\/geolens\/assets\/screenshot-4.png?rev=3753842","caption":"Per-Page Scores \u2014 every scanned page with its own score, so you can see which pages hold the site back"},{"src":"https:\/\/ps.w.org\/geolens\/assets\/screenshot-5.png?rev=3753842","caption":"Plans &amp; Pricing \u2014 the Free, Pro and Agency plans side by side, with your current plan marked"}],"raw_content":"<!--section=description-->\n<p>GeoLens is a GEO (Generative Engine Optimization) tool that analyzes your website's structured data and provides an AI Affinity Score \u2014 measuring how well AI engines can understand your site.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>AI Affinity Score \u2014 your site's AI readability rating<\/li>\n<li>Schema.org structured data health check<\/li>\n<li>Whole-site scan \u2014 your homepage plus up to 30 more pages, on every plan<\/li>\n<li>Automatic Schema injection, site-wide and included on every plan (Organization, WebSite, BreadcrumbList)<\/li>\n<li>Conflict detection for Yoast SEO, Rank Math, AIOSEO, Schema Premium<\/li>\n<li>Translation-ready<\/li>\n<\/ul>\n\n<h4>External Service<\/h4>\n\n<p>GeoLens is a client for the GeoLens service at https:\/\/geolens.co. The analysis runs\non our servers, so <strong>the plugin requires a free GeoLens account and will not work\nwithout one<\/strong>. The account is free and can be created from the plugin's settings\nscreen; no payment details are required.<\/p>\n\n<p><strong>When the plugin contacts the service<\/strong><\/p>\n\n<ul>\n<li>When you run a scan \u2014 manually, or on the schedule you choose<\/li>\n<li>When a page is rendered with Schema injection enabled, to fetch that page's\ngenerated JSON-LD (results are cached)<\/li>\n<li>When you open the GeoLens dashboard, to fetch your latest results<\/li>\n<li>When you open the AI Citation screen, to fetch the citation data for the questions\ntracked for your site<\/li>\n<li>When you create a free account from the settings screen, or activate or deactivate\na licence key<\/li>\n<li>Once per day, to check your licence status<\/li>\n<li>If you have a paid subscription and cancel it from the Plans &amp; Pricing screen<\/li>\n<li>When checking for plugin updates. This applies only to the build distributed from\ngeolens.co; the version installed from WordPress.org uses the WordPress.org update\nsystem instead<\/li>\n<\/ul>\n\n<p><strong>What is sent when you run a scan<\/strong> \u2014 <code>POST https:\/\/api.geolens.co\/api\/v1\/scan<\/code><\/p>\n\n<ul>\n<li>Your site URL, site name, tagline, logo URL and site language<\/li>\n<li>WordPress version, PHP version, active theme, whether the site is multisite, and\nthe list of active plugins \u2014 the plugin list is used to detect Schema conflicts<\/li>\n<li>The full contents of your <code>robots.txt<\/code> and <code>llms.txt<\/code>, where present<\/li>\n<li>For each analysed post or page: its ID, URL, title, excerpt (for posts with no\nexcerpt, the first 30 words of the content are used instead), author display name,\nauthor archive URL, published and modified dates, featured image URL, categories,\ntags, post type, comment count and word count<\/li>\n<li>Any JSON-LD structured data already present on that page, including output produced\nby other SEO plugins<\/li>\n<\/ul>\n\n<p><strong>What is sent when Schema is injected<\/strong> \u2014 <code>POST https:\/\/api.geolens.co\/api\/v1\/schemas\/{id}<\/code><\/p>\n\n<ul>\n<li>The same per-post facts listed above, so that the returned Schema reflects the\npage's current state rather than the state at the last scan<\/li>\n<\/ul>\n\n<p><strong>What is sent when you create a free account<\/strong> \u2014 <code>POST https:\/\/api.geolens.co\/api\/v1\/register<\/code><\/p>\n\n<ul>\n<li>The email address you enter. The service replies with your licence key<\/li>\n<\/ul>\n\n<p><strong>What is sent when you activate or deactivate a licence<\/strong> \u2014\n    POST https:\/\/api.geolens.co\/api\/v1\/license\/activate and <code>\/license\/deactivate<\/code><\/p>\n\n<ul>\n<li>Your licence key and your site URL (deactivation sends the site URL only)<\/li>\n<\/ul>\n\n<p><strong>Requests that send nothing beyond your licence key<\/strong><\/p>\n\n<ul>\n<li>Opening the dashboard \u2014 <code>GET https:\/\/api.geolens.co\/api\/v1\/report\/latest<\/code><\/li>\n<li>Opening the AI Citation screen \u2014 <code>GET https:\/\/api.geolens.co\/api\/v1\/visibility<\/code>. The\nservice returns the questions tracked for your site, the domains AI assistants cited\nfor them, and when they were measured<\/li>\n<li>The daily licence check \u2014 <code>GET https:\/\/api.geolens.co\/api\/v1\/license\/verify<\/code><\/li>\n<li>Cancelling a paid subscription \u2014 <code>POST https:\/\/api.geolens.co\/api\/v1\/subscription\/cancel<\/code><\/li>\n<\/ul>\n\n<p><strong>Sent with every request<\/strong><\/p>\n\n<ul>\n<li>Your GeoLens licence key, in the <code>X-Api-Key<\/code> header<\/li>\n<\/ul>\n\n<p><strong>What is never sent<\/strong><\/p>\n\n<ul>\n<li>The full content of your posts and pages<\/li>\n<li>Any personal data about your visitors<\/li>\n<li>WordPress usernames, passwords, or any administrator credentials<\/li>\n<\/ul>\n\n<p><strong>Payments<\/strong><\/p>\n\n<p>The plugin does not take payments. Paid plans are purchased on https:\/\/geolens.co.<\/p>\n\n<p>Terms of Service: https:\/\/geolens.co\/terms\/\nPrivacy Policy: https:\/\/geolens.co\/privacy-policy\/<\/p>\n\n<!--section=installation-->\n<ol>\n<li>In WordPress Admin, go to Plugins \u2192 Add New and search for \"GeoLens\" \u2014 or upload\nthe plugin ZIP via Plugins \u2192 Add New \u2192 Upload Plugin<\/li>\n<li>Activate the plugin<\/li>\n<li>Go to Settings \u2192 GeoLens<\/li>\n<li>Create a free account with your email address, or paste an existing API key<\/li>\n<li>Click \"Start Scan\" to check your AI Affinity Score<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20account%3F\"><h3>Do I need an account?<\/h3><\/dt>\n<dd><p>Yes. The analysis runs on the GeoLens service, so the plugin needs a free account to\nwork. You can create one from the plugin's settings screen. No payment details are\nrequired for the free plan.<\/p><\/dd>\n<dt id=\"is%20schema%20injection%20limited%20on%20the%20free%20plan%3F\"><h3>Is Schema injection limited on the free plan?<\/h3><\/dt>\n<dd><p>No. Automatic, site-wide Schema injection is included on every plan, the free one\nincluded.<\/p><\/dd>\n<dt id=\"what%20data%20does%20the%20plugin%20send%20to%20your%20servers%3F\"><h3>What data does the plugin send to your servers?<\/h3><\/dt>\n<dd><p>See the \"External Service\" section above, which lists every field.<\/p><\/dd>\n<dt id=\"will%20it%20conflict%20with%20yoast%20seo%2C%20rank%20math%20or%20aioseo%3F\"><h3>Will it conflict with Yoast SEO, Rank Math or AIOSEO?<\/h3><\/dt>\n<dd><p>GeoLens detects those plugins and stops injecting on pages where they already output\nSchema, so you will not end up with duplicate structured data. The conflict status is\nshown on the GeoLens dashboard.<\/p><\/dd>\n<dt id=\"can%20i%20turn%20schema%20injection%20off%3F\"><h3>Can I turn Schema injection off?<\/h3><\/dt>\n<dd><p>Yes. There is a single toggle on the GeoLens settings screen, and it is independent\nof your plan.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20without%20an%20internet%20connection%3F\"><h3>Does the plugin work without an internet connection?<\/h3><\/dt>\n<dd><p>No. Analysis and Schema generation both happen on the GeoLens service. Injection\nfalls back to cached results when the service cannot be reached.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.13.7<\/h4>\n\n<ul>\n<li>The Free plan now scans your whole site (homepage plus up to 30 pages), not just the homepage.<\/li>\n<li>While a free trial is running, the dashboard and the Plans page show when it ends and that your site then moves to the Free plan. Nothing is charged.<\/li>\n<li>Plans page: the subscription status is translated, and no status badge is shown on the Free plan.<\/li>\n<li>Plans page: if your admin language is not Chinese, a note explains that paid plans launch in Taiwan first and that the pricing page is in Traditional Chinese.<\/li>\n<\/ul>\n\n<h4>1.13.6<\/h4>\n\n<ul>\n<li>Plans page: the \"Current Plan\" label no longer sticks out past the edge of its card.<\/li>\n<\/ul>\n\n<h4>1.13.5<\/h4>\n\n<ul>\n<li>Dates on the dashboard (scan quota reset, last scan, AI Citation) now follow your WordPress language instead of the browser's.<\/li>\n<li>Readme: the first screenshot caption now describes the current dashboard.<\/li>\n<\/ul>\n\n<h4>1.13.4<\/h4>\n\n<ul>\n<li>Admin labels are now translatable: operating mode, issue severity, score dimensions and check names, the site-average and benchmark lines, the Schema injection status and the plan period. They were hard-coded in Traditional Chinese, so sites in other languages saw Chinese labels.<\/li>\n<li>Settings: the free-plan feature list shows the AI Affinity Score\u2122 name in the site's language.<\/li>\n<li>Internal: the server log line for an unreadable API key is now in English.<\/li>\n<li>Translation template (.pot) regenerated; removed strings left over from the in-plugin checkout removed in 1.13.0.<\/li>\n<\/ul>\n\n<h4>1.13.3<\/h4>\n\n<ul>\n<li>Dashboard: removed the upgrade banner. Paid plans cannot be purchased yet, so it pointed to something that was not available.<\/li>\n<li>The \"scan quota used\" message no longer suggests upgrading; it says when the quota resets.<\/li>\n<li>Readme: the feature list now matches what the plugin does today.<\/li>\n<li>Internal: the Schema cache now uses this plugin's own prefix (geolens_schema_cache_). Old cache entries expire on their own within six hours.<\/li>\n<\/ul>\n\n<h4>1.13.2<\/h4>\n\n<ul>\n<li>Plugin name: now \"GeoLens \u2013 AI Search Schema Checker\".<\/li>\n<li>Fix: fatal error on front-end requests when no other plugin had loaded wp-admin\/includes\/plugin.php (conflict detection now loads it itself).<\/li>\n<li>Readme: corrected the conflict-detection plugin list to match what is implemented.<\/li>\n<li>WordPress.org build: translations are delivered by translate.wordpress.org; bundled .po\/.mo files are no longer shipped there.<\/li>\n<\/ul>\n\n<h4>1.13.1<\/h4>\n\n<ul>\n<li>Plugin header: \"Plugin URI\" now points to the features page (https:\/\/geolens.co\/features\/), separate from the \"Author URI\" (https:\/\/geolens.co), as WordPress.org requires.<\/li>\n<\/ul>\n\n<h4>1.13.0<\/h4>\n\n<ul>\n<li>Removed the in-plugin checkout. It was never reachable (paid plans are marked \"Coming soon\"); paid plans will be purchased on geolens.co.<\/li>\n<li>readme: the External Service section now also lists account creation, licence activation and deactivation, the dashboard and AI Citation requests, the daily licence check and the subscription cancel request.<\/li>\n<li>Tested up to WordPress 7.1.<\/li>\n<li>Code clean-up from the official Plugin Check: the PHP\/WordPress version notices are escaped at output, and a direct database query that clears this plugin's own cache is documented.<\/li>\n<\/ul>\n\n<h4>1.12.0<\/h4>\n\n<ul>\n<li>AI Citation trend: when the measurement tool behind a tracked question changes, the trend line is broken at that point and marked, with a note giving the date. Figures either side of that date come from different measurement platforms and are not directly comparable.<\/li>\n<li>Why this matters: in a same-question, same-model, same-project test the two measurement platforms returned overlapping cited-domain sets only 17-44% of the time, with real rank flips. Without the mark, a change of tooling would read as a change in your site.<\/li>\n<\/ul>\n\n<h4>1.11.2<\/h4>\n\n<ul>\n<li>AI Citation screen: full Traditional Chinese translation (21 new strings).<\/li>\n<\/ul>\n\n<h4>1.11.1<\/h4>\n\n<ul>\n<li>AI Citation screen: the empty state now explains where tracked questions actually come from (the free GEO check-up run with the same email address) and links to it, instead of saying they appear after a scan.<\/li>\n<\/ul>\n\n<h4>1.11.0<\/h4>\n\n<ul>\n<li>New \"AI Citation\" screen: see which sites AI assistants cite for the questions tracked for your site, and (on paid plans) how that changes over time.<\/li>\n<li>Questions with too few grounded samples are marked as such instead of being shown as a precise number.<\/li>\n<\/ul>\n\n<h4>1.10.0<\/h4>\n\n<ul>\n<li>WordPress.org submission preparation.<\/li>\n<li>readme: added a complete \"External Service\" disclosure. Every field the plugin sends to api.geolens.co is now listed, including the fact that a post's first 30 words are used when it has no excerpt.<\/li>\n<li>readme: added Frequently Asked Questions and Screenshots sections; \"Tested up to\" raised to 7.0.<\/li>\n<li>Build: the WordPress.org build contains no update code of its own and is updated only through WordPress.org.<\/li>\n<li>No behaviour change for existing self-hosted installations.<\/li>\n<\/ul>\n\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>\u65b9\u6848\u9801\u6539\u7248\uff1a\u514d\u8cbb\u7248\u7d0d\u5165\u300c\u81ea\u52d5 Schema \u6ce8\u5165\uff08\u5168\u7ad9\uff09\u300d\uff1b\u4ed8\u8cbb\u65b9\u6848\u805a\u7126\u300cAI \u5f15\u7528\u5ea6\u8ffd\u8e64\u300d\u3002<\/li>\n<li>Pro \/ Agency \u66f4\u65b0\u70ba NT$490 \/ NT$2,990\uff0c\u529f\u80fd\u4e0a\u7dda\u524d\u986f\u793a\u300c\u5373\u5c07\u63a8\u51fa\u300d\uff0c\u66ab\u4e0d\u958b\u653e\u7d50\u5e33\uff08\u4e0d\u9810\u6536\u672a\u4ea4\u4ed8\u670d\u52d9\u7684\u8cbb\u7528\uff09\u3002<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>\u8b8a\u66f4\uff1aSchema \u81ea\u52d5\u6ce8\u5165\u6539\u70ba\u6240\u6709\u65b9\u6848\u514d\u8cbb\uff08\u542b Free\uff09\uff0c\u4e0d\u518d\u9650\u5b9a\u4ed8\u8cbb\u65b9\u6848\u3002<\/li>\n<li>\u6ce8\u5165\u4ecd\u53ef\u7531\u300c\u8a2d\u5b9a \u2192 Schema \u6ce8\u5165\u300d\u958b\u95dc\u81ea\u884c\u95dc\u9589\uff1b\u5075\u6e2c\u5230\u5176\u4ed6 SEO \u5916\u639b\u885d\u7a81\u6642\u4e00\u6a23\u81ea\u52d5\u9000\u70ba\u5efa\u8b70\u6a21\u5f0f\u3002<\/li>\n<li>Free \u65b9\u6848\u767c\u5e03\u6587\u7ae0\u5f8c\u540c\u6a23\u6703\u81ea\u52d5\u88dc\u6383\uff0c\u8b93\u65b0\u5167\u5bb9\u7acb\u5373\u5e36\u6709 Schema\u3002<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>\u65b0\u589e\uff1a\u7d50\u5e33\u6642\u53ef\u586b\u96fb\u5b50\u767c\u7968\u8cc7\u8a0a\uff08\u500b\u4eba\u96f2\u7aef\u8f09\u5177\uff0f\u624b\u6a5f\u689d\u78bc\uff0f\u7d71\u4e00\u7de8\u865f\uff0f\u6350\u8d08\uff09\uff0c\u958b\u7acb\u65b9\u5f0f\u6703\u96a8\u8a02\u95b1\u4fdd\u5b58\uff0c\u6bcf\u671f\u6263\u6b3e\u6cbf\u7528\u3002<\/li>\n<li>\u672a\u586b\u6642\u9810\u8a2d\u958b\u7acb\u96f2\u7aef\u767c\u7968\u5bc4\u5230\u5e33\u865f Email\uff0c\u884c\u70ba\u8207\u5148\u524d\u4e00\u81f4\u3002<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>\u65b0\u589e\uff1a\u8a02\u95b1\u8005\u53ef\u5728\u300c\u65b9\u6848\u8207\u5b9a\u50f9\u300d\u9801\u81ea\u52a9\u53d6\u6d88\u8a02\u95b1\uff0c\u4e0d\u9700\u4f86\u4fe1\u5ba2\u670d\u3002<\/li>\n<li>\u53d6\u6d88\u6703\u5148\u7d42\u6b62\u91d1\u6d41\u7684\u5b9a\u671f\u6263\u6b3e\u59d4\u8a17\uff0c\u6210\u529f\u5f8c\u624d\u6a19\u8a18\u53d6\u6d88\uff1b\u7d42\u6b62\u5931\u6557\u6642\u4fdd\u7559\u8a02\u95b1\u4e26\u63d0\u793a\u806f\u7d61\u5ba2\u670d\uff0c\u907f\u514d\u300c\u756b\u9762\u986f\u793a\u5df2\u53d6\u6d88\u3001\u91d1\u6d41\u4ecd\u6263\u6b3e\u300d\u3002<\/li>\n<li>\u53d6\u6d88\u5f8c\u4ecd\u53ef\u4f7f\u7528\u81f3\u672c\u671f\u7d50\u675f\uff0c\u5c4a\u6642\u81ea\u52d5\u964d\u70ba\u514d\u8cbb\u7248\u3002<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>\u65b0\u589e\uff1a\u5167\u5bb9\u767c\u5e03\u5f8c\u81ea\u52d5\u88dc\u6383\u4e00\u6b21\uff0c\u8b93\u65b0\u9801\u9762\u7acb\u523b\u53d6\u5f97 Schema\uff0c\u4e0d\u5fc5\u7b49\u5f85\u6bcf\u65e5\u6392\u7a0b\uff08\u5148\u524d\u65b0\u6587\u7ae0\u5728\u4e0b\u6b21\u6392\u7a0b\u524d\u6c92\u6709\u7d50\u69cb\u5316\u8cc7\u6599\uff09\u3002<\/li>\n<li>\u9023\u7e8c\u767c\u5e03\u6703\u5408\u4f75\u70ba\u55ae\u4e00\u6b21\u6383\u63cf\uff1b\u514d\u8cbb\u65b9\u6848\u8207\u505c\u7528\u6ce8\u5165\u6642\u4e0d\u89f8\u767c\uff0c\u907f\u514d\u6d88\u8017\u6383\u63cf\u914d\u984d\u3002<\/li>\n<\/ul>\n\n<h4>1.4.5 \u2014 2026-07-21<\/h4>\n\n<ul>\n<li>Fix: the upgrade button no longer gets stuck on \"Processing\u2026\" when checkout cannot be completed. The error message was shown correctly, but the button never went back to its normal state, so the page looked frozen and there was no obvious way to try again. It now returns to normal as soon as the message appears.<\/li>\n<\/ul>\n\n<h4>1.4.4 \u2014 2026-07-20<\/h4>\n\n<ul>\n<li>The yearly billing option is temporarily hidden while we finalise our payment provider arrangements. Monthly billing is unaffected and nothing about your current plan changes. Yearly pricing and the switch are kept in place rather than removed, so they can be brought back as soon as the arrangements are settled.<\/li>\n<\/ul>\n\n<h4>1.4.3 \u2014 2026-07-20<\/h4>\n\n<ul>\n<li>Your posts' author is now published with a link to their profile, not just a name. A name on its own gives an AI no way to check who wrote the piece, so GeoLens only counted it as half an answer; the link points at the author archive WordPress already creates for you. Worth pairing with a real bio on that author profile \u2014 the link is only as convincing as the page it leads to.<\/li>\n<\/ul>\n\n<h4>1.4.2 \u2014 2026-07-20<\/h4>\n\n<ul>\n<li>The big score on the dashboard is now labelled \"Homepage AI Affinity Score\", because that is what it has always been. It sits directly above the whole-site average, so without the label it read as a score for your entire site \u2014 two different numbers with no way to tell them apart. The score, the three dimensions below it and the benchmark all describe your homepage; the whole-site average and the per-page list cover the rest.<\/li>\n<\/ul>\n\n<h4>1.4.1 \u2014 2026-07-20<\/h4>\n\n<ul>\n<li>Fix: a whole-site scan now shows its real progress and final result. The scan page used to refresh once, 1.5 seconds after you pressed Scan \u2014 but the other pages are scanned in the background and take longer than that, so it always showed something like \"2 \/ 13 pages scanned\" and never updated. It looked as if GeoLens only scanned your homepage, and pressing Scan again just used up another scan from your monthly allowance. GeoLens now follows the scan through to the end, shows the page count as it climbs, and refreshes when every page is done.<\/li>\n<\/ul>\n\n<h4>1.4.0 \u2014 2026-07-16<\/h4>\n\n<ul>\n<li>Fix: the Schema GeoLens injects now follows your page's structure, not just its text. 1.3.1 kept the title, description and dates current, but the shape of the Schema still came from your last scan \u2014 so if you deleted a featured image, the Schema kept pointing at a picture that no longer exists; if you changed a page's URL, the whole Schema still described the old address. GeoLens now sends the page's current details when it fetches the Schema, and the server rebuilds it to match. Pages that already have Schema from another plugin are still left alone, exactly as before.<\/li>\n<\/ul>\n\n<h4>1.3.1 \u2014 2026-07-16<\/h4>\n\n<ul>\n<li>Fix: the Schema GeoLens injects could disagree with your page indefinitely. The injected <code>dateModified<\/code>, <code>description<\/code> and page title came from your last scan and were never refreshed, so editing a page left the structured data describing the old version \u2014 telling AI crawlers and search engines that your page is older, and less accurate, than it really is. GeoLens now fills those fields from the live page every time it injects, so they always match what a visitor sees. Everything else in the Schema still comes from your scan, as before.<\/li>\n<\/ul>\n\n<h4>1.3.0 \u2014 2026-07-16<\/h4>\n\n<ul>\n<li>Change: how GeoLens stores your API key has been reworked. Your key is still encrypted with your site's own security key (AUTH_KEY), but it now uses AES-256-GCM, which can tell an incorrect key from a correct one every time. The previous method could not: roughly 1 attempt in 256 would silently return corrupted data, which reached the server as an invalid key and reported \"licence invalid\" instead of the real problem. Existing sites upgrade automatically on first load \u2014 you do not need to re-enter anything.<\/li>\n<li>Fix: your plan and quota are no longer encrypted. They are not secrets, and encrypting them meant that a change to your site's AUTH_KEY silently reverted a Pro site to the free plan and switched Schema injection off, with no message anywhere. Rotating AUTH_KEY is a normal, officially supported WordPress operation (<code>wp config shuffle-salts<\/code>, and standard practice after a security incident), so this could happen to anyone following good security advice.<\/li>\n<li>New: GeoLens now records a fingerprint of the security key that encrypted your API key. If AUTH_KEY later changes, GeoLens can say so directly \u2014 \"your site's security key changed\" \u2014 instead of guessing from a failed decryption.<\/li>\n<li>Fix: a missing AUTH_KEY no longer causes a fatal error on the front end.<\/li>\n<\/ul>\n\n<h4>1.2.6 \u2014 2026-07-16<\/h4>\n\n<ul>\n<li>Fix: if your site's security keys (AUTH_KEY in wp-config.php) changed \u2014 after a rotation, restore, or migration \u2014 GeoLens could no longer decrypt the API key saved on your site, and behaved exactly as if the plugin had never been set up: the dashboard went blank and the Settings page offered a fresh sign-up. Registering again creates a brand-new, empty account, so the scan history appeared to be lost when it was not. GeoLens now recognises this state, tells you your account and history are safe, asks you to re-enter your existing key, and explicitly warns against registering again. The failure is also written to the error log once a day so it can be diagnosed.<\/li>\n<\/ul>\n\n<h4>1.2.5 \u2014 2026-07-15<\/h4>\n\n<ul>\n<li>Fix: free registration from the Settings page never worked \u2014 it called a malformed URL (the API prefix was added twice) and the server answered 404, so every new user saw a raw \"route could not be found\" error instead of getting an API key. The endpoint is now correct.<\/li>\n<li>Change: licence activation and free registration are no longer duplicated between two code paths. Both were implemented twice with drifting behaviour; they now share one implementation.<\/li>\n<\/ul>\n\n<h4>1.2.4 \u2014 2026-07-15<\/h4>\n\n<ul>\n<li>Fix: entering an incorrect API key on the Settings page overwrote your existing working key before activation was attempted, so a single typo both failed to activate and locked you out of the plugin until you re-entered the correct key. The key is now saved only after activation succeeds.<\/li>\n<\/ul>\n\n<h4>1.2.3 \u2014 2026-07-15<\/h4>\n\n<ul>\n<li>Fix: the admin interface appeared in Chinese on English sites. 120 of the plugin's 157 translatable strings had been written with Chinese source text, so they matched no entry in the translation catalogue and were shown as-is in every language. All source strings are now English and the catalogue has been rebuilt; Traditional Chinese sites look exactly as before.<\/li>\n<li>Fix: conflict advice from the Yoast \/ Rank Math \/ AIOSEO \/ Schema Premium detectors, the plugin name and description, and two scan error messages were hard-coded Chinese with no translation support at all. They are now translatable.<\/li>\n<li>Fix: several messages (licence deactivation, checkout validation, registration) shipped English-only and never had a Traditional Chinese translation. They do now.<\/li>\n<li>Fix: the upgrade link on the Settings page built its translatable text by concatenating a URL, which meant the string could never be translated in any language. It now uses a placeholder.<\/li>\n<\/ul>\n\n<h4>1.2.2 \u2014 2026-07-15<\/h4>\n\n<ul>\n<li>Fix: Schema injection could switch itself off after a scan and only come back on the next one. The scan read the page over HTTP and counted GeoLens's own injected Schema as \"this page already has Schema\", so the next scan produced no suggestions and injection stopped until the scan after that. GeoLens now marks its own output and ignores it while scanning, so a scanned page reports the Schema it has <em>without<\/em> GeoLens \u2014 injection stays on. Schema from other plugins (Yoast, Rank Math, Schema Premium, \u2026) is still detected exactly as before.<\/li>\n<\/ul>\n\n<h4>1.2.1 \u2014 2026-07-13<\/h4>\n\n<ul>\n<li>Change: Pricing now lists the full three-dimension analysis correctly (was mislabelled \"5-dimension \/ coming soon\") and shows it as included on every plan, matching what the dashboard already delivers<\/li>\n<\/ul>\n\n<h4>1.2.0 \u2014 2026-07-12<\/h4>\n\n<ul>\n<li>New: One-click updates \u2014 GeoLens now checks api.geolens.co for new releases and shows the \"Update now\" button on the Plugins screen, like any other plugin (no more manual re-download)<\/li>\n<li>Note: Existing 1.1.0 sites need one manual update to 1.2.0; every version after that updates with one click<\/li>\n<\/ul>\n\n<h4>1.1.0 \u2014 2026-07-11<\/h4>\n\n<ul>\n<li>New: Dashboard now shows the GEO Score v2 report \u2014 three-dimension breakdown (Technical \/ Content \/ Entity trust), whole-site average, per-page scores, \"what AI can't read\" \/ \"what already works\" findings, and a \"you vs the field\" benchmark<\/li>\n<li>Change: Score reads as \"58 \/ 100\"; the dashboard falls back to the legacy issue list for older scans<\/li>\n<\/ul>\n\n<h4>1.0.10 \u2014 2026-04-04<\/h4>\n\n<ul>\n<li>Fix: License valid flag not synced on plan upgrade \u2014 scan failed with \"License invalid\" after upgrading<\/li>\n<li>Fix: Clear license transient cache on dashboard sync to prevent stale isValid() check<\/li>\n<\/ul>\n\n<h4>1.0.9 \u2014 2026-04-04<\/h4>\n\n<ul>\n<li>Fix: Dashboard scan button broken due to undefined JS variable<\/li>\n<li>Fix: Schema injection toggle now persists correctly (WP get_option boolean fix)<\/li>\n<li>Fix: Free plan dashboard no longer shows \"Schema injection enabled\"<\/li>\n<li>Fix: Plan cache auto-sync from API on dashboard load (upgrade reflected immediately)<\/li>\n<li>Fix: Free plan and injection-disabled show \"Advisory Mode\" instead of \"Inject Mode\"<\/li>\n<li>Feature: Auto-enable Schema injection on plan upgrade<\/li>\n<li>Feature: Delete Tenant button in admin test panel<\/li>\n<li>Feature: Email confirmation field on register and checkout pages<\/li>\n<li>Feature: Legal links (Terms + Privacy) on checkout and Plugin pricing pages<\/li>\n<\/ul>\n\n<h4>1.0.8 \u2014 2026-04-03<\/h4>\n\n<ul>\n<li>Feature: Schema injection toggle \u2014 enable\/disable auto injection in Settings page<\/li>\n<li>Feature: Dashboard shows Schema injection status indicator<\/li>\n<li>Feature: Toggle switch with real-time AJAX save (no page reload needed)<\/li>\n<\/ul>\n\n<h4>1.0.7 \u2014 2026-04-03<\/h4>\n\n<ul>\n<li>Fix: Pricing page yearly display shows total price (NT$2,990\/year) instead of monthly average<\/li>\n<li>Fix: Current plan label shows actual billing period from API (not affected by period toggle)<\/li>\n<li>Feature: API returns billing_period field for accurate plan display<\/li>\n<li>Fix: Upgrade blocked with clear message showing current plan and expiry date<\/li>\n<li>i18n: Add monthlyBilling\/yearlyBilling localization strings<\/li>\n<\/ul>\n\n<h4>1.0.6 \u2014 2026-04-02<\/h4>\n\n<ul>\n<li>Fix: API Key activation flow \u2014 save new key on activate and re-create client<\/li>\n<li>Fix: Dashboard correctly distinguishes no-scan from no-license state<\/li>\n<li>Fix: Pass original API error code through WP_Error to frontend<\/li>\n<li>Improvement: Force browser JS cache refresh on version update<\/li>\n<\/ul>\n\n<h4>1.0.5 \u2014 2026-04-01<\/h4>\n\n<ul>\n<li>Feature: Send rich metadata (page type, post status, categories) for Schema generation<\/li>\n<li>Fix: Use wp_remote_get to capture frontend JSON-LD instead of admin-context wp_head<\/li>\n<li>Fix: Update JSON-LD regex to match script tags with extra attributes<\/li>\n<li>Fix: Support blog archive page (page_for_posts) in Schema Injector<\/li>\n<\/ul>\n\n<h4>1.0.4 \u2014 2026-04-01<\/h4>\n\n<ul>\n<li>i18n: Full Traditional Chinese translation for all admin UI<\/li>\n<li>i18n: Translate mode badge and severity labels in renderer.js<\/li>\n<li>Feature: Show page URL in issues detail list<\/li>\n<li>Fix: Correct Pro scan limit text (100 scans\/month)<\/li>\n<li>Fix: Mark unreleased features as \"coming soon\"<\/li>\n<\/ul>\n\n<h4>1.0.3 \u2014 2026-04-01<\/h4>\n\n<ul>\n<li>Feature: In-plugin free registration (email-based)<\/li>\n<li>Feature: \"Forgot API Key\" link for key recovery<\/li>\n<li>Fix: Correct forgot API Key link URL<\/li>\n<\/ul>\n\n<h4>1.0.2 \u2014 2026-03-31<\/h4>\n\n<ul>\n<li>Brand: Unify AI Affinity Score\u2122 naming across all plugin files<\/li>\n<\/ul>\n\n<h4>1.0.1 \u2014 2026-03-31<\/h4>\n\n<ul>\n<li>Brand: Unify AI naming conventions across plugin<\/li>\n<\/ul>\n\n<h4>1.0.0 \u2014 2026-03-29<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Schema health check and AI Affinity Score<\/li>\n<li>Auto Schema injection (Organization, WebSite, BreadcrumbList)<\/li>\n<li>Conflict detection (Yoast SEO, AIOSEO, Rank Math)<\/li>\n<li>Full i18n support (en, zh_TW)<\/li>\n<\/ul>","raw_excerpt":"Check how well AI search engines can read your site's structured data, and inject Schema.org JSON-LD to fill the gaps.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/379490","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=379490"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/geolensco"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=379490"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=379490"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=379490"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=379490"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=379490"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=379490"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}