wazum / sluggi
TYPO3 extension for URL slug management with inline editing, auto-sync, locking, access control, and redirects
Installs: 466 448
Dependents: 0
Suggesters: 0
Security: 0
Stars: 40
Watchers: 4
Forks: 28
Open Issues: 22
Type:typo3-cms-extension
pkg:composer/wazum/sluggi
Requires
- php: ^8.2
- typo3/cms-backend: ^13.4
- typo3/cms-core: ^13.4
- typo3/cms-redirects: ^13.4
Requires (Dev)
- b13/masi: ^3.0
- friendsofphp/php-cs-fixer: ^3.65
- phpspec/prophecy: ^1.20.0
- phpspec/prophecy-phpunit: ^2.3.0
- phpstan/phpstan: ^2.0.3
- slevomat/coding-standard: ^8.15
- squizlabs/php_codesniffer: ^3.11.1
- typo3/cms-install: ^13.4
- typo3/coding-standards: ^0.8.0
- vimeo/psalm: 6.x-dev
Suggests
- b13/masi: Add better control over slug generation (e.g. for folders).
- internetgalerie/ig-slug: Rebuild URL slugs.
- typo3/cms-install: Add ability to run migration upgrade wizard.
- dev-main
- 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-demo-main
- 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-05 12:50:20 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
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
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
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










