Nexal SEO

Description

Nexal SEO is a fast, no-bloat SEO plugin for posts, pages, WooCommerce products, categories and tags. It ships as a modular dashboard so your site only loads the code for the features you actually turn on.

Titles & Meta

  • Focus keyword, SEO title and meta description per post/page/product/term.
  • Live Google-style snippet preview with character counters.
  • Homepage title/description overrides.

Semantic content analysis (free, fully local)

  • Topical Completeness — compares your content against other posts in the same category using local TF-IDF, no external calls.
  • Cluster Health — checks internal linking and anchor-text quality within the category.
  • Semantic Structure — heading hierarchy checks (H1 uniqueness, H2–H4 nesting, keyword variation), shown live in the block editor sidebar.
  • A 0–100 score is computed locally and shown as a column on your post list.

Social

  • Open Graph and Twitter Card tags with a default social image.

XML Sitemap, Redirections & 404 Monitor

  • XML Sitemap (index + per post type/taxonomy).
  • Redirections manager (301/302/307/410) with regex matching, search, and CSV import/export.
  • 404 Monitor with one-click redirect creation and daily auto-clean.

Schema / Structured Data

  • Connected-entity JSON-LD @graph (Organization, WebSite, Article, Product, BreadcrumbList and more) instead of disconnected snippets.
  • Breadcrumbs via [nexal_breadcrumbs] shortcode or nexal_seo_breadcrumbs().

Local SEO

  • LocalBusiness structured data, NAP (name/address/phone) consistency scanner across your site, and a geo/local-SEO checklist.

WooCommerce

  • Detect-only store audit (thin descriptions, missing category copy) for shops running WooCommerce.

Optional AI assist (bring your own API key)

  • Off by default. If you turn it on and paste your own key for Google Gemini, Groq, OpenRouter, OpenAI or Anthropic, Nexal SEO can suggest related terms/topics and run an AI-assisted NAP consistency check. No key, no request — see “External services” below.

Setup Wizard

  • Guided first-run configuration.

Translations

  • Fully internationalized (i18n) and translation-ready. Translations are managed through translate.wordpress.org, so any locale the community translates is delivered automatically as a WordPress language pack — no files are bundled with the plugin. The local semantic analysis engine and the optional AI n-gram/question suggestions also follow your site’s configured language (stop-word filtering and question-style heading detection cover English, French, German, Spanish, Russian and Arabic; the AI prompt explicitly asks for output in your site’s language).

External services

Nexal SEO makes no outbound network requests by default. The following integration is entirely opt-in, uses your own credentials, and only runs when you explicitly trigger it (never automatically on page load, cron, or plugin activation):

AI providers (bring your own key) — off by default. If you enable AI in Settings AI and paste your own API key, Nexal SEO sends a request to the ONE provider you selected only when you explicitly trigger an AI-assisted feature (topic/term suggestions, “Questions to answer”, the “Verify with AI” NAP consistency check, the AI category-description generator, the AI snippet generator, and “Write with AI” for llms.txt). Nothing is sent automatically on page load, cron, or activation, and no request is ever made without a key.

What is sent: only the text needed for the requested feature — e.g. your focus keyword, the current post/page content or excerpt, a category name and its product/post titles, or (for the llms.txt draft) your site name/tagline, Schema identity fields and your published titles/URLs/excerpts. No IP addresses, credentials, or full data exports are sent.

You choose a single provider; only that provider is contacted. Their terms and privacy policies:

  • Google Gemini — Terms: https://ai.google.dev/gemini-api/terms · Privacy: https://policies.google.com/privacy
  • Groq — Terms: https://groq.com/terms-of-use/ · Privacy: https://groq.com/privacy-policy/
  • OpenRouter — Terms: https://openrouter.ai/terms · Privacy: https://openrouter.ai/privacy
  • OpenAI — Terms: https://openai.com/policies/terms-of-use/ · Privacy: https://openai.com/policies/privacy-policy/
  • Anthropic — Terms: https://www.anthropic.com/legal/consumer-terms · Privacy: https://www.anthropic.com/legal/privacy

The built-in visitor analytics (Dashboard Visitors) is first-party only: it records views on your own server and makes no external calls. It is off until you opt in, and never stores IP addresses (visitors are counted with a daily one-way hash).

