Description
A lightweight, zero-dependency Table of Contents plugin built to do one thing well: match your site exactly, automatically, without configuration.
UTS Sites Table of Contents scans your post/page content for headings (H2–H6, configurable) and builds a Table of Contents automatically, no manual editing needed.
SEO features
- Every heading gets a stable, unique, crawlable anchor
id. Sections become directly linkable and can appear as “jump to” links in search results. - The TOC is rendered as real server-side HTML inside the page. No JavaScript is required to see or follow it, so it’s fully readable by search engine crawlers.
- Wrapped in a semantic
<nav>landmark withrole="doc-toc"and a properaria-label, plusaria-expanded/aria-controlson the toggle button for assistive technology. - Optional JSON-LD
ItemListstructured data describing the page’s section structure (toggle in Settings UTS TOC SEO). - Only loads its CSS/JS on singular pages that actually have a TOC. No unnecessary weight added to the rest of the site.
Note on E-E-A-T: Experience, Expertise, Authoritativeness and Trustworthiness are content-and-author quality signals that depend on what you write and who wrote it. No plugin can add E-E-A-T for you. This plugin focuses on the technical SEO and accessibility signals it can genuinely control.
Other features
- Font-family always matches your theme. Link/marker/border/background colors and per-level font sizes default to sensible, readable values and can be customized anytime in Settings UTS TOC (Colors, Typography), with a one-click reset.
- Clean, modern box design: subtle border, soft shadow, accent bar on the title, dot markers for nested items, and native numbering when “numbered” mode is on.
- Per-post control via a meta box on every post/page editor:
- Show TOC on this post: Use default setting / Always show / Never show (disable just for this one post)
- Position on this post: Use default setting, or pick its own position independently of the global setting
- Paragraph number override when using “After the Nth paragraph”
- Site-wide position options (Settings UTS TOC):
- Before the first heading
- After the first heading
- After the Nth paragraph (default: after the 2nd paragraph)
- Before all content
- After all content
- Manually, anywhere, using the [uts_toc] shortcode
- Optional collapsible box, numbered/bulleted list, smooth scrolling.
Also by UTS Sites
If this plugin was useful, you might also like another plugin from the same developer:
- UTSSites Auto FAQ Schema: https://wordpress.org/plugins/utssites-auto-faq-schema/
More plugins and tools: UTS Sites
Installation
Method 1: Install from your WordPress dashboard (recommended)
- Log in to your WordPress admin dashboard.
- Go to Plugins Add New Plugin.
- Search for “UTS Sites Table of Contents”.
- Click Install Now next to the plugin by UTS Sites.
- Once installed, click Activate.
- Go to Settings UTS TOC to configure the default position, heading levels, colors, and SEO structured data (optional; it works with sensible defaults right away).
Method 2: Manual upload (ZIP file)
- Download the plugin’s ZIP file from this page (Download button) or from the WordPress.org repository.
- In your WordPress dashboard, go to Plugins Add New Plugin Upload Plugin.
- Choose the downloaded ZIP file and click Install Now.
- Once installed, click Activate.
- Go to Settings UTS TOC to configure it, or leave the defaults as-is.
Method 3: Manual FTP upload
- Unzip the downloaded plugin file on your computer.
- Upload the resulting
uts-sites-table-of-contentsfolder to/wp-content/plugins/on your server via FTP or your host’s File Manager. - In your WordPress dashboard, go to Plugins and click Activate under “UTS Sites Table of Contents”.
- Go to Settings UTS TOC to configure it.
After activation
Open any post or page editor to see the “UTS Sites TOC” box in the sidebar. Use it to disable the TOC or change its position for that one post only, without touching the global setting.
FAQ
-
Does this help SEO?
-
It improves the technical SEO signals a TOC plugin can control: crawlable per-section anchors, semantic/ARIA markup, and optional JSON-LD structured data. It does not and cannot affect E-E-A-T, which is about your content’s quality and authorship.
-
Will this change my site’s colors or fonts?
-
The TOC’s font always matches your theme (no font-family override). Link and marker colors default to a neutral, readable color designed to work on both light and dark backgrounds; you can override any color, or the per-level font sizes, in Settings UTS TOC.
-
Can I hide the TOC on just one blog post?
-
Yes. Open that post’s editor, find the “UTS Table of Contents” box in the sidebar, and set “Show TOC on this post” to “Never show (disable here)”.
-
Can different posts use different positions?
-
Yes. Leave the per-post “Position” field on “Use default setting” to follow the global setting, or pick a specific position (including its own paragraph number) just for that post.
-
Can I place the TOC manually instead of automatically?
-
Yes. Set Position to “Manual” (globally or per-post), then place the [uts_toc] shortcode wherever you like in the editor.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“UTS Sites Table of Contents” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “UTS Sites Table of Contents” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.15.9
- Marker position changed again: it now stays aligned to the first line of the text — same vertical spot as a single-line item — instead of centering across all wrapped lines when an item spans 2-3 lines.
1.15.8
- Fixed the 1.15.7 centering fix having no visible effect: a leftover
margin-topon the dot (from the old baseline-alignment days) was still pushing it down, canceling out the new center alignment. Removed it — the dot now genuinely sits centered.
1.15.7
- Bullet/number marker is now vertically centered against the text (was baseline-aligned, which sat too low for a round dot and stayed pinned to only the first line on wrapped/multi-line items).
1.15.6
- Properly eliminated the light/dark mode flash (previous fix in 1.15.3 reduced but didn’t fully remove it, since a browser can paint content before a synchronous script right after it actually executes, on slower connections/devices). The TOC box now starts invisible via inline style — painted before any script runs — and is only revealed once its correct light/dark mode is confirmed, so nothing incorrect is ever visible even for a moment. Includes fallbacks (try/catch, noscript, and a JS safety net) so the box can never be stuck permanently hidden if detection fails for any reason.
1.15.5
- Registered this plugin with Rank Math’s “Use a Table of Contents” content-analysis test (via Rank Math’s own documented rank_math/researches/toc_plugins filter), so it correctly detects the TOC and marks that test as passed instead of always failing it. (No equivalent public hook exists for other SEO plugins’ TOC detection at this time.)
1.15.4
- Fixed the “Use theme colors for everything (reset)” button after the 1.15.0 visual color picker upgrade — it was only clearing the raw input value, not the color picker widget’s own display, so fields could still show a picked color after reset. It now properly syncs with the picker so every field visibly returns to inherited/theme default.
1.15.3
- Fixed a brief visible flash from light to dark mode on dark-themed sites. The dark/light detection used to run only after the full page finished loading (DOMContentLoaded), so the box would render light for a moment first. It now also runs via a tiny inline script placed immediately after each TOC box, applying the correct mode essentially instantly.
1.15.2
- Corrected mix-up: #0074b6 applies to the section heading color (not the toggle switch, which is back to #2563eb).
1.15.1
- Toggle switch ON color set to #0074b6 (final).
1.15.0
- All 8 color fields (Marker, Border, Link, Background — light and dark) now use WordPress’s built-in visual color picker instead of plain text boxes: a colored swatch button opens a full picker with a saturation/hue map, RGB, and hex input. Typing a hex code by hand still works exactly as before.
1.14.14
- Toggle switch ON color reverted back to #2563eb.
1.14.13
- Toggle switch ON color changed to #0074b6.
1.14.12
- Toggle thumb no longer sits flush against the right edge in the ON position — it now leaves the same small gap on the right as it has on the left when OFF.
1.14.11
- Fixed the toggle switch thumb (white circle) rendering off-center/poking above the track on some devices. It was previously drawn as a ::before pseudo-element directly on the itself, which browsers don’t render 100% consistently for form controls. Rebuilt using the standard, cross-browser-safe pattern: a visually-hidden checkbox plus a sibling track/thumb element.
1.14.10
- Hardened the settings-page toggle switch CSS with !important, guaranteeing the bright blue ON color can’t be overridden by WordPress admin core styles or another plugin’s admin CSS.
1.14.9
- Field labels (Enable TOC, Post Types, Heading Levels, Minimum Headings, TOC Title, etc.) are now bold, matching the section titles’ weight.
1.14.8
- Section title color changed back to blue (#2271b1) per request.
1.14.7
- Added “Requires at least” (WP 5.6) and “Requires PHP” (7.4) to the plugin file header, so WordPress’s plugin update screen shows these instead of “-“.
1.14.6
- Section titles (General, Colors, Typography, etc.) now use an attractive indigo color instead of plain dark text.
- Settings page toggle switches now use a brighter blue when ON, instead of the duller WordPress-default blue.
1.14.5
- Section titles are now bolder and slightly larger for better visual hierarchy.
1.14.4
- Settings page section titles (General, Placement, Colors, Typography, etc.) are now dark instead of light blue, for better readability.
- The main “UTS Sites TOC” settings page heading now also shows the current plugin version next to it.
1.14.3
- Removed the OS-preference (prefers-color-scheme) dark-mode fallback in CSS. It guessed dark/light purely from the visitor’s phone/OS setting rather than the site’s actual background, causing a visible flash to dark on every page load/refresh for anyone browsing with their phone in dark mode — even on an all-light site. Light is now the only default; dark only applies once the JS has confirmed it from the page’s real rendered background.
1.14.2
- Found the real cause of the marker-to-text gap never changing:
display: flexon the item link had no!important, so a theme rule could override it back to the browser’s defaultdisplay: inlinefor links — and gap has zero effect on a non-flex element. The visible ~3px spacing people were seeing all along was just the bullet dot’s own small margin, never the actual configurable gap. Locked down display, align-items, and gap all with!important.
1.14.1
- The live-settings fetch added in 1.14.0 no longer depends on the PHP-localized utsTocSettings data (which lives in the same page HTML that a host/CDN cache can serve stale). It now works out its own REST URL directly from the plugin’s script tag src, which WordPress always version-busts on update — so this fix can no longer be silently defeated by a stale cached page.
1.14.0
- Added a small public REST endpoint (uts-toc/v1/style) that always reflects the CURRENT saved settings, and front-end JS now fetches it on every page load and applies the marker gap and any custom colors directly — independent of the surrounding page’s HTML. This fixes cases where a full-page cache (host-level or CDN) kept serving an old copy of a page, which made a just-changed setting (like the bullet/number gap) look like it “wasn’t working” even though it had saved correctly and the plugin code was right — the page itself just hadn’t been re-generated. This does not replace clearing your site’s cache after real content changes; it specifically guards the small set of visual settings this plugin controls.
1.13.11
- TOC item links now always render at normal font-weight, regardless of theme — fixes cases where a theme’s bold post-content link style made TOC entries look bold instead of matching the plugin’s intended plain text style.
1.13.10
- The link underline fix now also blocks border-bottom, box-shadow, background-image, and any ::before/::after “drawn bar” underline technique — not just text-decoration. Some themes render their link underline as a separate CSS layer entirely (e.g. an animated ::after bar) that a text-decoration override alone can never reach.
1.13.9
- Added two more layers against a theme’s hover/tap color bleeding onto the toggle button: (1) CSS now also blanks any ::before/::after pseudo-element the theme might use for a ripple/touch-feedback overlay — a separate visual layer the button’s own background/color rules can’t reach; (2) a small JS safety net now watches the button’s style attribute and instantly restores the lock-down style if any other script on the page (e.g. a theme’s JS-driven ripple effect) writes to it directly.
1.13.8
- The toggle’s “no theme styling” rule is now also written directly as an inline style=”” attribute on the button (in addition to the stylesheet rule), since inline !important always outranks any external stylesheet !important regardless of selector specificity. This is the strongest possible guarantee against a theme’s button hover/tap color bleeding through.
1.13.7
- Hardened the toggle’s “no theme hover” CSS with much higher selector specificity (repeated class + ancestor chain), since a plain class selector with !important can still lose to a more specific theme button rule. Fixes cases where a purple/gradient hover or tap-highlight was still bleeding through from the theme.
1.13.6
- Theme-proof front-end styling: TOC links never show an underline and never inherit a theme’s list bullets, regardless of theme.
- The collapsible toggle no longer picks up a theme’s global button hover/focus/active styling (background, gradient, shadow, border) — only its own arrow-circle hover remains.
- New Colors settings: independent Dark/Night Mode overrides for Bullet/Marker, Border/Accent, Link, and Background colors, each falling back to the light-mode color or theme default when left blank.
- New Typography setting: customizable gap between the bullet/number marker and its text (default 10px).
1.13.5
- Critical fix: the [uts_toc] shortcode caused a fatal error on every page it was used on (a required argument was missing from an internal function call). Automatic placement was never affected, only the manual shortcode.
- Added uninstall.php to remove all plugin data on uninstall.
- Full security and code-quality audit: all admin/editor scripts and styles are now properly enqueued, all inputs are sanitized, and the readme accurately describes every default.
1.12.0
- Added Typography settings: customize font size for each heading level (H2–H6) independently, with a one-click reset to default.
1.11.0
- Rebuilt list rendering so numbered and bulleted modes share one layout structure, keeping spacing and alignment identical in both, at every heading level.
1.10.0
- Added Scroll Offset setting (global and per-post) so headings aren’t hidden behind a sticky header when a TOC link is clicked.
- Fixed several edge cases in numbered-list rendering and automatic day/night color detection, ensuring numbers and colors are always correct regardless of heading nesting or theme.
1.9.3
- Added automatic day/night (light/dark) mode support. Reads the page’s actual rendered background color, live, so it matches any theme’s toggle without guessing a class name.
1.7.0
- Added a Colors settings card: custom marker, border, link, and background colors, all optional with a one-click reset to theme defaults.
- Added optional transparent-background mode and an optional visible “Powered by” credit line.
1.2.0
- Added SEO features: crawlable heading anchor IDs, a semantic nav landmark with proper ARIA labelling, and optional JSON-LD ItemList structured data.
1.1.0
- Added a per-post meta box to enable/disable the TOC and override its position individually per post or page.
1.0.0
- Initial release.
