WP Manifestindependent plugin directory
manifest / seo / jat-search-intel

JAT Search Intel

A comprehensive SEO, AEO (Answer Engine Optimization), and GEO (Generative Engine Optimization) plugin for WordPress.

★ 0stars

Install

Download source zip No release zip yet

This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/cptnope/jat-search-intel/archive/refs/heads/main.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

The first WordPress plugin built for all three pillars of modern search visibility: SEO, AEO, and GEO.

Roadmap · Changelog · Contributing · License


Table of Contents


Overview

JAT Search Intel optimizes WordPress content across three dimensions:

Pillar Target What It Optimizes For
SEO Google, Bing, traditional crawlers Meta tags, Open Graph, Twitter Cards, sitemaps, schema
AEO Featured snippets, voice assistants, PAA FAQ/HowTo schema, Speakable, concise answer formatting
GEO ChatGPT, Perplexity, Google AI Overviews AI summaries, llms.txt, entity markup, E-E-A-T, freshness
graph LR
    subgraph "JAT Search Intel Plugin"
        SEO["SEO Module"]
        AEO["AEO Module"]
        GEO["GEO Module"]
    end

    subgraph "Traditional Search"
        G["Google"]
        B["Bing"]
        Y["Yahoo"]
    end

    subgraph "Answer Engines"
        FS["Featured Snippets"]
        VA["Voice Assistants"]
        PAA["People Also Ask"]
    end

    subgraph "Generative AI"
        GPT["ChatGPT"]
        PER["Perplexity"]
        AIO["AI Overviews"]
        COP["Copilot"]
    end

    SEO --> G
    SEO --> B
    SEO --> Y
    AEO --> FS
    AEO --> VA
    AEO --> PAA
    GEO --> GPT
    GEO --> PER
    GEO --> AIO
    GEO --> COP

Architecture

High-Level Module Architecture