Agency help links (WhatsApp / nexalseo.com) — inside a Semantic Analysis criterion’s “how to fix” popup, an optional “Chat on WhatsApp” button and a “Delegate to Our Agency” button link out to WhatsApp (https://wa.me/) and to the plugin author’s site (https://nexalseo.com/contact). These are ordinary outbound links: nothing is sent unless you click one, and only then does your browser open the destination. If you open the WhatsApp link, a short pre-filled message naming the SEO issue you clicked (and, on WhatsApp’s side, your WhatsApp identity) is handed to WhatsApp so you can review and choose whether to send it; the plugin itself transmits no data. The plugin’s Documentation, Support and Pro links (https://nexalseo.com) behave the same way. WhatsApp is a service provided by Meta — Terms: https://www.whatsapp.com/legal/terms-of-service · Privacy: https://www.whatsapp.com/legal/privacy-policy. nexalseo.com — Terms: https://nexalseo.com/terms-of-service/ · Privacy: https://nexalseo.com/privacy-policy/.

Blocks

This plugin provides 1 block.

  • FAQ (Nexal SEO)

Installation

  1. Upload the NexalSeo folder to /wp-content/plugins/.
  2. Activate the plugin through the “Plugins” menu in WordPress.
  3. Follow the Setup Wizard, or edit any post/page/product/term and fill in the “Nexal SEO” fields.

FAQ

Does this plugin send my content anywhere?

No, not by default. The semantic analysis engine (Topical Completeness, Cluster Health, Semantic Structure) runs entirely on your server. The only outbound requests are the opt-in AI integration described in “External services” above, and only when you explicitly trigger it with your own API key.

What happens to my data if I uninstall the plugin?

Deleting the plugin (not just deactivating it) removes all of its settings, cached data, custom database tables (redirections, 404 log) and post/term meta.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“Nexal SEO” is open source software. The following people have contributed to this plugin.

Contributors

Translate “Nexal SEO” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

1.3.8

  • Fixed: on a static front page (a Page set as your homepage under Settings Reading), the SEO title and meta description set on the page itself via the Snippet editor were ignored — the front end always used the global “Homepage SEO title / meta description” settings instead. The page’s own values now take precedence, and the global Homepage settings act as a fallback (and still apply when the homepage shows your latest posts).

1.3.7

  • Hardened (WordPress.org plugin review): every $_SERVER, $_POST and $_GET input flagged by the review is now sanitised at the point of read — the visitor-analytics user-agent, IP (REMOTE_ADDR) and Origin/Referer host, the llms.txt editor content, the Yoast/Rank Math import source, and the redirections request URI and source prefill.
  • Fixed: replaced the deprecated second argument of term_description() (the taxonomy parameter, deprecated since WordPress 4.9.2) in the CollectionPage schema output.
  • Fixed: the visitor-analytics time-series query now binds the DATE_FORMAT mask through $wpdb->prepare() as a placeholder instead of interpolating it into the SQL string.
  • Fixed: the redirections admin notice now validates a nonce before reading its status/count query args, and its per-IP rate-limit transient uses the plugin’s nexal_seo_ prefix (was nxs_).
  • Changed: bundled .po/.mo/.json translation files were removed — the plugin is fully internationalized and translations are now delivered automatically through translate.wordpress.org.
  • Documented: the readme “External services” section now discloses the optional outbound WhatsApp / nexalseo.com “get help” links (what is sent, when, and their Terms/Privacy links), in addition to the existing AI-provider disclosures.

1.3.6

  • Added: Visitors analytics — a first-party “Visitors” tab in the Nexal SEO dashboard with views, unique visitors and top referrer origins by day, week, month and year. Collected on your own server with no external service, off until you opt in, and no IP addresses are stored (visitors are counted with a daily one-way hash).
  • Added: AI category descriptions — a “Generate with AI” button on category, tag and product-attribute screens drafts an SEO description from the term name and the products/posts in it. Opt-in, bring-your-own-key, with a preview before anything is saved.
  • Added: CollectionPage schema on category / tag / custom-taxonomy archives, connected to the WebSite and its breadcrumb.
  • Added: SoftwareApplication schema fields (application category, operating system, price, rating) so software/plugin pages can be marked up for the app rich result.
  • Added: a new “Content signals” criterion — each focus keyword should have its own image with matching alt text (the featured image counts too).
  • Improved: the “outbound source” criterion now correctly treats internal links as internal (www/non-www, subdomains, percent-encoded hosts), and its “?” popup lists the exact external link(s) it detected.
  • Improved: the WooCommerce store audit no longer flags a product as “incomplete Product schema” when its schema type was intentionally changed (e.g. to Software Application) or disabled.
  • Hardened: inline admin CSS/JS is now enqueued via the WordPress APIs; JSON-LD output escapes slashes so page data can never break out of the script tag; the opening-hours setting is fully sanitised on every path; the readme “External services” section documents each AI provider with Terms and Privacy links; and the visitor-tracking endpoint is rate-limited.

1.27.14

  • Fixed: keeping Yoast SEO / Rank Math / other SEO plugins active alongside Nexal SEO (e.g. right after using the importer) caused duplicate, competing title/meta description/Open Graph tags on live pages — confirmed by testing with the real Yoast SEO plugin active, both plugins’ tags were present in the page source and either could win, meaning what was configured in Nexal SEO didn’t always match what a browser or search engine actually saw. Nexal SEO now shows a site-wide admin notice with a one-click deactivate link when another SEO plugin is detected active, and the importer’s messaging was corrected (it previously and incorrectly said it was fine to leave the source plugin active).

1.27.13

  • Fixed: Topical Completeness, Cluster Health and the internal-link suggestions assumed every content type uses the category taxonomy like Posts do. Pages (which have no taxonomy by default) always showed “Suggestion: publish at least 3 articles in this category” no matter how good the page actually was, and WooCommerce Products (which use product_cat, not category) got zero cluster data too. These checks now detect the right taxonomy per post type (falling back to any hierarchical taxonomy for custom post types), and show an honest “this content type doesn’t use categories” message instead of a misleading one when there genuinely isn’t one.

1.27.12

  • Fixed: the “FAQ schema markup is added” criterion only recognized Nexal SEO’s own FAQ block. It now also detects any other FAQ block by name pattern (Yoast, Rank Math, etc.) and FAQPage JSON-LD/microdata pasted directly into the content.

1.27.11

  • Added: 5 Nexal SEO Pro criteria (Semantic Anchor Router, Context Connector, Crawl Depth Minimizer, Entity Infeeder, Cluster Migrator) now preview as locked rows across Cluster Health, Questions to Answer and Semantic Structure, each explaining what the Pro engine does and linking to nexalseo.com/pro.

1.27.10

  • Added: two new “Content signals” criteria (freshness — updated within the last year, and linking to a reputable outbound source), each with the same “?” explainer as the other checklist items.

1.27.9

  • Added: a new “Questions to Answer” criterion checks whether FAQ schema markup (via the Nexal SEO FAQ block) has been added to the content.

1.27.8

  • Added: each Semantic Analysis criterion (Content Structure, Cluster Health, Questions to Answer) now has a “?” button that opens a short explainer — why it matters and how to fix it — plus a link to get it fixed for you.

1.27.7

  • Fixed: the suggested AI model list for Gemini (gemini-1.5-*) and Anthropic (claude-3-5-*) pointed at model snapshots both providers have since fully retired, so the default “Re-analyze with AI” selection failed outright for anyone who hadn’t manually picked a different model. Refreshed all five providers’ suggested models against their current docs (Gemini 2.5 family, Anthropic Claude Haiku 4.5/Sonnet 5/Opus 4.8, Groq and OpenRouter’s current model/free-tier lineups). If you already have an old model ID saved in Settings AI, clear the model field (or pick “Custom” with a current ID) to pick up the new default.
  • Note on Groq specifically: Groq’s Cloudflare-based anti-fraud protection blocks server/datacenter/hosting IP ranges by design (a known, widely-reported Groq limitation, not a bug in this plugin) — since a WordPress site’s outbound request comes from its hosting server, not a residential IP, Groq can return “Access denied. Please check your network settings.” even with a valid key and model. If you hit this, either ask Groq support to allowlist your server’s IP or use a different provider for server-side requests.

1.27.6

  • Fixed: saving the AI, Social, Local SEO or Breadcrumbs settings tab for the very first time on a site (i.e. before the nexal_seo_settings option exists yet) silently discarded the submitted values, leaving the fields blank after reload. Root cause: WordPress runs the settings sanitize callback twice when the option row doesn’t exist yet — once inside update_option(), then again inside add_option(), fed the callback’s own prior output — and the hidden field each tab used to know “which tab was submitted” wasn’t preserved into that output, so the second pass silently skipped reprocessing the tab and fell back to blank defaults. The Titles & Meta tab happened to avoid this by coincidence (its marker field is also a real stored setting); AI, Social, Local SEO and Breadcrumbs did not. Confirmed fixed via a real end-to-end HTTP save on a freshly-installed site.

1.27.5

  • Fixed: the “Import from Yoast SEO / Rank Math” batch importer redirected using wp_nonce_url()‘s HTML-escaped output directly in an HTTP Location header, so every batch after the first silently failed (the literal & broke query-string parsing) — imports could stop after the very first batch of ~40 posts with no error shown. Confirmed fixed via a full end-to-end HTTP test through the real batch-redirect chain.
  • Added: category, tag and WooCommerce product category/tag SEO titles, descriptions and focus keywords are now included in the Yoast SEO / Rank Math import (previously the importer only handled posts, pages and products — taxonomy archive SEO data was silently skipped).

1.27.4

  • Fixed: visiting /sitemap.xml or /llms.txt while that feature was turned off served the homepage with a 200 OK status instead of a proper 404 (WordPress’s default query silently falls back to the front page when a rewrite-matched URL doesn’t resolve to real content) — confirmed via automated testing that this also fully restores correct 404-monitor logging for both URLs.
  • Fixed: llms.txt page/post titles and excerpts could contain literal HTML entities (e.g. ’s instead of 's) since the output is served as plain text, not HTML.

1.27.3

  • llms.txt content is now viewable and directly editable in a text box on the AI tab, instead of being purely auto-generated. Save your own version, or reset back to the auto-generated one at any time.
  • Added a “Write with AI” button (only shown when AI is enabled) that drafts an llms.txt using your site’s Schema/Knowledge-Graph identity plus your published pages AND recent posts — grouped by actual topic instead of a flat list — using your own configured AI provider. Manual trigger only; the draft is saved so you can review/edit it before it goes live.

1.27.2

  • Fixed llms.txt (added in 1.27.1) not actually appearing at the site URL after clicking “Create”: it was being written as a real file at ABSPATH, which isn’t always the same folder a site’s domain actually serves from. It’s now served virtually through a rewrite rule instead — the same approach this plugin’s own XML sitemap already uses — so it works regardless of hosting/filesystem setup. The button now toggles llms.txt on/off (content is generated fresh on every request, so there’s no separate “regenerate”).

1.27.1

  • AI tab: when AI is enabled, Nexal SEO shows an llms.txt status check with a one-click button to turn it on. See 1.27.2 below for a fix to how it’s served.

1.27.0

  • Removed Webmaster Tools entirely: the Google Search Console / Bing Webmaster Tools live-data connection, the OAuth flow, and the legacy Google/Bing/Yandex/Pinterest verification meta tags. This drops an entire settings tab and its stored credentials/tokens — anyone using it should note this feature is gone.
  • Added full French, German, Spanish and Russian translations (692 strings, PHP and block-editor JS).
  • Extended the local semantic analysis engine’s stop-word list and question-style heading detection to Russian (French/German/Spanish/Arabic were already covered), and the optional AI n-gram/question suggestions now explicitly ask for output in the site’s configured language instead of only inferring it from the content excerpt.

1.26.4

  • Redesigned the plugin admin UI: replaced the purple/pink/teal gradient banners, glow effects and gradient buttons across every settings tab and module page with a plain white header, a single accent colour, and native wp-admin-style tabs/cards.

1.26.3

  • Breadcrumbs “Auto insert” now skips WooCommerce shop/product pages (which already print their own breadcrumb) and themes that declare the “yoast-seo-breadcrumbs” theme-support flag, so you don’t get two breadcrumb trails stacked together. This is best-effort — it can’t detect breadcrumbs hardcoded directly into a theme, so manual placement via [nexal_breadcrumbs] is still recommended for full control.

1.26.2

  • Added a “Monitor H1” setting (Titles & Meta) — when turned off, the duplicate-H1 check is hidden from the Semantic Structure panel instead of always being shown.
  • Webmaster Tools tab no longer fetches live data on plain page load — it now reads the local cache only and relies on the explicit “Refresh data” button, closing a case where an external request could fire without a direct user action.
  • Added uninstall.php to fully remove options, transients, custom tables and post/term meta when the plugin is deleted.
  • Added a readme “External services” section disclosing the opt-in Google/Bing/AI integrations.

1.26.1

  • Removed the manual verification-code paste fields and self-check from Webmaster Tools (superseded by the OAuth/API “Connect” flow); previously saved codes keep working on the front end.
  • The Nexal SEO metabox/editor sidebar/score column now also support custom post types that are visible in wp-admin but not registered as fully “public”.

1.26.0

  • Webmaster Tools: connect Google Search Console (OAuth) or Bing Webmaster Tools (API key) to pull clicks/impressions/position/top queries into the dashboard. Manual refresh only, 12-hour local cache. Yandex/Pinterest credential fields scaffolded for a future update.

1.20.0

  • Added the Local SEO module: LocalBusiness structured data, NAP consistency scanner, and a geo/local-SEO checklist.

1.18.0

  • Schema output rebuilt as a connected entity @graph (Organization, WebSite, Article, Product, BreadcrumbList) instead of separate, disconnected JSON-LD blocks.

1.0.0 – 1.17.x

  • Initial releases and early iterations: focus keyword/SEO title/meta description for posts, pages, products and terms; modular dashboard; tabbed settings; Open Graph/Twitter Card output; local semantic content analysis engine; XML Sitemap, Redirections, 404 Monitor, Schema, Breadcrumbs and WooCommerce audit modules; optional AI assist with bring-your-own API key.