Luxa SEO Changelog

Last updated on August 3, 2026 · 7 min read

= 1.4.2 =

  • Added: real brand icons — replaced the generic dashicons-search admin menu icon and the plain-text “L” topbar logo with the actual Luxa SEO logo artwork.
  • Changed: “Upgrade to Pro” links now point to https://luxapress.com/luxa-seo/pro/ (previously a #pricing/#pro anchor on the plugin’s WordPress.org-style page). Changelog/”What’s new” links now point to https://luxapress.com/docs/luxa-seo/changelog.

= 1.4.1 =

  • Fix: fatal error on activation/load — “Cannot redeclare LuxaSeo\Core\Logger::clear()”. includes/core/logger.php accidentally shipped in 1.3.0 with that method declared twice in the same file. Removed the duplicate.

= 1.4.0 =

  • Added: Readability Analysis in the SEO Analyzer meta box — average sentence length, passive voice detection, transition word usage, paragraph length, and a Flesch Reading Ease score, alongside the existing SEO checks. English-language content only (same limitation as every mainstream SEO plugin’s readability checker — the underlying heuristics and formula are English-specific).
  • Added: REST API exposure — a lxseo field on every public, REST-visible post type, containing the fully-resolved title/description (same fallback logic as the traditional <head> output, not just the raw per-post override), canonical URL, robots directives, Open Graph fields, and focus keyword. For headless/JAMstack front-ends that consume WordPress as a content API. New module, active by default (toggle off under Settings → Modules if not needed); read-only.
  • Fix: every check label/value in the SEO Analyzer meta box was hardcoded in Vietnamese with no translation function — inconsistent with the rest of this plugin (English source strings, translatable via __()). Also fixed a corrupted (missing diacritics) Vietnamese string in the search-results page title, unrelated to the above — replaced with its proper English source string instead of restoring the Vietnamese, for the same consistency reason.

= 1.3.0 =

  • Added: SEO Data Importer (Luxa SEO → Import) — migrates per-post titles, meta descriptions, focus keyword, canonical URL, Open Graph fields, and noindex/nofollow flags from Yoast SEO or Rank Math into Luxa SEO. Safe to run more than once: by default, a post that already has a value set in Luxa SEO is left untouched. (All in One SEO is not supported yet — it stores data in its own database table rather than post meta.)
  • Added: robots.txt custom rules editor (Settings → Robots) — appends your own rules to WordPress’s auto-generated robots.txt. Automatically shows a warning instead if your site has a physical robots.txt file on disk, since WordPress never runs for that request in that case (the setting would silently do nothing).
  • Added: Settings → General tab — Export/Import all Luxa SEO settings as a JSON file (e.g. for cloning a setup from staging to production), and a Debug Log viewer.
  • Added: 404 Log now suggests the closest-matching existing post/page for each 404’d URL (with a match-confidence percentage), turning “Create redirect” into a one-click action instead of manual guesswork.
  • Fix: the 404 Log’s “Create redirect” link has pre-filled the Redirects page’s Source URL field since it was added, but the Redirects page never actually read that value — the link went nowhere useful. Now also pre-fills the Target URL when a good suggestion is found.

= 1.2.2 =

  • Fix: removed a duplicate “boxed” style on the admin page content wrapper — it was nesting one white/bordered box inside another (the same background/border/padding as .lxseo-panel and other content blocks), making every screen look cramped. Settings and Add-ons pages now sit directly on the page background (matching WordPress’s native Settings page look) instead of inside an extra unnecessary box; all other pages are unaffected since their content already has its own box.

= 1.2.1 =

  • Added: lxseo_dashboard_after_quicklinks action hook on the Dashboard page — extension point for a companion Pro plugin to add extra panels (e.g. a “Plugin & Add-on Versions” overview) without editing this plugin’s files. No visible change on a Free-only site.

