LuxaDocs — Changelog
All notable changes to LuxaDocs, newest first.
1.5.22
Fixed
The “Contact support” link shown in the Documentation page / category archive footer always mailed the site’s admin email, ignoring “Send Feedback To” (Settings → Layout → Single Doc → Email Feedback) — it now uses that setting, same as the doc feedback emails do.
1.5.21
Fixed
- Clicking a Table of Contents entry silently did nothing for any heading whose auto-generated id started with a digit (e.g. a numbered heading like “1. Introduction” → id
1-introduction) — a valid HTML id, but not a valid CSS selector, which the click handler was using directly and threw a JavaScript error on. This is why it felt inconsistent: it worked for some headings and not others, depending on whether that particular heading happened to start with a number. - A heading with a manually-set id (e.g. the block editor’s “HTML Anchor” field) is now linked to correctly in the TOC — previously the TOC entry pointed at a freshly auto-generated id that was never actually written to that heading, so clicking it did nothing.
1.5.20
Fixed
- In “Theme Template” mode (Settings → Layout → Single Doc → General → Single Doc Display Mode), a shortcode typed as
[[shortcode]]in a doc’s content — the standard WordPress syntax to show it literally instead of running it — still ran anyway. The doc body was being passed through WordPress’ shortcode processing twice; the escape survived the first pass but was then executed for real by the second. Doc content in this mode is now only shortcode-processed once, so[[shortcode]]displays literally as expected.
1.5.19
Fixed
- The auto-provisioned “Documentation” page was always created at
/docs/, ignoring the “LuxaDocs Root Slug” setting (Settings → General) — it now uses that setting, and stays in sync with it if changed later, matching the category/single-doc URLs it’s supposed to sit alongside. - The Yes/No “Was this doc helpful?” feedback widget didn’t actually do anything with “Enable Email Feedback” / “Send Feedback To” (Settings → Layout → Single Doc → Email Feedback) — an answer is now emailed to that address when the setting is on.
- Uninstalling with
LUXADOCS_REMOVE_ALL_DATAdefined never actually deleted Doc Categories/Tags — the taxonomies weren’t registered yet at that point inuninstall.php, so the cleanup query silently matched nothing. - A category with exactly 1 doc showed “1 Docs” instead of “1 Doc” — the “Count Text Singular” setting existed but was never used.
- Accent/Background/Text colors (Settings → Customize) weren’t applied on the built-in “Documentation” page itself, only on category/tag archives and single docs.
Removed
- Removed 8 settings that had no effect on anything (Category Title Link, Masonry, Nested Sub Category, Archive Page → Layout, Archive Page → Archive Page Title, Search Result Image, Show TOC Title in Anchor Links, Title Link Copy To Clipboard) — leftover from an earlier design, never wired up to any actual rendering code.
1.5.18
Changed — architecture: one render path, matching WooCommerce’s own template/hook model
- Removed the “Render Mode” setting for both Single Doc and category/tag archives (Settings → Layout → Single Doc / Documentation Page → General) — there is only one render path now: LuxaDocs’ own dedicated template files (
single-luxadocs_doc.php,archive-luxadocs_doc.php), the same pattern WooCommerce uses forsingle-product.php/archive-product.php— the plugin’s own template fully owns the request viatemplate_include, still callsget_header()/get_footer()so the theme’s real header/footer/sidebar apply, and a generic#primary/#mainwrapper makes it render correctly on any theme with zero setup. A theme can override either template — or just one content partial — by dropping a same-named file inyourtheme/luxadocs/. - New: each doc in the archive grid is now its own template part,
templates/content-doc.php.render_archive_body()loops the query and calls it once per doc. Every visual piece of a card is now its own hook —luxadocs_before_doc_loop_item,luxadocs_before_doc_loop_item_title,luxadocs_doc_loop_item_title,luxadocs_after_doc_loop_item_title,luxadocs_after_doc_loop_item— so a theme/plugin can change or remove one part of a card without overriding the entire grid.
Upgrade notes
- Sites that had “Render Mode” set to Theme Content for single docs (the pre-1.5.18 default) will see a layout change: single docs now render through LuxaDocs’ own full-width template again instead of the theme’s real single.php, matching how archives have always worked.
- A theme/plugin that previously hooked
luxadocs_archive_doc_bodyto customize per-card markup should switch to the new, more granularluxadocs_*_doc_loop_item*hooks instead.
1.5.17
New
- New “Render Mode” option (Settings → Layout → Single Doc → General): switch a single doc to Theme Content mode and it displays exactly like a normal blog post — your active theme’s own header, footer, sidebar, and content width, with no setup needed.
- New “Content Wrapper Extra Class” option (Settings → Layout → General): add your theme’s own content class (e.g.
entry-content) so your theme’s text styling carries over into LuxaDocs pages too.
Fixed
- Theme Content mode could lose the doc’s own “Paper” styling (fonts, colors, section markers) when the active theme’s own typography CSS won the styling conflict. LuxaDocs’ styles now reliably take priority.
- Theme Content mode always showed the single-column layout, ignoring the “TOC Position” setting — the 3-column layout now shows in Theme Content mode too when set to “Sidebar”, still narrowing to 1 column automatically if the theme’s content area is too narrow.
1.5.16
Changed — architecture
Single docs and category/tag archives are back to their own dedicated template files instead of the auto-created, per-request-swapped “Luxa Single Doc” / “Luxa Archive Doc” wrapper pages introduced in 1.5.4 — that design’s get_queried_object_id() mismatch caused a long tail of SEO-plugin bugs (wrong title, meta description, canonical URL, wrapper pages in sitemaps) that 1.5.10–1.5.15 chased one at a time. A real is_singular()/is_tax() request for the real post/term keeps that guarantee intact automatically, for every plugin.
Every feature and pixel of layout from 1.5.4–1.5.15 is unchanged. The trade-off: single docs/archives no longer inherit a page builder’s per-Page width controls the way the “Documentation” page does.
Sites upgrading from 1.5.4–1.5.15 have their old wrapper pages automatically trashed (not permanently deleted) on the first admin page load after updating.
1.5.15
Fixed
- Custom SEO title/description and social-preview/canonical/robots overrides set directly on a doc’s or category’s edit screen were silently ignored on the front end — now mirrored onto the wrapper page’s postmeta, covering Yoast SEO, Rank Math, and Luxa SEO.
- Term-level (category) custom SEO fields synced on a best-effort basis.
1.5.14
Full audit of how single docs / archives / the Documentation page interact with SEO plugins.
Fixed
- Wrong canonical URL — every single doc and category/tag archive was declaring its own canonical URL as the wrapper page’s, which immediately redirects away. Fixed at the source via a
page_linkfilter so canonical tags, Open Graph/Twitter URLs, and shortlinks are all correct automatically. - Wrapper pages listed in XML sitemaps — excluded from WordPress core’s, Yoast’s, and Rank Math’s sitemaps. The “Documentation” page itself stays included, since it’s real, visitable content.
1.5.13
Fixed
- Root cause of the browser tab and meta description showing raw wrapper-page/shortcode text: an SEO plugin was reading the wrapper page’s title/content straight from the database, bypassing every filter LuxaDocs had hooked. Fixed at the source — the wrapper pages’ real title and a proper excerpt are written directly into their database row before rendering.
1.5.12
Fixed
- Reverted 1.5.11’s JS
document.titleoverride — it stomped on a title an SEO plugin had already set correctly. Back to relying on standarddocument_title_parts/the_titlefilters. - Fixed a flaw in 1.5.10’s
the_titlefilter that reintroduced the original duplicate-title bug for some callers; now usesin_the_loop()to tell the theme’s own heading call apart from everything else.
1.5.11
Fixed
- Browser tab title still showed the wrapper page’s literal title on themes that don’t build their
<title>tag through WordPress’ standard title APIs. Now force-set via JS once the page loads, working regardless of how the theme/SEO plugin generated the tag.
1.5.10
Fixed
- The browser tab showed the literal wrapper-page title instead of the actual doc/category title, for code (many themes, SEO plugins) that fetches the title by post ID directly instead of reading global
$post. Now filtered onthe_titlekeyed by post ID, catching every path.
1.5.9
Fixed
- “Section Postmark Markers” (added in 1.5.8) was misplaced under the TOC subtab instead of General — moved to Settings → Layout → Single Doc → General.
- Every “Save Changes” click logged the entire settings array to debug.log when WP_DEBUG_LOG was on. Removed.
1.5.8
Fixed
- Found the real cause of the feedback Yes/No buttons looking unresponsive:
document.querySelector()on a heading id starting with a digit throws (valid HTML id, invalid CSS selector), silently stopping every remaining line in the same script, including the reaction click handler further down. Switched togetElementById(), and every frontend behaviour now initializes independently in its own try/catch, so one bug can no longer take an unrelated one down with it. - The left rail’s sticky offset was stuck on its CSS fallback regardless of the “Anchor Scroll Offset” setting — now applied on the shared container both elements sit in.
Changed
- Added a “Section Postmark Markers” toggle to turn off the numbered circle marker before each section heading.
1.5.7
Fixed
- The doc-feedback widget’s default text was wrong from the start — the “Reaction Prompt Text” default was actually the thanks message, so clicking Yes/No just faded the text to nothing. Fixed the default and added a proper separate “Reaction Thanks Text” setting.
- The left sidebar’s search box scrolled out of view before the category tree below it became sticky — the whole rail now sticks together.
1.5.6
Changed
- The “Documentation” page’s own title is now blanked for display the same way single-doc/archive wrapper page titles were, so no theme prints a duplicate on it either.
- Category/tag archives now render through their own auto-provisioned “Luxa Archive Doc” wrapper page, same reasoning as single docs.
- The “Browse by category” list moved into the right-hand sidebar, consistent between the Documentation home page and category/tag archives.
- Category/tag archives regained proper multi-page pagination.
1.5.5
Fixed
- Single docs showed no content at all, introduced by 1.5.4’s wrapper-page switch — an in-memory query-swap bug set
current_postincorrectly, so the theme’s own content loop never ran. Fixed.
Changed
- Category/tag archive pages now use the same layout as the Documentation home page instead of a stripped-down version.
1.5.4
Changed
- Single docs are no longer injected into the active theme’s single.php via
the_content. LuxaDocs auto-creates a hidden “Luxa Single Doc” Page and renders every doc through it instead, guaranteeing theme/page builder CSS and width controls apply the same way they do to any other Page. - The “Documentation Home Page” setting was removed — LuxaDocs now auto-creates and manages its own “Documentation” Page for the built-in listing.
Fixed
- Removed the text-matching heuristic script (added in 1.5.3) that hid the theme’s duplicate title — no longer needed now that the wrapper page’s own title is always empty.
1.5.3
Fixed
- Single docs showed two titles (the theme’s own, plus LuxaDocs’). Fixed via a script that hides the theme’s copy by matching its text content.
- The Documentation Home Page’s browser tab title could end up blank if the underlying Page’s own title field was empty — now always uses the “Documentation Page Title” setting instead.
- The Documentation Home Page now prints its own on-page
<h1>, consistent with single docs.
1.5.2
Fixed
- The 3-column “Sidebar” TOC position could render misaligned or overflowing on themes whose content column isn’t horizontally centered — removed the viewport-breakout trick; the 3-column shell now simply fills the theme’s actual content width.
- The point at which the 3-column layout collapses to a single column is now based on the actual content area width (CSS container query) instead of the browser viewport.
1.5.1
Changed
- The doc title and breadcrumb are printed inside the actual content column again, instead of spanning the full page width above the layout.
1.5.0
Added
- Sticky TOC is back, with a choice of position: Sidebar (3-column) — left rail with live search and a category tree, doc content in the middle, sticky TOC on the right; or In Content (1-column) — a sticky click-to-expand block for themes with a narrow content area.
- Category icons — upload an image on the category Add/Edit screen, shown on category cards and the sidebar tree; falls back to auto-generated initials.
- Documentation Home Page setting: pick an existing WordPress Page to serve as the Documentation home instead of the built-in archive template. (Superseded by the auto-managed Documentation page in 1.5.4.)
Fixed
- The Documentation Home Page, when configured as a real Page, could show its title twice.
1.4.0
Changed
- The single doc page no longer overrides the theme’s
single.php— injected through the standardthe_contentfilter instead, so the active theme’s header, footer, sidebar, and comments placement work normally on doc pages. - The sticky right-rail Table of Contents is gone (no guaranteed extra column width inside a theme’s own content area) — a single click-to-expand block at every screen size instead. “Content Offset” renamed “Anchor Scroll Offset”.
- Comments are no longer force-suppressed — your theme calls
comments_template()normally, alongside LuxaDocs’ own Yes/No feedback box. - Category archive pages now get a proper
<title>tag.
Fixed
- The doc’s title is no longer at risk of being printed twice.
1.3.1
Changed
- Removed unconditional per-page-view debug logging from
template_loader()and the TOC-building content filter — these never indicated a problem by themselves.
1.3.0
Added
- New editorial “Paper” visual theme for the Documentation home page and category archives: hero header with live search, a “Popular:” tag chips row, “Browse by category” cards, and an editorial article list.
Fixed
- The single doc page’s topbar and content were unintentionally double-boxed by a leftover generic style.
- Category archive breadcrumbs now show which category you’re viewing.
- The “Documentation” breadcrumb crumb is no longer a clickable link while already on that page.
- The “Explore More” link on the documentation home page pointed nowhere — corrected.
1.2.5
Changed
register()/register_rewrite_rules()no longer log unconditionally on every page load — the routing pattern is logged once, at the moment it actually takes effect.
1.2.4
Fixed
- Rewrite/permalink fixes had no real effect on live URLs until something explicitly flushed WordPress’ rewrite rules. LuxaDocs now detects a version change on
initand flushes automatically.
1.2.3
Fixed
- With Category Hierarchy Slug enabled, a category’s RSS feed and oEmbed endpoint were being intercepted by the plugin’s single-doc rewrite rule. The rule now excludes WordPress’ reserved feed/embed endpoint names.
1.2.2
Fixed
- The admin menu icon sizing CSS from 1.2.1 targeted the wrong element — now targets the actual
<img>WordPress renders.
1.2.1
Changed
- Replaced the generic dashicon with LuxaDocs’ official icon.
1.2.0
Fixed
- A doc’s slug could not be edited from the post editor like a normal Post.
- A doc with no category assigned could generate a broken permalink and 404.
- Table of Contents “sticky” behavior didn’t actually stick while scrolling.
- The “Content Offset” TOC setting had no effect.
- “Collapsible TOC on Small Devices” was a Settings toggle with no code behind it.
- Clicking “Add Attachment” on a doc did nothing (a missing localized JS object).
- Previously attached files disappeared from view when reopening a doc for editing.
- “Powered by LuxaDocs” credit was plain text with no link — now links to the LuxaDocs page.
Added
- New editorial “Paper” visual theme for the single doc page: serif section headings with numbered “postmark” markers, perforated dividers, a sticky right-rail TOC with scroll-spy highlighting, a collapsible mobile TOC, and dedicated print styles.
1.1.1
Fixed
- Saving Settings from one tab silently reset every toggle on every other tab back to off.
- Category archive links 404’d for nested (parent/child) categories.
uninstall.phpdeleted every doc and taxonomy term unconditionally on plugin deletion, contradicting its own docblock. Now requiresdefine( 'LUXADOCS_REMOVE_ALL_DATA', true )inwp-config.phpbefore touching any content.
Changed
- Settings screen now shows inline Saving… / Saved ✓ / Save Failed states.
- New installs now ship with every feature toggle enabled by default, except Comments, which stays off.
1.1.0
Fixed
- Category archive URLs were conflicting with single doc URLs and returning 404s — permalinks restructured to
root-slug/category-slug/androot-slug/category-slug/doc-slug/. - Layout settings tabs were not switching when clicked.
- The Shortcodes and Import/Export settings pages were unreachable due to a tab-validation bug.
- Dashboard layout corrected.
Added
- Settings now save via AJAX.
- “What’s New” dashboard widget pulls the latest posts live from the LuxaPress blog feed.
- Debug logging (settings saves, rewrite rules, template loading, TOC scans, import/export) when
WP_DEBUG/WP_DEBUG_LOGare on. - “Enable Category Hierarchy Slug” toggle now genuinely changes the permalink structure.
Changed
- Default color scheme switched from green to black & white.
- Replaced emoji icons with SVG/dashicons.
1.0.0
Initial release.
Upgrade notices
1.5.0 — Brings back the sticky sidebar TOC (Sidebar/In-Content choice), category icons, and an optional real-Page-based Documentation home. No action needed — new options default to matching 1.4.0’s behavior.
1.4.0 — Architecture change for the single doc page (now renders inside your theme’s own single.php). The TOC becomes a single click-to-expand block, and native WordPress comments may now appear on docs if your site’s default comment status is open.
1.2.4 — Rewrite-rule fixes weren’t taking effect on live sites without a manual flush; this update auto-flushes on upgrade.
1.2.0 — Fixes doc slug editing, TOC sticky/offset/collapsible behavior, the Add Attachment button, and the Powered by link. Recommended for everyone.
1.1.1 — Fixes a bug where saving one Settings tab could reset every toggle on other tabs to off, fixes 404s on nested category links, and tightens uninstall.php to no longer delete your docs by default. Recommended for everyone on 1.1.0 or earlier.
1.1.0 — Category and single doc permalinks were restructured to fix URL conflicts. After updating, visit LuxaDocs → Settings → General and click Save once to refresh your permalinks.
Was this doc helpful?
Powered by LuxaDocs