All notable changes to GEO AI Search Optimization will be documented in this file.
- Fixed incorrect feature key
custom_order_storage→custom_order_tablesinFeaturesUtil::declare_compatibility(), which caused WooCommerce to flag the plugin as incompatible with High-Performance Order Storage
- Plugin display name changed from "GEO AI for WooCommerce" to "GEO AI Search Optimization" across all user-facing surfaces
- Updated Plugin Name header, settings page title, menu label, meta box title, dashboard widget title, admin notices, CLI status output, Quick Edit section title
- Slug, text domain, CSS classes, option keys, meta keys, REST namespace, and WP-CLI command remain unchanged for backward compatibility
decode_text()now detects and repairs mojibake from double UTF-8 encoding (latin1 DB connection → UTF-8 → UTF-8) viamb_convert_encodingfrom Windows-1252write_file()validates UTF-8 integrity viamb_check_encodingbefore writing static files- Excerpt descriptions (
wp_trim_wordsoutput) now passed throughdecode_text()to prevent HTML entities in plain text - Full content in llms-full.txt now passed through
decode_text()afterwp_trim_words - Taxonomy term descriptions now passed through
decode_text()afterwp_trim_words
- Plugin renamed from "GEO AI Woo" to "GEO AI Search Optimization"
- Slug changed from
geo-ai-wootogeo-ai-for-woocommerce - Text domain changed from
geo-ai-wootogeo-ai-for-woocommerce - Main plugin file renamed from
geo-ai-woo.phptogeo-ai-for-woocommerce.php - REST API namespace changed from
geo-ai-woo/v1togeo-ai-for-woocommerce/v1 - WP-CLI command changed from
wp geo-ai-wootowp geo-ai-for-woocommerce - All asset handles, CSS classes, HTML IDs, and admin page slugs updated
- Language files renamed from
geo-ai-woo-*.po/motogeo-ai-for-woocommerce-*.po/mo - Internal prefixes (
geo_ai_woo_,_geo_ai_woo_,Geo_Ai_Woo_) intentionally preserved for backward compatibility with existing installations
- Added
Requires Plugins: woocommerceheader to main plugin file - CLI export now writes to
wp_upload_dir()/geo-ai-for-woocommerce/instead of arbitrary paths
- Removed
JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINTflags fromwp_json_encode()in JSON-LD output (class-seo-headers.php) - Fixed unescaped API key field output in settings page (
class-settings.php)
- Fixed Cyrillic and multibyte character corruption (mojibake) in static llms.txt and llms-full.txt files
- Replaced
WP_Filesystem::put_contents()with directfile_put_contents()— FTP transport was corrupting multibyte characters during file write - Added
decode_text()helper — decodes HTML entities to UTF-8 per-field (titles, descriptions, keywords, taxonomy names) instead of relying on a single pass at the end
- Added
defined('GEO_AI_WOO_VERSION')guard in main plugin file — prevents fatal error when two copies of the plugin are installed - Added admin notice that detects and warns about duplicate plugin copies
- Default OpenAI model placeholder updated from
gpt-4o-minitogpt-5
- German (de_DE) translation
- French (fr_FR) translation
- Updated documentation with new domain geoai.run
- Added ecosystem overview
- Removed UTF-8 symbols (✓/✗) from crawler rules in llms.txt output — now uses plain ASCII
Allowed/Blockedfor maximum parser compatibility
- Version bump 0.5.4 → 0.5.4.1
- New
Geo_Ai_Woo_Content_Sanitizerclass — centralized content cleaning pipeline for all AI-facing output - Removes page builder markup: WP Bakery (
vc_*,mk_*), Divi (et_pb_*), Beaver Builder (fl_builder_*), Elementor/Gutenberg HTML comments - Removes registered and unregistered WordPress shortcodes (paired and self-closing)
- Strips
<script>and<style>tags with their contents - Removes inline base64-encoded data (embedded images, fonts, etc.)
- Fixes mojibake artifacts from double UTF-8 encoding (curly quotes, em/en dashes, ellipsis, primes)
- Decodes HTML entities to proper UTF-8 characters
- Normalizes whitespace (collapses multiple spaces/tabs/newlines, trims)
- Filter
geo_ai_woo_pre_sanitize— modify content before sanitization - Filter
geo_ai_woo_sanitized_content— modify final sanitized output (receives cleaned + original content) - Filter
geo_ai_woo_sanitize_patterns— add custom regex patterns for third-party page builders
class-llms-generator.php:get_content()now usesContent_Sanitizer::sanitize()for full content and excerptsclass-ai-generator.php:build_prompt()now usesContent_Sanitizer::sanitize()instead of separatestrip_shortcodes()+wp_strip_all_tags()class-woocommerce.php:build_product_description()now usesContent_Sanitizer::sanitize()for short descriptions- Version bump 0.5.3 → 0.5.4
includes/class-content-sanitizer.php— Content sanitization pipeline
- Replaced interpolated
$table_namein SQL queries with%iidentifier placeholder via$wpdb->prepare()inclass-crawl-tracker.php(drop_table,get_recent_activity,get_total_visits,cleanup_old_records) - Replaced interpolated
$table_nameinDROP TABLEquery with%iplaceholder inuninstall.php - Fixed phpcs:ignore placement for postmeta
DELETEquery inuninstall.php
- Minimum WordPress version raised from 6.0 to 6.2 (required for
%iidentifier placeholder support in$wpdb->prepare()) - Version bump 0.5.2 → 0.5.3
- claude-web (Anthropic / Claude Web)
- Amazonbot (Amazon / Alexa)
- Applebot (Apple / Siri & Spotlight)
- Version bump 0.5.1 → 0.5.2
- Supported AI crawlers expanded from 13 to 16
- Fixed unescaped URL output in SEO meta tags (
class-seo-headers.php) —esc_url()now applied at echo, not at assignment - Fixed
translators:comment placement inclass-admin-notices.phpandclass-settings.php— moved directly above__()/esc_html__()calls - Fixed unsanitized nonce input in
class-meta-box.php,class-bulk-edit.php, andclass-woocommerce.php— addedsanitize_text_field()beforewp_verify_nonce() - Fixed unprefixed global variables in
uninstall.php— wrapped cleanup logic ingeo_ai_woo_uninstall()function - Added PHPCS ignore annotations for legitimate direct DB queries in
class-crawl-tracker.php(custom table operations) - Added PHPCS ignore annotations for third-party WPML/TranslatePress hooks and globals in
class-multilingual.php - Expanded PHPCS ignore annotations in
uninstall.phpforDirectQuery,NoCaching,SchemaChange, andUnfinishedPrepare
- Version bump 0.5.0 → 0.5.1
- OAI-SearchBot (OpenAI / Copilot Search)
- DeepSeekBot (DeepSeek)
- GrokBot (xAI / Grok)
- meta-externalagent (Meta / LLaMA)
- PanguBot (Alibaba / Qwen)
- Version bump 0.4.1 → 0.5.0
- Supported AI crawlers expanded from 8 to 13
- Default bot_rules now include all 13 crawlers (set to "allow" by default)
- Existing installations receive new bot rules via settings migration on update
- Turkish (tr_TR) translation
- Spanish (es_ES) translation
- Brazilian Portuguese (pt_BR) translation
- Fixed Cyrillic and special character encoding in llms.txt output
- HTML entities (
₸,—,», etc.) are now properly decoded to UTF-8 characters - Tenge symbol (₸), em dashes (—), guillemets (») and other non-ASCII characters display correctly
- "Third-Party Services" disclosure section in readme.txt (Anthropic and OpenAI API usage, ToS and Privacy Policy links)
- API data disclosure notice in AI Description Generation settings section
- Links to Anthropic and OpenAI privacy policies in admin UI
load_plugin_textdomain()call — translations are loaded automatically by WordPress.org
- Version bump 0.3.0 → 0.4.0
- Reduced readme.txt tags from 9 to 5 (WordPress.org guideline 12 compliance)
- Updated "Tested up to" to WordPress 6.9
- WPML, Polylang, and TranslatePress abstraction layer
- Per-language
llms-{lang}.txtandllms-full-{lang}.txtstatic file generation - Hreflang alternate
<link>tags in SEO meta output - Language-aware HTTP Link header
- Configurable multilingual toggle in Advanced Settings
- Filter
geo_ai_woo_multilingual_providerfor custom provider override
- WordPress Dashboard widget with content overview (indexed/excluded counts, file status)
- AI bot crawl tracker with database-backed visit logging
- Bot activity summary for last 30 days in dashboard widget
- GDPR-compliant IP anonymization (hashed, not stored raw)
- Auto-cleanup of tracking records older than 90 days
- Quick links to Settings and View llms.txt in dashboard widget
- Configurable crawl tracking toggle in Advanced Settings
GET /wp-json/geo-ai-for-woocommerce/v1/llms— public llms.txt contentGET /wp-json/geo-ai-for-woocommerce/v1/llms/full— public llms-full.txt contentGET /wp-json/geo-ai-for-woocommerce/v1/status— admin-only file status and statisticsPOST /wp-json/geo-ai-for-woocommerce/v1/regenerate— admin-only force regeneration (rate-limited)GET /wp-json/geo-ai-for-woocommerce/v1/settings— admin-only current settings (API key masked)
wp geo-ai-for-woocommerce regenerate— regenerate all llms.txt fileswp geo-ai-for-woocommerce status— show file status, content counts, multilingual infowp geo-ai-for-woocommerce export [--file=path]— export settings to JSON (excludes API keys)wp geo-ai-for-woocommerce import <file> [--regenerate]— import settings with key validation
- Claude (Anthropic) and OpenAI API integration for AI description generation
- "Generate with AI" button in post meta box and WooCommerce product panel
- Customizable prompt template with
{title},{content},{type}placeholders - Bulk generation for posts without descriptions (up to 50, batched)
- Progress bar UI for bulk generation
- Rate limiting (10 requests/minute)
- Encrypted API key storage (base64)
- Settings section: provider, API key, model, max tokens, prompt template
includes/class-multilingual.php— WPML/Polylang/TranslatePress abstractionincludes/class-dashboard-widget.php— Dashboard stats widgetincludes/class-crawl-tracker.php— AI bot visit trackingincludes/class-rest-api.php— REST API endpointsincludes/class-cli.php— WP-CLI commandsincludes/class-ai-generator.php— Claude/OpenAI AI generation
- Version bump 0.2.0 → 0.3.0
- Settings migration adds v0.3 defaults (multilingual, crawl tracking, AI generation)
generate()method now accepts optional$lang_codeparameterwrite_static_files()generates per-language files when multilingual is activeregenerate_cache()storesgeo_ai_woo_last_regeneratedtimestampserve_llms_txt()fallback now logs bot visits via crawl tracker- Admin JS extended with AI generate button and bulk generate handlers
- Uninstall cleanup extended for crawl table, multilingual files, and new transients
- Static llms.txt and llms-full.txt file generation to WordPress root for maximum performance
- WooCommerce HPOS (High-Performance Order Storage) compatibility declaration
- Lazy WooCommerce integration loading (deferred to
inithook) - Automatic settings migration from v0.1 to v0.2
- robots.txt integration with per-bot User-agent/Allow/Disallow directives
- Categories, tags, and WooCommerce product taxonomies in llms.txt
- Configurable taxonomy inclusion setting
- Site URL and file links in llms.txt header section
- Filter
geo_ai_woo_taxonomiesfor custom taxonomy control
- Variable products support with price ranges (min – max)
- Product reviews and average ratings in auto-generated descriptions
- Sale price display: "Price: $35 (was $50)"
- Available variation attributes (e.g., "Color: Red, Blue, Green")
- Hide out-of-stock products option (follows WC setting or override)
- Enhanced product schema with aggregateRating data
- Live preview of llms.txt content on settings page via AJAX
- "AI Status" column in posts/pages/products list tables
- Quick Edit support for AI Description, AI Keywords, and Exclude flag
- Admin notice on plugin activation with settings page link
- File health notice when llms.txt is missing or older than 7 days
- Permalink structure warning when set to "Plain"
- Dismissible notices with AJAX persistence (30-day memory)
<meta name="llms">and<meta name="llms-full">tags in page<head>- Per-post
<meta name="ai-description">and<meta name="ai-keywords">tags - HTTP Link header:
Link: <.../llms.txt>; rel="ai-content-index" - JSON-LD Schema.org structured data (WebSite on front page, Article/Product on singles)
- Automatic detection of SEO plugins (Yoast, Rank Math, AIOSEO, SEOPress) to avoid schema conflicts
- 6 new configurable settings for SEO features
includes/class-seo-headers.php— Meta tags, HTTP headers, JSON-LDincludes/class-bulk-edit.php— List table columns, Quick Edit integrationincludes/class-admin-notices.php— Activation, health, and permalink notices
- llms.txt and llms-full.txt automatic generation
- AI meta box for posts, pages, and custom post types
- Bot rules configuration for 8 AI crawlers (GPTBot, ClaudeBot, Google-Extended, PerplexityBot, YandexBot, SputnikBot, Bytespider, Baiduspider)
- WooCommerce product data panel with AI optimization
- Auto-generate product descriptions from product data
- Enhanced product schema for AI readability
- Configurable cache with 4 frequency options
- Settings page under Settings > GEO AI Search Optimization
- Plugin action link for quick access to settings
- Multilingual support with 7 languages (EN, RU, KK, UZ, ZH, ID, HI)
- Uninstall cleanup for options, transients, and post meta