graph TD
    BOOT["jat-search-intel.php<br/><i>Bootstrap & Autoloader</i>"]
    CORE["Core<br/><i>Singleton Orchestrator</i>"]

    BOOT --> CORE

    CORE --> TITLE["Title Engine"]
    CORE --> SEO["SEO Manager"]
    CORE --> SCHEMA["Schema Manager"]
    CORE --> AEO["AEO Manager"]
    CORE --> GEO["GEO Manager"]
    CORE --> ANALYZER["Content Analyzer"]
    CORE --> SITEMAP["Sitemap"]
    CORE --> ADMIN["Admin<br/><i>only in wp-admin</i>"]
    CORE --> REST["REST API<br/><i>v1.3+</i>"]
    CORE --> BULK["Bulk Tools<br/><i>v1.3+</i>"]
    CORE --> BLOCKS["Blocks<br/><i>v1.4+ Block Editor</i>"]
    CORE --> PRIVACY["Privacy<br/><i>v1.5+ GDPR</i>"]
    CORE --> REDIRECTS["Redirects<br/><i>v2.0+ 301/302/307/410</i>"]
    CORE --> INDEXNOW["IndexNow<br/><i>v2.0+ Ping API</i>"]
    CORE --> WOO["WooCommerce<br/><i>v2.0+ Product Schema</i>"]
    CORE --> LOCALBIZ["Local Business<br/><i>v2.0+ Schema</i>"]
    CORE --> ROBOTSTXT["Robots.txt<br/><i>v2.0+ Editor</i>"]
    CORE --> AUDITLOG["Audit Log<br/><i>v2.0+ Tracking</i>"]
    CORE --> SCHEMATYPES["Schema Types<br/><i>v2.1+ Video, Recipe, etc.</i>"]
    CORE --> QADETECT["Q&A Detector<br/><i>v2.1+ Pattern Engine</i>"]
    CORE --> FAQGEN["FAQ Generator<br/><i>v2.1+ AI-Assisted</i>"]
    CORE --> LINKCHECK["Link Checker<br/><i>v2.0.1+ Broken Links</i>"]
    CORE --> INTLINKER["Internal Linker<br/><i>v2.0.1+ Suggestions</i>"]
    CORE --> VISDASH["Visibility Dashboard<br/><i>v2.5+ AI Visibility</i>"]
    CORE --> CITGRAPH["Citation Graph<br/><i>v2.5+ Link Topology</i>"]
    CORE --> AUTHMAP["Authority Map<br/><i>v2.5+ Topic Authority</i>"]
    CORE --> MULTISITE["Multisite<br/><i>v3.0+ Network Settings</i>"]
    CORE --> MIGRATION["Migration<br/><i>v3.0+ SEO Plugin Import</i>"]
    CORE --> RBAC["RBAC<br/><i>v3.0+ Roles &amp; Caps</i>"]
    CORE --> MULTILANG["Multilang<br/><i>v3.0+ WPML/Polylang</i>"]
    CORE --> SCALE["Scale<br/><i>v3.0+ Queue &amp; Cache</i>"]
    CORE --> NOTIFY["Notifications<br/><i>v3.1+ Alerts &amp; Digest</i>"]
    CORE --> AIENGINE["AI Engine<br/><i>v3.2+ LLM Abstraction</i>"]
    CORE --> DECAY["Content Decay<br/><i>v3.2+ Score Tracking</i>"]
    CORE --> CANNIBAL["Cannibalization<br/><i>v3.2+ Keyword Detector</i>"]
    CORE --> ADVLINK["Advanced Linking<br/><i>v3.2+ Suggestions</i>"]
    CORE --> ANALYTICS["Historical Analytics<br/><i>v3.3+ Score Charts</i>"]
    CORE --> GA4["GA4 Integration<br/><i>v3.3+ Traffic Correlation</i>"]
    CORE --> CWV["Core Web Vitals<br/><i>v3.3+ PageSpeed</i>"]
    CORE --> REPORTS["Custom Reports<br/><i>v3.3+ PDF/CSV/JSON</i>"]

    TITLE --> TVAR["Variable Resolver"]
    TITLE --> TCTX["Per-Context Templates"]

    SEO --> META["Meta Tags"]
    SEO --> OG["Open Graph"]
    SEO --> TW["Twitter Cards"]
    SEO --> CAN["Canonical URLs"]
    SEO --> ROB["Robots Meta"]

    SCHEMA --> JSONLD["JSON-LD @graph"]
    SCHEMA --> BREAD["BreadcrumbList"]
    SCHEMA --> SITE["WebSite + SearchAction"]
    SCHEMA --> KG["Knowledge Graph"]

    AEO --> FAQ["FAQPage Schema"]
    AEO --> HOWTO["HowTo Schema"]
    AEO --> SPEAK["Speakable"]
    AEO --> AUTODETECT["Auto-detect FAQs"]
    AEO --> DIRECTANS["Direct Answer Meta"]
    AEO --> QAPAT["Q&A Detection"]
    AEO --> SNIPPET["Snippet Scoring"]

    GEO --> AIMETA["AI Meta Tags"]
    GEO --> LLMS["llms.txt Endpoint"]
    GEO --> ENTITY["Entity Markup"]
    GEO --> EEAT["E-E-A-T Schema"]
    GEO --> FRESH["Freshness Signals"]
    GEO --> AIBOT["AI Crawl Directives"]
    GEO --> INTENT["Intent & Audience Meta"]
    GEO --> LOCAL["Local Relevance"]

    ADMIN --> SETTINGS["Settings Pages x6"]
    ADMIN --> METABOX["Post Metabox"]
    ADMIN --> COLUMNS["Admin Columns"]
    ADMIN --> USERFIELDS["User E-E-A-T Fields"]

    REST --> RENDPOINTS["9 Endpoints<br/><i>scores, geo, meta, analyze,<br/>bulk, settings, sitemap</i>"]

    BULK --> BRESCORE["Batch Rescore"]
    BULK --> BREGEN["Batch Regenerate"]
    BULK --> BEXPORT["Export / Import"]

    BLOCKS --> SIDEBAR["Sidebar Panel<br/><i>SEO · AEO · GEO · Analysis</i>"]
    BLOCKS --> BFAQ["FAQ Block"]
    BLOCKS --> BHOWTO["HowTo Block"]
    BLOCKS --> BTOC["TOC Block<br/><i>dynamic</i>"]
    BLOCKS --> BCRUMB["Breadcrumbs Block<br/><i>dynamic</i>"]
    BLOCKS --> BANSWER["Answer Box Block"]
    BLOCKS --> BCITE["Citation Block"]

    PRIVACY --> EXPORTER["Data Exporter<br/><i>wp_privacy_personal_data_exporters</i>"]
    PRIVACY --> ERASER["Data Eraser<br/><i>wp_privacy_personal_data_erasers</i>"]
    PRIVACY --> PPOLICY["Privacy Policy Text<br/><i>wp_add_privacy_policy_content</i>"]

    REDIRECTS --> REXACT["Exact / Prefix / Regex"]
    REDIRECTS --> R404["404 Log + Auto-suggest"]
    REDIRECTS --> RCSV["CSV Import / Export"]
    REDIRECTS --> RSLUG["Slug Change Detection"]

    INDEXNOW --> INBING["Bing / Yandex / Naver"]
    INDEXNOW --> INLOG["Ping Log"]

    WOO --> WPROD["Product Schema"]
    WOO --> WOFFER["Offer + Rating"]
    WOO --> WBREAD["Product Breadcrumbs"]

    LOCALBIZ --> LADDR["PostalAddress + Geo"]
    LOCALBIZ --> LHOURS["Opening Hours"]
    LOCALBIZ --> LMULTI["Multi-Location"]

    ROBOTSTXT --> RTEDIT["Visual Editor"]
    ROBOTSTXT --> RTVALID["Syntax Validation"]

    AUDITLOG --> ALDIFF["Settings Diff"]
    AUDITLOG --> ALUSER["User Attribution"]

    style CORE fill:#2563eb,color:#fff
    style SEO fill:#16a34a,color:#fff
    style AEO fill:#d97706,color:#fff
    style GEO fill:#9333ea,color:#fff
    style TITLE fill:#0d9488,color:#fff
    style ANALYZER fill:#0891b2,color:#fff
    style ADMIN fill:#dc2626,color:#fff
    style REST fill:#ea580c,color:#fff
    style BULK fill:#be185d,color:#fff
    style BLOCKS fill:#7c3aed,color:#fff
    style PRIVACY fill:#059669,color:#fff
    style REDIRECTS fill:#b91c1c,color:#fff
    style INDEXNOW fill:#0369a1,color:#fff
    style WOO fill:#7e22ce,color:#fff
    style LOCALBIZ fill:#a16207,color:#fff
    style ROBOTSTXT fill:#4d7c0f,color:#fff
    style AUDITLOG fill:#64748b,color:#fff

