wazum / sluggi
TYPO3 extension for URL slug management with inline editing, auto-sync, locking, access control, and redirects
Installs: 469 020
Dependents: 0
Suggesters: 0
Security: 0
Stars: 40
Watchers: 4
Forks: 29
Open Issues: 0
Type:typo3-cms-extension
pkg:composer/wazum/sluggi
Requires
- php: ^8.2
- typo3/cms-backend: ^12.4 || ^13.4 || ^14.1
- typo3/cms-core: ^12.4 || ^13.4 || ^14.1
- typo3/cms-redirects: ^12.4 || ^13.4 || ^14.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.65
- phpstan/phpstan: ^2.0
- phpunit/phpunit: ^10.5 || ^11.5
- typo3/cms-fluid-styled-content: ^12.4 || ^13.4 || ^14.1
- typo3/cms-frontend: ^12.4 || ^13.4 || ^14.1
- typo3/cms-install: ^12.4 || ^13.4 || ^14.1
- typo3/cms-rte-ckeditor: ^12.4 || ^13.4 || ^14.1
- typo3/cms-setup: ^12.4 || ^13.4 || ^14.1
- typo3/testing-framework: ^7.0 || ^8.0 || ^9.0
Suggests
- georgringer/news-redirect-slug-change: Generate redirects when news slugs change
- internetgalerie/ig-slug: Rebuild URL slugs in bulk
- dev-main
- 14.0.1
- 14.0.0
- 13.0.3
- 13.0.2
- 13.0.1
- 13.0.0
- v12.x-dev
- 12.1.3
- 12.1.2
- 12.1.1
- 12.1.0
- 12.0.2
- 12.0.1
- 12.0.0
- v11.x-dev
- 11.2.1
- 11.2.0
- 11.1.2
- 11.1.1
- 11.1.0
- 11.0.1
- 11.0.0
- v10.x-dev
- 10.3.2
- 10.3.1
- 10.3.0
- 10.2.0
- 10.1.2
- 10.1.1
- 10.1.0
- 10.0.0
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0
- 2.2.0
- 2.1.1
- 2.1.0
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.11.0
- 1.10.3
- 1.10.2
- 1.10.1
- 1.10.0
- 1.9.14
- 1.9.13
- 1.9.12
- 1.9.11
- 1.9.10
- 1.9.9
- 1.9.8
- 1.9.7
- 1.9.6
- 1.9.5
- 1.9.4
- 1.9.3
- 1.9.1
- 1.9.0
- 1.8.5
- 1.8.4
- 1.8.3
- 1.8.2
- 1.8.1
- 1.7.1
- 1.7.0
- 1.6.0
- 1.5.0
- 1.4.0
- 1.3.0
- 1.2.2
- 1.2.1
- 1.2.0
- 1.1.0
- 1.0.0
- dev-legacy-main
- dev-bugfix/slug-relevant-fields-changed
- dev-old
- dev-typo3-10
- dev-typo3-9-support
This package is auto-updated.
Last update: 2026-02-11 16:05:02 UTC
README
URLs that stay in sync when titles change. Automatic redirects. Duplicate prevention on copy, move, and recycler restore. Locking, access control, conflict detection – everything you need to manage URL paths with confidence.
One composer require, sensible defaults – highly configurable when you need it.
Try the interactive demo – see every feature live in your browser, no installation required.
Installation
composer require wazum/sluggi
Version 14 is a complete rewrite of sluggi – modern, fully tested, and compatible with TYPO3 12.4, 13.4, and 14.
This is the version you should install regardless of your TYPO3 version. Previous major versions are no longer maintained.
What You Get
Automatic sync – Rename a page, the URL updates. All child pages follow. Redirects are created automatically.
Conflict detection – Duplicate URLs are caught instantly with unique alternatives proposed.
Locking – Pin critical URLs so nobody accidentally breaks them.
Access control – Let editors change the last segment only, or restrict editing based on their page tree permissions.
Duplicate prevention – Unique slugs on copy, move, and recycler restore. No more 500 errors from slug collisions.
Redirect control – Editors choose whether to create redirects when changing a URL.
Any table – Works with pages, news, events, or any record with a TCA slug field.
Features
Modern URL Path Editor
Out of the box, sluggi replaces the default slug field with a clean, focused interface:
Auto-Sync: Change a Title, Update the URL
When sync is enabled, URL paths regenerate automatically when source fields (e.g. title, nav_title) change. A badge on the source field shows it drives the URL:
- Per-page sync toggle – disable it for pages with manually crafted URLs
- Child pages update recursively when a parent path changes
- Redirects from old to new URL are created automatically via EXT:redirects
- Works for any table with a slug field (news, events, custom records)
Lock URLs to Prevent Accidental Changes
- Locked URLs cannot be edited and are skipped during auto-sync
- Optionally lock all descendant paths when an ancestor is locked
- Editing the full path auto-locks it to prevent sync from overwriting your work
Translated Pages
Translated pages inherit the sync and lock settings from the default language record. The toggles are disabled and display the parent's state – translations cannot override these flags independently. This ensures consistent URL behavior across all language versions.
Granular Access Control for Editors
Last segment only – Non-admins edit just the final path segment. The parent path is read-only:
Full path editing – A button lets permitted users temporarily unlock the full path:
Hierarchy permissions – Editing is restricted based on page tree permissions. Users can only modify segments for pages they're allowed to edit:
Redirect Control
Let editors decide whether to create redirects when a URL changes:
The choice applies recursively to all affected child pages. Self-referencing redirects are prevented automatically, and stale redirect cleanup only affects auto-created redirects – manually created redirects are never touched.
Re-apply URL Paths Recursively
Right-click any page in the page tree and select More options > Re-apply URL paths recursively to regenerate URL paths for all descendant pages based on their current source fields (e.g. title, nav_title):
- Useful after reverting a slug change via TYPO3's undo notification, or when child pages have stale prefixes
- Slugs are regenerated from scratch using source fields – not by prefix replacement
- Hidden pages are included, locked pages are skipped (descendants still update unless
lock_descendantsis enabled) - All changes share a single correlation ID – TYPO3's undo notification lets you revert everything at once
- Admin users only
Copy URL to Clipboard
Slug Normalization
TYPO3 core turns a title like "Products/Services" into /products/services (two segments) instead of /products-services (one segment). sluggi fixes this globally – for manual edits, auto-sync, regeneration, and page tree inline editing. Optional underscore preservation (RFC 3986) is also available.
Duplicate Prevention Where TYPO3 Core Doesn't
- Copy: Copied pages get unique slugs in the target location
- Move: Child slugs update to reflect the new parent path
- Recycler restore: Restored records get deduplicated slugs instead of causing 500 errors
Excluded Page Types
Remove URL paths from page types that don't need them (Sysfolder, Recycler, Spacer). An upgrade wizard cleans up existing slugs.
Configuration
All features work out of the box with sensible defaults. Fine-tune via System > Settings > Extension Configuration > sluggi:
Basic
| Setting | Description | Default |
|---|---|---|
exclude_doktypes |
Remove URL paths from page types that will never be visited directly. Comma-separated doktypes, e.g. 199,254,255 for Spacer, Sysfolder, and Recycler. Keeps your slug table clean. |
– |
preserve_underscore |
Keep underscores in URL paths instead of converting them to dashes. Useful when your URL convention or external systems require underscores (RFC 3986 compliant). | Off |
copy_url |
Show a button to copy the full page URL to the clipboard. Saves editors from navigating to the frontend just to grab a link for emails, documents, or tickets. | On |
last_segment_only |
Non-admin editors can only change the last segment of a URL path. The parent path stays read-only, preventing editors from accidentally breaking the site's URL hierarchy. | Off |
allow_full_path_editing |
Show a button that lets permitted editors temporarily unlock the full path for editing (requires last_segment_only). The slug auto-locks afterwards to prevent sync from overwriting the custom path. |
Off |
Sync
| Setting | Description | Default |
|---|---|---|
synchronize |
Keep URLs in sync with page titles automatically. When an editor renames a page, the URL path updates instantly – no manual work, no stale URLs. Redirects from old to new are created via EXT:redirects. | On |
synchronize_default |
Turn on sync for every newly created page. Editors can still disable it per page for manually crafted URLs. | On |
synchronize_tables |
Extend auto-sync beyond pages to any table with a slug field. Comma-separated list, e.g. tx_news_domain_model_news. Supports multi-field generation with fieldSeparator. |
– |
Lock
| Setting | Description | Default |
|---|---|---|
lock |
Let editors pin important URLs so they can't be changed accidentally. Locked paths are also skipped during auto-sync, giving you full control over critical landing page URLs. | Off |
lock_descendants |
When a parent page has a locked URL, protect all child page URLs too. Useful for entire sections of your site where URL stability is critical (e.g. campaign landing pages). | Off |
Redirect
| Setting | Description | Default |
|---|---|---|
redirect_control |
Show a modal when a URL changes, letting the editor decide whether to create a redirect. Gives editors control instead of silently creating redirects they may not want. The choice applies recursively to all affected child pages. | Off |
For deployment or version-controlled configuration, set values in config/system/additional.php:
$GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['sluggi'] = [ 'synchronize' => '1', 'synchronize_default' => '1', 'synchronize_tables' => 'tx_news_domain_model_news', 'lock' => '1', 'lock_descendants' => '0', 'last_segment_only' => '1', 'allow_full_path_editing' => '1', 'exclude_doktypes' => '199,254,255', 'copy_url' => '1', 'preserve_underscore' => '0', 'redirect_control' => '1', ];
Site Configuration: Redirects & Recursive Slug Updates
sluggi requires EXT:redirects which controls what happens when a page slug changes: whether child pages update recursively, whether redirects are created, how long they live, and which HTTP status code they use.
These settings are configured per site via TYPO3 site sets. To activate them, add the typo3/redirects set to your site's config.yaml and override the defaults in settings.yaml.
Step 1: Add the redirects site set
In config/sites/<your-site>/config.yaml, add typo3/redirects to the dependencies list:
base: 'https://example.com/' rootPageId: 1 dependencies: - typo3/redirects languages: # ...
Step 2: Override settings
Create config/sites/<your-site>/settings.yaml with the settings you want to change:
redirects: autoUpdateSlugs: true autoCreateRedirects: true redirectTTL: 0 httpStatusCode: 301
Available Settings
| Setting | Type | Default | Description |
|---|---|---|---|
redirects.autoUpdateSlugs |
bool | true |
Recursively update child page slugs when a parent slug changes. Works together with sluggi's auto-sync – when a title change triggers a slug update on a parent page, all descendants get their slug prefix replaced automatically. |
redirects.autoCreateRedirects |
bool | true |
Create redirect records from old to new URL when a slug changes. Only applies in the live workspace – editing in a workspace does not create redirects until the change is published. |
redirects.redirectTTL |
int | 0 |
Lifetime in days for auto-created redirects. 0 means no expiration. When set, the redirect's endtime is calculated as creation time + TTL days. |
redirects.httpStatusCode |
int | 307 |
HTTP status code for auto-created redirects. Does not affect manually created redirects. Common values: 301 (Moved Permanently – best for SEO), 302 (Found), 307 (Temporary Redirect – the default). |
How this relates to sluggi: When sluggi's auto-sync regenerates a slug (because the page title changed), EXT:redirects picks up the change and applies the settings above. If
autoUpdateSlugsis enabled, child pages update recursively. IfautoCreateRedirectsis enabled, redirect records are created for the old URLs. TheredirectTTLandhttpStatusCodesettings control the properties of those redirect records. When sluggi'sredirect_controlfeature is enabled, editors can overrideautoCreateRedirectson a per-change basis via a modal dialog.
Ready-to-Use Configuration Presets
sluggi ships ready-to-use presets in Configuration/SiteSettings/. TYPO3's YAML loader supports imports with EXT: paths, so you can reference them directly from your settings.yaml without copying files.
Create config/sites/<your-site>/settings.yaml with an import:
imports: - { resource: 'EXT:sluggi/Configuration/SiteSettings/recommended.settings.yaml' }
You can override individual values after the import:
imports: - { resource: 'EXT:sluggi/Configuration/SiteSettings/recommended.settings.yaml' } # Override just the TTL from the preset redirects: redirectTTL: 180
Available presets:
| Preset | Status code | TTL | Description |
|---|---|---|---|
| recommended | 301 | permanent | Best for production sites where SEO matters |
| temporary-with-ttl | 307 | 90 days | Sites with frequently changing content (news, events, campaigns) |
| no-auto-redirects | – | – | Recursive slug updates only, redirects managed externally or manually |
| manual-only | – | – | No recursive updates, no auto-redirects, full manual control |
How It All Fits Together
| What happens | autoUpdateSlugs |
autoCreateRedirects |
sluggi synchronize |
sluggi redirect_control |
|---|---|---|---|---|
| Title changes → slug updates | – | – | controls this | – |
| Parent slug changes → child slugs update | controls this | – | – | – |
| Old URL → redirect to new URL | – | controls this | – | – |
| Editor chooses whether to create redirect | – | must be true |
– | controls this |
For the full EXT:redirects documentation, see the TYPO3 Redirects Setup. For details on TYPO3 site sets and settings, see Site Settings.
Permissions
Every sluggi feature integrates with TYPO3's standard backend user and group permissions. You decide per user group which editors can see and use which controls – the same way you manage access to any other field in TYPO3:
| Field | Permission controls |
|---|---|
pages:slug |
Edit the URL path |
pages:tx_sluggi_sync |
Toggle sync on/off |
pages:slug_locked |
Lock/unlock URLs |
pages:tx_sluggi_full_path |
Use full path editing |
Example setup for a typical editorial team:
| Admin | Senior Editor | Editor | |
|---|---|---|---|
| Edit URL path | ✓ | ✓ | ✓ |
| Toggle sync | ✓ | ✓ | – |
| Lock/unlock URLs | ✓ | ✓ | – |
| Full path editing | ✓ | ✓ | – |
Admin – Full control over all URL features.
Senior Editor – Can lock critical URLs before a campaign launch, toggle sync for pages with manually crafted paths, and edit full URL paths when needed.
Editor – Can edit the last segment of a URL (with last_segment_only enabled), but cannot disable sync or unlock a locked URL. URLs stay consistent without extra training.
User Settings
Users can enable compact controls via User Settings > Personalization to collapse controls behind a menu icon.
Slug Source Fields
sluggi reads the source fields for slug generation from the standard TCA generatorOptions.fields configuration of the slug column. All referenced fields are automatically detected — they get a badge in the backend and the frontend component listens to them for real-time sync.
'slug' => [ 'config' => [ 'type' => 'slug', 'generatorOptions' => [ 'fields' => [['nav_title', 'title']], ], ], ],
For more configuration options (e.g. multiple fields, fallback chains, field separators), see the TYPO3 TCA slug documentation.
For non-page tables, add the table name to the synchronize_tables extension setting. The slug is then auto-regenerated whenever a source field changes on save.
Requirements
- TYPO3 12.4 – 14.x
- PHP 8.2+
- EXT:redirects
Suggested Extensions
- news-redirect-slug-change – Redirects when news slugs change
- ig-slug – Rebuild URL slugs in bulk
- masi – Exclude specific page slugs from subpage URL generation
- content_slug – Slug field for human-readable content element anchors (
#my-section)
Fixes for TYPO3 Core Issues
sluggi works around these known TYPO3 core issues:
- #108375 – When multiple pages are updated in a single DataHandler operation (e.g. recursive slug update), TYPO3 core assigns each page its own correlation ID, making it impossible to revert all changes at once via the undo notification. sluggi shares one correlation ID across all pages in the operation so the entire batch can be reverted with a single click.
- #108870 – The "Revert update" notification after a slug change only rolls back child page slugs and redirect records, but not the parent page's own slug change. sluggi extends the rollback to include the parent page so the entire change is fully reverted.
- #106152 – Restoring pages from the recycler does not check for slug conflicts, which can result in duplicate URLs and 500 errors. sluggi validates and deduplicates slugs on restore.
- #86740 – TYPO3 core treats slashes in page titles as path separators, turning "Products/Services" into two URL segments instead of one. sluggi normalizes slashes to the fallback character globally.
- #103833 – Renaming a slug back to a previous value can leave behind a self-referencing redirect. sluggi prevents creation of self-referencing redirects automatically.
- #97962 – TYPO3 core always replaces underscores with the fallback character during slug generation. sluggi adds a
preserve_underscoresetting for RFC 3986 compliant URLs. - #94003 – When copying a page subtree, TYPO3 core changes the copied parent's slug immediately (e.g. appending
-1) but fails to update child pages' slug prefixes accordingly. sluggi recalculates all slugs in the copied tree with correct parent prefixes.
TYPO3 Version Notes
TYPO3 13.4.25+ is required because it switches auto redirect creation to use DataHandler instead of direct database operations, which is necessary for sluggi's DataHandler hooks (redirect control, correlation ID sharing) to work correctly.
Support and Feature Requests
Use the issues tracker on GitHub for support questions and new feature requests or ideas concerning the extension.
Credits and Sponsors
Many thanks to plan2net GmbH for allowing me to work on the extension during my working hours and for great projects where this extension is already being used in real life.
Special thanks to TU München and other German universities that sponsored my time at plan2net GmbH to work on this extension (applies to previous versions).
License
GPL-2.0-or-later











