UTS Sites Table of Contents

Description

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 with role="doc-toc" and a proper aria-label, plus aria-expanded / aria-controls on the toggle button for assistive technology.
  • Optional JSON-LD ItemList structured 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: https://utssites.com

Installation

  1. Upload the uts-sites-toc folder to /wp-content/plugins/.
  2. Activate the plugin from the Plugins screen.
  3. Go to Settings UTS TOC to configure the default position, heading levels, title text, and SEO structured data.
  4. Open any post/page editor to see the “UTS Table of Contents” box in the sidebar — use it to disable the TOC or change its position for that one post only.

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.

Contributors

Changelog

1.13.5

  • Critical fix: the [uts_toc] shortcode caused a fatal error (PHP ArgumentCountError) 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.

1.13.4

  • Added uninstall.php: removes the settings option, activation transient, and all per-post meta on uninstall.

1.13.3

  • Fixed: readme, settings page, and code comments claimed colors/fonts were “always inherited from theme” — outdated since Colors and Typography settings were added. Documentation now accurately describes the actual defaults.

1.13.2

  • Added License URI header for completeness. Full audit found no remaining unsanitized inputs, unescaped output, raw script/style tags, or external network calls.

1.13.1

  • Fixed: used absint() instead of a plain int cast on one remaining $_POST value in the meta box save handler.

1.13.0

  • Fixed: all inline <script>/<style> tags in the admin settings, welcome, and post-editor meta box pages are now properly registered and enqueued via wp_enqueue_script/wp_enqueue_style with wp_add_inline_script/wp_add_inline_style, instead of being printed directly.
  • Fixed: the meta box nonce is now sanitized (sanitize_text_field/wp_unslash) before being passed to wp_verify_nonce().
  • Shortened the readme short description to fit the 150-character limit.

1.12.1

  • Cleaned up: removed remaining em-dashes from Settings (Typography) and Welcome page text. Confirmed all code comments are in plain English throughout.

1.12.0

  • Added: Typography settings — customize font size for each heading level (H2-H6) independently, with a Reset to Default button. Defaults match the plugin’s original sizing exactly.

1.11.1

  • Changed: title bar accent, top-level marker, and the sublist’s vertical divider line now align in one column instead of the sublist line sitting far to the right — removes wasted indent space.

1.11.0

  • Rebuilt bullet and numbered list rendering on one shared structure: marker and text are now separate elements laid out with flex, instead of the old hanging-indent trick. This fixes wrapped second lines not aligning cleanly under the first line’s text, and guarantees bullet/number spacing stays identical in every case.
  • Changed: numbered mode’s number is now a muted, professional weight/color instead of solid dark bold text.

1.10.12

  • Reverted numbered-mode padding to 1.15em (matching bullet mode’s line position exactly, as in earlier 1.10.x builds), kept the flex layout (no clipping on any level), and gave numbers a clean, professional look matching body text size.

1.10.11

  • Fixed: H2/H4/H5/H6 numbers were missing again (hanging-indent trick clips top-level items). Switched to flex layout while keeping the same 1.6em padding, so the vertical line position is unchanged but numbers now show at every level. Number font-size now matches body text instead of being shrunk/faded.

1.10.10

  • Testing: numbered mode reverted to the 1.9.9-style hanging-indent CSS (1.6em) for live comparison, per request.

1.10.9

  • Fixed a regression from 1.10.8: switching numbered mode to the hanging-indent trick clipped/hid the number on top-level (H2) items. Reverted to the flex layout (same one that was working correctly), keeping the equal padding/gap fixes.

1.10.8

  • Fixed: numbered mode used a different layout mechanism (flex) than bullet mode (hanging indent), causing spacing/wrapping differences. Both now use the exact same padding, indent, and margin — only the marker (dot vs number) differs.

1.10.7

  • Fixed: gap between marker and text was 0.6em in bullet mode but 0.5em in numbered mode. Both now use 0.6em.

1.10.6

  • Fixed: sublist vertical line sat at a different position in numbered vs. bullet mode (numbered items had no left padding). Both modes now use the same base indent, so the line lands in the same place either way.

1.10.5

  • Fixed: numbered list layout used a negative text-indent hack that could push numbers out of view or overlap adjacent items. Replaced with a simple flex layout so numbers on every level (H2-H6) are reliably visible and never overlap.

1.10.4

  • Fixed: numbered list numbers were still missing on H2 in some cases due to fragile CSS counter-reset scoping. Numbers are now computed directly in PHP and printed as plain text — no CSS counters involved, so this can’t go wrong regardless of nesting.

1.10.3

  • Cleaned up: removed remaining em-dash from the heading-skip warning text in the post editor meta box.

1.10.2

  • Cleaned up: removed em-dashes from Settings page and per-post meta box text, rewritten as normal sentences.

1.10.1

  • Fixed: numbered list mode showed wrong/missing numbers on H2 (and H4/H5/H6) when a heading returned to a shallower level after a deeper one — the list HTML wasn’t closing the parent item properly, corrupting the structure. Numbering is now correct at every heading level.

1.10.0

  • Added: Scroll Offset setting (global + per-post override) so headings aren’t hidden behind a sticky header when a TOC link is clicked. Default = 0px (normal). Per-post setting overrides global for that post only.

1.9.9

  • Fixed: collapse/expand arrow’s circle background was invisible in dark mode (was a fixed light-mode-only tint) — now uses a proper light-tint background in dark mode too.

1.9.8

  • Changed: dark mode link/item color is now a teal accent (#5eead4) instead of blue, separate from the title’s text color.

1.9.7

  • Fixed: readable text color now applies unconditionally by default (was previously gated behind a JS-set attribute, so it silently failed to apply in a race right after toggling). Also fixed a broken CSS selector that accidentally never matched TOC links, and added a click-based recheck so any theme toggle mechanism is caught.

1.9.6

  • Fixed: text/links were washed out in light mode because color was left as theme-inherited, and the theme’s own text color there is pale (meant for dark backgrounds). Now sets an explicit readable dark text color in light mode, and light text in dark mode, guaranteed contrast either way.

1.9.5

  • Fixed: TOC could appear faded/washed-out on load — now forces full visibility, overriding any theme/page-builder entrance-fade animation.

1.9.4

  • Fixed: day/night mode was mismatching on themes with manual toggles — now detects the actual rendered background color live via JS instead of guessing theme class names.
  • Improved: dark mode now sets a readable text color for the title and list items.

1.9.3

  • Added: automatic day/night (light/dark) mode support — matches OS-level dark mode and common theme dark-mode toggles automatically.

1.9.2

  • Changed: source-code credit comment is now always on and no longer a user-toggleable setting.
  • Improved: settings page and per-post meta box styling (toggle switches, chip selectors, native field widths).

1.7.0

  • Added: Colors settings card — custom bullet/marker, border/accent, link, and background colors (all optional, blank = theme default), with a one-click “Use theme colors for everything” reset.
  • Added: optional transparent-background mode (removes only the white box fill, everything else stays the same).
  • Added: optional visible “Powered by” credit line, and an optional invisible HTML source-code credit comment.
  • Fixed: bullet/number vertical alignment now uses a proper hanging-indent layout so it lines up correctly with heading text at any font size, and nested sub-lists always render below their parent item (never beside it).

1.2.0

  • Added SEO features: crawlable heading anchor IDs (always on), semantic nav landmark with role=”doc-toc” and ARIA labelling, optional JSON-LD ItemList structured data.

1.1.0

  • Default position changed to “After the 2nd paragraph”.
  • New per-post meta box: enable/disable TOC and override its position individually per post/page.

1.0.0

  • Initial release.