Class Dependency Map

classDiagram
    class Core {
        -instance : Core
        +title_engine : Title_Engine
        +seo : SEO_Manager
        +schema : Schema_Manager
        +aeo : AEO_Manager
        +geo : GEO_Manager
        +analyzer : Content_Analyzer
        +sitemap : Sitemap
        +admin : Admin
        +rest_api : REST_Api
        +bulk_tools : Bulk_Tools
        +blocks : Blocks
        +privacy : Privacy
        +redirects : Redirect_Manager
        +indexnow : IndexNow
        +woocommerce : WooCommerce
        +local_business : Local_Business
        +robots_txt : Robots_Txt
        +audit_log : Audit_Log
        +schema_types : Schema_Types
        +qa_detector : QA_Detector
        +faq_generator : FAQ_Generator
        +link_checker : Link_Checker
        +internal_linker : Internal_Linker
        +visibility_dashboard : Visibility_Dashboard
        +citation_graph : Citation_Graph
        +authority_map : Authority_Map
        +multisite : Multisite
        +migration : Migration
        +rbac : RBAC
        +multilang : Multilang
        +scale : Scale
        +notifications : Notifications
        +ai_engine : AI_Engine
        +content_decay : Content_Decay
        +keyword_cannibalization : Keyword_Cannibalization
        +advanced_linking : Advanced_Linking
        +get_instance() Core
        +get_settings() array
        +get_default_settings() array
    }

    class Title_Engine {
        -settings : array
        +resolve_title() string
        +resolve_variables(template, context) string
        +get_default_templates() array
    }

    class SEO_Manager {
        -settings : array
        +get_title(post_id) string
        +get_description(post_id) string
        +render_meta_tags() void
        +render_canonical() void
        +render_robots_meta() void
        +render_open_graph() void
        +render_twitter_card() void
    }

    class Schema_Manager {
        -settings : array
        +render_schema() void
        +get_singular_schema(post_id) array
        -get_knowledge_graph() array
        -get_website_schema() array
        -get_breadcrumbs_schema() array
    }

    class AEO_Manager {
        -settings : array
        +get_faq_schema(post_id) array
        +get_howto_schema(post_id) array
        +render_speakable() void
        +render_direct_answer_meta() void
        +detect_qa_patterns(content) array
        +get_snippet_score(content) array
        +auto_lead_summary(excerpt, post) string
        +get_aeo_score(post_id) array
        -auto_detect_faqs(post_id) array
    }

    class GEO_Manager {
        -settings : array
        +render_ai_meta() void
        +serve_llms_txt() void
        +enhance_content_entities(content) string
        +render_author_eeat() void
        +get_geo_score(post_id) array
        -auto_extract_topics(post_id) array
    }

    class Content_Analyzer {
        -settings : array
        +analyze(post_id, content, title, keyword, desc) array
        +get_readability_score(text) array
        +ajax_analyze() void
        +analyze_on_save(post_id, post) void
        -get_content_checks(post_id, content, text, word_count) array
        -count_syllables(text) int
    }

    class Sitemap {
        -settings : array
        +register_endpoints() void
        +serve_sitemap() void
        +ping_search_engines(post_id) void
        +invalidate_cache() void
        -generate_sitemap_index() string
        -generate_sitemap(type, page) string
    }

    class Admin {
        -settings : array
        -core : Core
        +register_menu() void
        +register_metaboxes() void
        +save_metabox_data(post_id) void
        +render_user_eeat_fields(user) void
    }

    class REST_Api {
        -settings : array
        -core : Core
        +register_routes() void
        +get_scores(request) WP_REST_Response
        +get_geo(request) WP_REST_Response
        +get_meta(request) WP_REST_Response
        +update_meta(request) WP_REST_Response
        +analyze(request) WP_REST_Response
    }

    class Bulk_Tools {
        -settings : array
        -core : Core
        +ajax_bulk_rescore() void
        +ajax_bulk_regenerate() void
        +ajax_export_settings() void
        +ajax_import_settings() void
    }

    class Blocks {
        -META_KEYS : array
        +register_blocks() void
        +register_meta() void
        +enqueue_sidebar() void
        +render_toc(attributes, content) string
        +render_breadcrumbs(attributes, content) string
    }

    class Privacy {
        -USER_META_KEYS : array
        +register_exporter(exporters) array
        +register_eraser(erasers) array
        +export_personal_data(email, page) array
        +erase_personal_data(email, page) array
        +add_privacy_policy_content() void
    }

    class Redirect_Manager {
        -settings : array
        +maybe_redirect() void
        +log_404() void
        +find_matching_redirect(path) object
        +save_redirect(data) int
        +delete_redirect(id) bool
        +export_csv() string
        +import_csv(csv) array
        +detect_slug_change(post_id, post, before) void
        +create_tables() void
    }

    class IndexNow {
        -settings : array
        +ping_on_publish(post_id) void
        +submit_url(url) array
        +serve_key_file() void
        +get_log() array
        +clear_log() void
    }

    class WooCommerce {
        -settings : array
        +is_woocommerce_active() bool
        +inject_product_schema(schema, post_id) array
        +get_offer_schema(product) array
        +get_aggregate_rating(product) array
        +product_breadcrumbs(crumbs, post_id) array
    }

    class Local_Business {
        -settings : array
        +render_schema() void
        +build_location_schema(location) array
        +build_address(location) array
        +build_geo(location) array
        +build_opening_hours(location) array
    }

    class Robots_Txt {
        -settings : array
        +filter_robots_txt(output, public) string
        +get_content() string
        +save_content(content) bool
        +validate(content) array
    }

    class Audit_Log {
        -settings : array
        +log_settings_change(old, new) void
        +add_entry(action, details) void
        +get_log() array
        +clear_log() void
        +diff_settings(old, new) array
    }

    Core --> Title_Engine
    Core --> SEO_Manager
    Core --> Schema_Manager
    Core --> AEO_Manager
    Core --> GEO_Manager
    Core --> Content_Analyzer
    Core --> Sitemap
    Core --> Admin
    Core --> REST_Api
    Core --> Bulk_Tools
    Core --> Blocks
    Core --> Privacy
    Core --> Redirect_Manager
    Core --> IndexNow
    Core --> WooCommerce
    Core --> Local_Business
    Core --> Robots_Txt
    Core --> Audit_Log
    Core --> Schema_Types
    Core --> QA_Detector
    Core --> FAQ_Generator
    Core --> Link_Checker
    Core --> Internal_Linker
    Core --> Visibility_Dashboard
    Core --> Citation_Graph
    Core --> Authority_Map
    Core --> Multisite
    Core --> Migration
    Core --> RBAC
    Core --> Multilang
    Core --> Scale
    Core --> Notifications
    Core --> AI_Engine
    Core --> Content_Decay
    Core --> Keyword_Cannibalization
    Core --> Advanced_Linking
    Admin --> Core
    REST_Api --> Core
    Bulk_Tools --> Core


    class Notifications {
        -settings : array
        +schedule_events() void
        +get_thresholds() array
        +snapshot_post_scores(post_id, scores) void
        +check_score_drops() void
        +send_weekly_digest() void
        +send_slack_alert(message) bool
        +register_dashboard_widget() void
        +build_digest_summary() array
        +get_notification_email() string
    }

    class Migration {
        -settings : array
        +detect_sources() array
        +migrate(source, options) array
        +dry_run(source) array
        +render_admin_page() void
    }

    class RBAC {
        -settings : array
        +ensure_role_exists() void
        +check_module_access(user_id, module) bool
        +grant_module(user_id, module) void
        +revoke_module(user_id, module) void
        +get_permissions_summary() array
    }

    class Scale {
        -settings : array
        +enqueue_job(type, post_id) void
        +process_queue() void
        +cache_get(key) mixed
        +cache_set(key, value) bool
        +render_admin_page() void
    }


    class AI_Engine {
        -settings : array
        +get_providers() array
        +get_active_provider() string
        +get_model() string
        +encrypt(plaintext) string
        +decrypt(ciphertext) string
        +save_api_key(provider, key) void
        +get_api_key(provider) string
        +is_configured() bool
        +is_rate_limited() bool
        +is_budget_exceeded() bool
        +chat(system, user, options) array
        +generate_meta_description(content, keyword, title) array
        +generate_title_suggestions(content, keyword, title) array
        +generate_link_recommendations(post_id, candidates, content) array
        +generate_content_brief(topic, titles, gaps) array
    }

    class Content_Decay {
        -settings : array
        +store_snapshot(post_id, scores) void
        +get_score_history(post_id) array
        +detect_decay(post_id) array
        +run_decay_check() array
        +get_decaying_posts(limit) array
        +get_refresh_suggestions(post_id) array
        +get_trend_data(post_id, module, days) array
        +get_score_change(post_id, module, days) array
    }

    class Keyword_Cannibalization {
        -settings : array
        +build_keyword_index(post_type) array
        +normalize_keyword(keyword) string
        +generate_report(use_cache) array
        +suggest_action(posts) array
        +get_link_relationships(post_ids) array
        +get_summary() array
    }

    class Advanced_Linking {
        -settings : array
        +get_suggestions(post_id, content, limit) array
        +extract_keywords(text) array
        +is_orphaned(post_id) bool
        +get_orphaned_posts(limit) array
        +get_equity_flow(limit) array
        +check_internal_links(post_id) array
        +run_broken_link_check() array
    }