= 1.2.0 =

  • Fix: Settings cross-tab data loss — saving Settings from any tab
    other than Modules used to silently disable every module (checkboxes
    from a tab that wasn’t rendered were indistinguishable from “user
    unchecked everything”). Every tab now has its own hidden marker;
    saving one tab no longer touches another tab’s data.
  • Fix: sanitize_callback is now idempotent if WordPress core invokes
    it a second time within one save request (a known edge case of
    add_option()‘s fallback path) — previously the second call could
    overwrite the first call’s real values back to the old settings.
  • Fix: Plugin::add_service() could double-register() a service
    added during the lxseo_services_registered action (double AJAX
    handlers, double hooks) — fixed to match the corrected pattern from
    the LuxaPress plugin boilerplate.
  • Changed: License activation moved OUT of this plugin into a separate
    Luxa SEO Pro plugin, per updated LuxaPress architecture guidance
    (“license belongs to Pro, never bundled into Free” — avoids a
    WordPress.org compliance risk from making license-server API calls
    inside the free listing). The Settings → License tab added in 1.1.0
    is removed; every Pro-only limit in this plugin (redirects, image
    sitemap, 404 log history, internal link suggestions, bulk tools,
    Google Indexing API, advanced Schema, CPT archive templates) now
    checks a proper Free↔Pro contract instead (see next item). No
    free-tier behavior changes — these were all already Pro-gated before
    1.1.0 shipped the (now-removed) in-plugin license UI.
  • Added: includes/core/probridge.phplxseo_is_pro() /
    lxseo_is_licensed(), a function_exists()-based contract with an
    optional Luxa SEO Pro companion plugin. Replaces the internal
    apply_filters( 'lxseo_is_pro_active', false ) calls scattered
    across 15 files with these two well-defined functions.
  • Renamed (internal only, no behavior change): AdminShell → the
    'skin' service (SkinInterface + DefaultSkin), matching the
    LuxaPress plugin boilerplate’s ShellSkin rename (avoids the
    word “shell” reading as a web-shell/backdoor to malware scanners).
    Every admin template now opens/closes its layout via
    Plugin::instance()->get_or_fail( 'skin' ) instead of a static
    AdminShell::open()/close() call.
  • Added: Plugin::get_or_fail() and Plugin::reset_for_tests().
  • Added: lxseo_menu_title_suffix filter on the top-level admin menu
    label — extension point for a companion Pro plugin to add a “PRO”
    badge without editing this plugin’s files.
  • Added: PHPUnit test suite (tests/, Brain Monkey) and a GitHub
    Actions CI workflow (PHPCS + PHPUnit on PHP 7.4/8.3) — dev tooling
    only, excluded from the packaged plugin ZIP via .distignore, no
    effect on the plugin at runtime.

= 1.1.0 =

  • Fix: fatal error on first published post on a fresh install (Bing IndexNow auto key generation called a method that didn’t exist).
  • Fix: breadcrumb shortcode now matches the documented [lxseo_breadcrumb] name (old [seo_breadcrumb] still works).
  • New: Settings → License tab to activate a Luxa SEO Pro license key directly on this plugin (no separate plugin install required).
  • New: free-tier cap on the image sitemap (500 images); Pro removes the cap.
  • Hardening: Product/LocalBusiness/Custom JSON-LD schema and a few AJAX endpoints now double-check permissions/Pro status instead of relying on the UI alone.

= 1.0.0 =

  • Initial release.

== Upgrade Notice ==

= 1.4.2 =
Cosmetic + link updates only (real logo icons, updated Pro/Changelog URLs). Safe to update anytime.

= 1.4.1 =
CRITICAL: fixes a fatal error (“Cannot redeclare Logger::clear()”) introduced in 1.3.0 that could take the site down. Update immediately if running 1.3.0 or 1.4.0.

= 1.4.0 =
Adds Readability Analysis and REST API exposure for headless sites. The new REST API module is active by default — toggle it off under Settings → Modules if you don’t need it. Safe to update anytime.

= 1.3.0 =
Adds a one-click SEO data importer from Yoast SEO/Rank Math, a robots.txt editor, Settings export/import, and smarter 404 redirect suggestions. Safe to update anytime — nothing changes automatically until you use the new tools.

= 1.2.2 =
Visual fix: removes a double-boxed layout that made admin pages look cramped. Safe to update anytime.

= 1.2.1 =
Adds a Dashboard extension point for the Pro plugin. No change on a Free-only site — safe to update anytime.

= 1.2.0 =
Fixes a Settings bug that could silently disable all modules when saving from certain tabs. Update recommended for all sites. License activation moved to the separate Luxa SEO Pro plugin — if you activated a license under Settings → License in 1.1.0, install Luxa SEO Pro and re-activate your key there after updating.

= 1.1.0 =
Fixes a fatal error that could occur when publishing the first post after installing. Update recommended for all sites.

= 1.0.0 =
Initial release.

Powered by LuxaDocs