Data Flow

Frontend Output Pipeline

flowchart TD
    WP["WordPress wp_head Action"] --> SEO_OUT
    WP --> SCHEMA_OUT
    WP --> AEO_OUT
    WP --> GEO_OUT

    subgraph SEO_OUT["SEO Manager Output (priority 1-5)"]
        M1["meta description"]
        M2["meta author"]
        M3["link canonical"]
        M4["meta robots"]
        M5["meta og:*"]
        M6["meta twitter:*"]
    end

    subgraph SCHEMA_OUT["Schema Manager Output (priority 10)"]
        S1["script type=application/ld+json"]
        S1 --> S2["@graph: Organization"]
        S1 --> S3["@graph: WebSite"]
        S1 --> S4["@graph: BreadcrumbList"]
        S1 --> S5["@graph: Article/WebPage"]
    end

    subgraph AEO_OUT["AEO Manager Output (priority 11-13)"]
        A1["FAQPage JSON-LD"]
        A2["HowTo JSON-LD"]
        A3["Speakable JSON-LD"]
        A4["Direct-answer meta"]
    end

    subgraph GEO_OUT["GEO Manager Output (priority 3-13)"]
        G1["AI crawl directives"]
        G2["AI meta tags"]
        G3["Freshness meta"]
        G4["Author E-E-A-T JSON-LD"]
        G5["Intent & audience meta"]
        G6["Local relevance meta"]
    end

    style SEO_OUT fill:#d1fae5,stroke:#16a34a
    style SCHEMA_OUT fill:#dbeafe,stroke:#2563eb
    style AEO_OUT fill:#fef3c7,stroke:#d97706
    style GEO_OUT fill:#ede9fe,stroke:#9333ea

Post Editor Data Flow

flowchart LR
    EDITOR["Post Editor"]
    EDITOR --> CLASSIC["Classic Editor<br/><i>PHP Metabox</i>"]
    EDITOR --> BLOCK["Block Editor<br/><i>Gutenberg Sidebar v1.4+</i>"]

    CLASSIC --> TAB_SEO["SEO Tab"]
    CLASSIC --> TAB_AEO["AEO Tab"]
    CLASSIC --> TAB_GEO["GEO Tab"]
    CLASSIC --> TAB_ADV["Advanced Tab"]
    CLASSIC --> TAB_ANALYSIS["Analysis Tab"]

    BLOCK --> SB_SEO["SEO Panel<br/><i>title, desc, keyword, canonical,<br/>robots, social, SERP preview</i>"]
    BLOCK --> SB_AEO["AEO Panel<br/><i>direct answer, schema type</i>"]
    BLOCK --> SB_GEO["GEO Panel<br/><i>AI summary, topics, intent,<br/>audience, local relevance</i>"]
    BLOCK --> SB_SCORE["Analysis Panel<br/><i>score rings, Run Analysis</i>"]

    TAB_SEO --> |"save_post"| PM["Post Meta<br/><i>28 _jat_search_intel_* keys</i>"]
    TAB_AEO --> |"save_post"| PM
    TAB_GEO --> |"save_post"| PM

    SB_SEO --> |"REST API<br/>wp.data"| PM
    SB_AEO --> |"REST API<br/>wp.data"| PM
    SB_GEO --> |"REST API<br/>wp.data"| PM

    TAB_ANALYSIS --> |"AJAX"| ANALYZER["Content Analyzer"]
    SB_SCORE --> |"REST API"| ANALYZER
    ANALYZER --> |"JSON response"| SCORES["SEO: 0-100<br/>AEO: 0-100<br/>GEO: 0-100<br/>Readability: 0-100"]

    style CLASSIC fill:#dc2626,color:#fff
    style BLOCK fill:#7c3aed,color:#fff

Sitemap Request Flow

sequenceDiagram
    participant Bot as Search Engine Bot
    participant WP as WordPress
    participant SM as Sitemap Module

    Bot->>WP: GET /sitemap.xml
    WP->>SM: query_var = jat_search_intel_sitemap
    SM->>SM: Check transient cache
    alt Cache hit
        SM-->>Bot: Cached XML Sitemap Index
    else Cache miss
        SM->>SM: generate_sitemap_index()
        SM->>SM: Store in transient (12h TTL)
        SM-->>Bot: XML Sitemap Index
    end

    Bot->>WP: GET /sitemap-post1.xml
    WP->>SM: type=post, page=1
    SM->>SM: Check transient cache
    SM->>WP: get_posts(published, not noindex)
    WP-->>SM: Post data + images
    SM->>SM: Build URL entries + image:image
    SM-->>Bot: XML Sitemap with images

    Bot->>WP: GET /sitemap-category.xml
    WP->>SM: type=category
    SM->>WP: get_terms(category, hide_empty)
    WP-->>SM: Term data
    SM-->>Bot: XML Taxonomy Sitemap

llms.txt Request Flow

sequenceDiagram
    participant AI as AI Crawler
    participant WP as WordPress
    participant GEO as GEO Manager

    AI->>WP: GET /llms.txt
    WP->>GEO: query_var = jat_search_intel_llms_txt
    GEO->>GEO: Build site summary
    GEO->>WP: get_pages(), get_categories()
    WP-->>GEO: Pages + categories
    GEO-->>AI: text/plain llms.txt

    AI->>WP: GET /llms-full.txt
    WP->>GEO: query_var = jat_search_intel_llms_full_txt
    GEO->>WP: get_posts(50 recent)
    WP-->>GEO: Posts with content
    GEO-->>AI: Full llms.txt with article summaries

Admin Interface

Settings Page Structure

graph TD
    MENU["JAT Search Intel Menu<br/><i>dashicons-chart-area</i>"]

    MENU --> GEN["General Settings<br/><i>Site identity, post types, module toggles</i>"]
    MENU --> SEO_S["SEO Settings<br/><i>OG, Twitter, canonical, robots</i>"]
    MENU --> AEO_S["AEO Settings<br/><i>FAQ, HowTo, Speakable selectors</i>"]
    MENU --> GEO_S["GEO Settings<br/><i>AI meta, llms.txt, entity, E-E-A-T</i>"]
    MENU --> SIT_S["Sitemap Settings<br/><i>Post types, max URLs</i>"]
    MENU --> SOC_S["Social Settings<br/><i>8 platform profile URLs</i>"]
    MENU --> BULK_S["Bulk Tools<br/><i>v1.3+ Rescore, Regenerate,<br/>Sitemap Warm, Export/Import</i>"]

    GEN --> OPT_MAIN["wp_options:<br/>jat_search_intel_settings"]
    SOC_S --> OPT_SOC["wp_options:<br/>jat_search_intel_social_profiles"]

    style MENU fill:#2563eb,color:#fff
    style BULK_S fill:#be185d,color:#fff

Block Editor Architecture (v1.4+)

Gutenberg Sidebar & Blocks Data Flow

flowchart TD
    subgraph JS["JavaScript (Block Editor)"]
        STORE["@wordpress/data Store<br/><i>jat-search-intel/editor</i>"]
        SIDEBAR["Sidebar Panel<br/><i>PluginDocumentSettingPanel</i>"]
        BLK_FAQ["FAQ Block<br/><i>FAQPage microdata</i>"]
        BLK_HOWTO["HowTo Block<br/><i>HowTo schema</i>"]
        BLK_TOC["TOC Block<br/><i>placeholder only</i>"]
        BLK_CRUMB["Breadcrumbs Block<br/><i>placeholder only</i>"]
        BLK_ANS["Answer Box Block"]
        BLK_CITE["Citation Block<br/><i>CreativeWork schema</i>"]
    end

    subgraph PHP["PHP (Server)"]
        META_REG["register_post_meta()<br/><i>28 keys × public post types</i>"]
        RENDER_TOC["render_toc()<br/><i>extracts headings, builds nav</i>"]
        RENDER_BC["render_breadcrumbs()<br/><i>BreadcrumbList schema</i>"]
        REST["WP REST API<br/><i>/wp/v2/posts meta fields</i>"]
        ANALYZE["REST /si/v1/analyze"]
    end

    SIDEBAR --> STORE
    STORE -->|"editPost / savePost"| REST
    REST --> META_REG

    BLK_TOC -->|"dynamic render"| RENDER_TOC
    BLK_CRUMB -->|"dynamic render"| RENDER_BC

    SIDEBAR -->|"Run Analysis"| ANALYZE
    ANALYZE -->|"scores JSON"| STORE

    style JS fill:#ede9fe,stroke:#7c3aed
    style PHP fill:#dbeafe,stroke:#2563eb

Block Registration Pipeline

sequenceDiagram
    participant WP as WordPress init
    participant B as Blocks Class
    participant FS as File System

    WP->>B: register_blocks()
    loop Each of 6 blocks
        B->>FS: file_exists(build/blocks/{slug}/index.asset.php)
        FS-->>B: asset{dependencies, version}
        B->>WP: wp_register_script(jat-search-intel-{slug})
        B->>FS: file_exists(build/blocks/{slug}/index.css)
        alt CSS exists
            B->>WP: wp_register_style(jat-search-intel-{slug}-editor)
        end
        B->>WP: register_block_type(jat-search-intel/{slug}, args)
    end

    WP->>B: register_meta()
    loop 28 meta keys × public post types
        B->>WP: register_post_meta(type, key, config)
    end

    WP->>B: enqueue_sidebar()
    B->>FS: file_exists(build/sidebar.asset.php)
    B->>WP: wp_enqueue_script + wp_enqueue_style

Schema Output Pipeline

JSON-LD Graph Assembly

flowchart TD
    START["wp_head fires"] --> CHECK{"Schema<br/>enabled?"}
    CHECK -->|No| SKIP["No output"]
    CHECK -->|Yes| COLLECT["Collect graph nodes"]

    COLLECT --> KG["Knowledge Graph<br/>Organization or Person"]
    COLLECT --> WS{"Is front<br/>page?"}
    WS -->|Yes| WEBSITE["WebSite + SearchAction"]
    WS -->|No| SKIP_WS[" "]

    COLLECT --> BC{"Not front<br/>page?"}
    BC -->|Yes| BREAD["BreadcrumbList<br/>Home > Category > Post"]
    BC -->|No| SKIP_BC[" "]

    COLLECT --> SG{"Is<br/>singular?"}
    SG -->|Yes| ARTICLE["Article / WebPage<br/>+ author, publisher, image"]
    SG -->|No| SKIP_SG[" "]

    KG --> MERGE["Merge into @graph array"]
    WEBSITE --> MERGE
    BREAD --> MERGE
    ARTICLE --> MERGE

    MERGE --> OUTPUT["Output single script tag<br/>@context + @graph"]

    style OUTPUT fill:#2563eb,color:#fff

Scoring System

SEO Score Breakdown (100 points)

pie title SEO Score Distribution
    "Keyword in title" : 15
    "Keyword in description" : 10
    "Description length" : 10
    "Title length" : 10
    "Content length" : 10
    "Keyword in first para" : 10
    "Keyword density" : 10
    "Subheadings" : 10
    "Image alt text" : 8
    "Internal links" : 7

AEO Score Breakdown (100 points)

pie title AEO Score Distribution
    "Direct first-paragraph answer" : 20
    "Question-style headings" : 20
    "Structured lists" : 15
    "Data tables" : 15
    "FAQ schema data" : 15
    "Concise paragraphs" : 15

GEO Score Breakdown (100 points)

pie title GEO Score Distribution
    "AI summary provided" : 15
    "Source citations" : 15
    "Clear definitions" : 15
    "Content depth 800w+" : 15
    "Entities defined" : 15
    "Content freshness" : 15
    "Author bio + credentials" : 10

Score Rating Thresholds

Score Range Rating Color Meaning
70 - 100 Good Green Well optimized
40 - 69 Needs Work Amber Key improvements needed
0 - 39 Poor Red Significant optimization required

Installation

Requirements

Requirement Minimum Recommended
WordPress 6.0 6.5+
PHP 7.4 8.1+
MySQL 5.7 8.0+

Steps

  1. Download or clone this repository
  2. Copy the jat-search-intel folder to wp-content/plugins/
  3. Activate via Plugins > Installed Plugins
  4. Navigate to JAT Search Intel > General to configure
  5. Flush permalinks: Settings > Permalinks > Save (required for sitemap and llms.txt)

Important

Deactivate other SEO plugins (Yoast, Rank Math, All in One SEO, etc.) before activating JAT Search Intel to avoid duplicate meta tags and schema conflicts.


Configuration

Quick Start

  1. General — Set your site name, entity type (Organization/Person), and logo
  2. SEO — Enable Open Graph, Twitter Cards, and robots settings
  3. AEO — Enable FAQ/HowTo schema and Speakable
  4. GEO — Enable AI meta, llms.txt, and entity markup
  5. Social — Add your social profile URLs
  6. Sitemap — Choose which post types to include

Per-Post Settings

Every post and page gets a JAT Search Intel metabox with five tabs:

Tab Fields
SEO Title, description, focus keyword, canonical URL, noindex/nofollow, SERP preview, social title/description/image, secondary keywords
AEO FAQ items (repeater), schema type override, direct-answer field, citation/source references repeater
GEO AI summary, topics, expertise level, content type, fact-check date, entities, content intent, audience, author expertise notes, local relevance toggle + location
Advanced AI crawler blocking
Analysis Live SEO/AEO/GEO/Readability scores with actionable checks + 11 content quality checks

REST API

JAT Search Intel exposes a REST API under the jat-search-intel/v1 namespace. Enable it via JAT Search Intel > GEO > Enable REST API.

All endpoints use standard WordPress REST authentication (cookie, application passwords, or OAuth).

Endpoints

Method Route Permission Description
GET /jat-search-intel/v1/scores/{id} read (published) SEO, AEO, GEO, readability scores
GET /jat-search-intel/v1/geo/{id} read (published) Full GEO metadata (AI summary, topics, entities, intent, audience)
GET /jat-search-intel/v1/meta/{id} read (published) SEO meta fields (title, description, keyword, canonical, robots)
PUT /jat-search-intel/v1/meta/{id} edit_post Update SEO meta fields
POST /jat-search-intel/v1/analyze/{id} edit_post Run content analysis and save scores
POST /jat-search-intel/v1/bulk/rescore manage_options Batch rescore with offset pagination
GET /jat-search-intel/v1/settings manage_options Read all plugin settings
PUT /jat-search-intel/v1/settings manage_options Update plugin settings
POST /jat-search-intel/v1/sitemap/invalidate manage_options Clear sitemap transient caches

Example

# Get scores for post 42
curl -u admin:APP_PASSWORD https://example.com/wp-json/jat-search-intel/v1/scores/42

# Trigger analysis
curl -X POST -u admin:APP_PASSWORD https://example.com/wp-json/jat-search-intel/v1/analyze/42

# Export settings
curl -u admin:APP_PASSWORD https://example.com/wp-json/jat-search-intel/v1/settings

WP-CLI Commands

JAT Search Intel registers a jat-search-intel WP-CLI command group with the following subcommands:

# Analyze a single post (displays score table)
wp jat-search-intel analyze 42
wp jat-search-intel analyze 42 --save        # Save scores to post meta

# Bulk rescore all published posts
wp jat-search-intel rescore --all
wp jat-search-intel rescore --all --post_type=page --batch_size=100

# Bulk regenerate empty metadata (descriptions, AI summaries, content types)
wp jat-search-intel regenerate --all
wp jat-search-intel regenerate --all --post_type=page

# Sitemap cache management
wp jat-search-intel sitemap cache             # Clear + queue regeneration
wp jat-search-intel sitemap clear             # Clear caches only

# Settings export/import
wp jat-search-intel export > settings.json
wp jat-search-intel import settings.json
wp jat-search-intel import settings.json --mode=overwrite

# Display score table
wp jat-search-intel scores
wp jat-search-intel scores --format=csv --limit=100
wp jat-search-intel scores --orderby=seo

# Migration (v3.0+)
wp jat-search-intel migrate --from=yoast             # Migrate from Yoast SEO
wp jat-search-intel migrate --from=rankmath --dry-run # Preview migration
wp jat-search-intel migrate --from=aioseo --overwrite # Overwrite existing data

# RBAC (v3.0+)
wp jat-search-intel rbac grant 5 seo                 # Grant SEO module to user 5
wp jat-search-intel rbac revoke 5 geo                # Revoke GEO module from user 5
wp jat-search-intel rbac list                        # List all user permissions

# Multisite (v3.0+)
wp jat-search-intel multisite push-defaults          # Push network defaults to all sites
wp jat-search-intel multisite report --format=table  # Network-wide score report

# Background Queue (v3.0+)
wp jat-search-intel queue status                     # Show queue status
wp jat-search-intel queue process --batch=10         # Manually process queued jobs

Bulk Tools

Navigate to JAT Search Intel > Bulk Tools in the WordPress admin to access:

  • Bulk Rescore — re-run SEO/AEO/GEO/readability analysis on all published posts with a live progress bar
  • Bulk Regenerate Metadata — auto-fill empty descriptions, AI summaries, and content types (existing values are never overwritten)
  • Sitemap Cache — clear all sitemap transient caches and queue regeneration
  • Export Settings — download all plugin settings + social profiles as a timestamped JSON file
  • Import Settings — upload a JSON file with merge (overlay on current) or overwrite (reset to defaults first) mode

All bulk operations are batched via AJAX (20 posts per request) with a progress bar, so they won't time out on large sites.


Gutenberg Sidebar

JAT Search Intel adds a native PluginDocumentSettingPanel to the Block Editor with four tabs:

SEO Tab

  • SEO Title — custom title tag with character count (60 max)
  • Meta Description — custom description with character count (160 max)
  • Focus Keyword — primary keyword for content analysis
  • Secondary Keywords — comma-separated additional keywords
  • Canonical URL — override the canonical URL
  • noindex / nofollow — toggle robots directives
  • Social Overrides — collapsible panel for OG and Twitter title/description
  • SERP Preview — live preview of how the page appears in Google results

AEO Tab

  • Direct Answer — concise answer for featured snippets and voice assistants (300 char limit)
  • Schema Type Override — select Article, NewsArticle, BlogPosting, HowTo, FAQPage, or Review (default: auto-detect)
  • FAQ & HowTo Guidance — prompts to use the dedicated blocks for structured data

GEO Tab

  • AI Summary — factual summary for LLM consumption (500 char limit)
  • Key Topics — comma-separated topics for AI indexing
  • Content Type — article, how-to, faq, comparison, review, guide, news, opinion
  • Content Intent — informational, navigational, transactional, commercial
  • Target Audience — general, beginner, intermediate, expert, professional
  • Expertise Level — beginner through expert
  • Fact-Check Date — date picker for freshness signals
  • Local Relevance — toggle with conditional location field

Analysis Tab

  • Score Rings — SVG ring visualizations for SEO, AEO, GEO, and Readability scores (color-coded: green ≥80, yellow ≥50, red <50)
  • Run Analysis — one-click analysis via the REST API with spinner feedback
  • Check Results — categorized pass/fail/info items from the content analyzer

Classic Editor users: The existing PHP metabox continues to work unchanged. The Gutenberg sidebar is only loaded in the Block Editor.


Custom Blocks

JAT Search Intel provides 6 custom Gutenberg blocks under the jat-search-intel namespace:

jat-search-intel/faq

Visual FAQ editor with numbered question/answer pairs. Add, remove, and reorder items directly in the editor. Outputs microdata with itemScope/itemProp attributes and a data-schema="FAQPage" data attribute for JSON-LD generation.

jat-search-intel/howto

Step-by-step tutorial editor with a title, description, optional total time (ISO 8601), and per-step name, instructions, and image upload via MediaUpload. Outputs an ordered list with HowTo schema data attributes.

jat-search-intel/toc

Auto-generated Table of Contents from headings in the post. Updates in real-time as you add or edit headings. Settings: max heading depth (1–6) and ordered/unordered list. Dynamic block — rendered server-side via render_toc() on the frontend.

jat-search-intel/breadcrumbs

Theme-aware breadcrumb navigation with configurable separator (›, /, », →, |) and home label. Outputs a full BreadcrumbList schema with itemListElement microdata. Dynamic block — rendered server-side via render_breadcrumbs() with category hierarchy.

jat-search-intel/answer-box

Highlighted answer container optimized for featured snippet extraction. Question + answer fields with data-si-answer-box and data-si-direct-answer attributes for AI and search engine parsing.

jat-search-intel/citation

Inline source citation block wrapping quoted text with source metadata. Inspector panel for source name, URL, type (website, journal, book, report, news, government), author, and date. Outputs a <figure> with CreativeWork microdata.

FSE Templates: The TOC, Breadcrumbs, and FAQ blocks are all usable in Full Site Editing templates (header.html, single.html, etc.).


Shortcodes

FAQ Block

[jat_search_intel_faq question="What is SEO?" answer="SEO stands for Search Engine Optimization."]

HowTo Block

[jat_search_intel_howto name="How to Install a Plugin" time="PT5M"]
  Step content here...
[/jat_search_intel_howto]

Hooks and Filters

Filters

Filter Description Parameters
jat_search_intel_singular_schema Modify article/page schema before output $schema, $post_id

Actions

All output hooks fire on wp_head with the following priorities:

Priority Module Output
1 SEO Manager Meta description, author
2 SEO Manager Canonical URL
3 SEO Manager / GEO Robots meta, AI crawl directives
4 SEO Manager Open Graph tags (with social overrides)
5 SEO Manager Twitter Card tags (with social overrides)
6 GEO Manager AI meta tags + intent, audience, expertise, local relevance
7 GEO Manager Freshness meta
10 Schema Manager JSON-LD @graph (with citations, audience, contentLocation)
11 AEO Manager FAQ / HowTo schema
12 AEO Manager Speakable schema
13 AEO Manager Direct-answer meta tag
13 GEO Manager Author E-E-A-T schema
20 SEO Manager Document title fil

This README is longer than the copy stored here. Read the rest on GitHub →