Speaking URL fragments (anchors) 

Classification

content_slug

Version

4.3

Language

en

Description

Adds a slug field for human-readable anchors ("domain.com/page/#my-section") to TYPO3 content elements. By default, this anchor is rendered as the header's id attribute.

Keywords

URL, fragment, anchor, human-readable, slug, links

Copyright

2020

Author

Sebastian Klein

Email

sebastian@sebkln.de

License

Open Publication License available from www.opencontent.org/openpub/

Rendered

Tue, 02 Dec 2025 19:59:24 +0000

The content of this document is related to TYPO3, a GNU/GPL CMS/Framework available from www.typo3.org.

Table of Contents 

Introduction 

"Speaking URLs" are a must-have feature for web pages. TYPO3 v9 and newer provide the Routing feature for this. Former TYPO3 versions needed the third-party extensions RealURL or CoolUri.

TYPO3 also provides the navigational content elements "Section index" and "Section index of subpages from selected pages", which will build a list of pages and their included content elements.

These content elements will be linked by their unique id, e.g.:

https://www.example.org/a-sub-page/#c123
Copied!

It's working well, but it's not human-readable.

What does it do? 

First of all, this extension provides human-readable URL fragments for TYPO3 content elements:

https://www.example.org/a-sub-page/#section-of-interest
Copied!

Furthermore, the extension allows to set anchor links next to the header. An editor can activate these with a checkbox for individual content elements.

Features 

  • Editors can set individual, human-readable fragment identifiers per content element.
  • Editors can use a button to automatically generate a fragment from the current header.
  • Editors can activate anchor links to headers per content element.
  • Scope: The human-readable fragment is used in Section Index menus, as well as for links in the RTE or TCA fields with renderType inputLink.
  • Fallback: If no custom fragment is given, or the header is hidden, the default fragment is used in rendered links.
  • Evaluation #1: Only supported characters are stored. Special characters are replaced.
  • Evaluation #2: All content elements on the same page will get a unique fragment identifier.
  • Error prevention: By default, the fragments are prepended with the uid of the content element.
  • Of course, the Fluid templates can be customized to your needs.

Screenshots 

You can find more screenshots in the Editors Manual.

The new fields for editors

The new fields for editors

Preface 

URL anchors (or fragments) are a handy feature for directly navigating a specific section of a web page.

This is also very useful if you want to share a particular section of a page with another person.

TYPO3 provides several ways to link to content elements. The generated URL in your web browser will look something like this:

https://www.your-website.com/a-sub-page/#c123
Copied!

It would be nice if #c123 were more meaningful:

https://www.your-website.com/a-sub-page/#c123-some-interesting-content
Copied!

This extension will help you with that!

Where will my URL anchor be used? 

There are several ways in TYPO3 to link directly to a content element:

  1. Content elements "Section index" and "Section index of subpages from selected pages".

    These menus will automatically provide a list of links to content elements on (selected) subpages.

  2. Rich text editor (RTE)

    You can set individual links to content elements in the RTE through the Link Browser.

  3. Link fields

    You can e.g. add a link to the content element's header.

Whenever the subsequent requirements are fulfilled, the human-readable URL anchor will be used in these links.

When will my URL anchor be used? 

TYPO3 will use your human-readable URL anchor if the following requirements are met:

  1. Of course, the backend field for the URL anchor must be filled.
  2. Your header must be visible in the frontend (not set to "Hidden").

Otherwise, links to this content element will still use the default, which is the element's unique id.

Using the anchor fields 

1.) Getting human-readable anchors 

You can use the following text field to set a more readable anchor for a TYPO3 content element.

The button on the right allows you to automatically generate an anchor from the current contents of the header field. You can, of course, modify the anchor afterwards.

Human-readable URL anchor

Text field for a human-readable URL anchor

Mass editing of anchors 

The List module makes it possible to display the content of several fields at once and gives you the ability to edit several records with one action.

This allows you, for example, to quickly add human-readable anchors to all content elements on a page at once.

  1. Click the Show columns button and enable the field "Human-readable URL #anchor".

    Screenshot demonstrating the location of the "Show columns" Button in the TYPO3 List module

    A table with content elements in the List module. The anchor field is already enabled and visible as the last column the right.

  2. Select the content elements you want to update, then click the Edit columns button

    Using the Edit columns button will open the header field together with every enabled column in the list.

    Screenshot

    Selecting records for editing in TYPO3 v13 and newer

  3. Edit the anchor fields of multiple content elements

    Screenshot of the editing form that lists the selected fields

    Mass editing of anchors using the buttons on the right, with manual adjustments as needed

Correct syntax for URL anchors 

Please be aware that only a limited set of characters can be used for such an URL anchor (officially called a "fragment identifier"). These are technical limitations.

Also, all URL anchors on the same page must be unique! If you use the same URL anchor in two or more content elements on the same page, they will be automatically appended with increasing numbering when saving.

If you write a non-supported character in the URL anchor field, it will be replaced when you leave the field or save the content element.

The following characters are allowed in this field:

  • ASCII characters (a–z)
  • digits (0–9)
  • underscores (_)
  • hyphens (-)
  • periods (.)

As soon as you leave the field (or the content element is saved) …

  • … all characters are converted to lowercase.
  • … HTML elements are removed completely.
  • … space characters are converted to the hyphen character.
  • … special characters (e.g. äöü߀) are converted to ASCII equivalents.

Installation 

The extension needs to be installed as any other extension of TYPO3 CMS.

Perform the following steps:

  1. Get the extension

    1. Use composer: Use composer require sebkln/content-slug
    2. Use the Extension Manager: Select "Get extensions". Press the "Update now" button and search for the extension key content_slug. Download the latest version by using the Import button, or click on the extension's title to download a version of your choice.
    3. Get it from typo3.org: You can download a version's ZIP archive from https://extensions.typo3.org/extension/content_slug. Afterwards, upload the file in the Extension Manager.

    You can also get the latest dev-master version from GitHub by using the command line:

    git clone https://github.com/sebkln/content_slug.git
    Copied!
  2. Install the extension

    Activate the extension in the TYPO3 backend module Admin Tools > Extensions.

    If you're using TYPO3 11.4 (or later) and composer, all extensions are automatically considered as active.

  3. Include the static template

    The extension ships some TypoScript code which needs to be included.

    1. Switch to the root page of your website.
    2. Open the Template record.
    3. Switch to the Includes tab of the template record.
    4. Select "Speaking URL fragments (anchors) (content_slug)" in the field Include static (from extensions). It must be loaded after the static template "Fluid Content Elements (fluid_styled_content)"!
    Include the static template

    Include the static template

  4. Customize configuration and templates

    This extension extends EXT:fluid_styled_content and therefore provides customized Fluid templates.

    The Configuration section covers TypoScript settings and templating. Be sure to read Considerations first.

  5. Optional: Configure field permissions (for your editors)

    If your website uses Backend usergroups to configure access rights to fields, check out the User permissions.

Upgrading the extension 

Upgrading from EXT:content_slug 1.x to 2.x 

Version 2.0.0 allows to configure the URL fragment with TypoScript. Depending on how you customized Fluid templates, this can be a breaking change.

We can differentiate between the two Header partials and the Section Index templates:

Potentially breaking: Header partials 

Formerly, the Header/All.html partial transferred two additional variables to the Header/Header.html partial:

uid: data.uid,
fragmentIdentifier: data.tx_content_slug_fragment,
Copied!

This was then used in the Header/Header.html partial to build the complete URL fragment:

<h1 id="{f:if(condition: fragmentIdentifier, then: 'c{uid}-{fragmentIdentifier}')}" class="{positionClass}">
    <f:link.typolink parameter="{link}">{header}</f:link.typolink>
    <f:if condition="{fragmentIdentifier} && {renderAnchorLink}"><a class="headline-anchor" href="#c{uid}-{fragmentIdentifier}">#</a></f:if>
</h1>
Copied!

This has changed. fragmentIdentifier is still used as the variable name in the Header/Header.html partial. But instead of the raw contents of the tx_content_slug_fragment field, it now contains the complete URL fragment configured with TypoScript:

fragmentIdentifier: fragmentIdentifier,
Copied!

This should only be a breaking change if you use one of the Header partials directly from this extension and customized the other one in your sitepackage.

Should be non-breaking: "Section Index" templates 

Both "Section Index" templates were simplified, using the new TypoScript variable fragmentIdentifier.

Old version:

<a href="{page.link}#{f:if(condition: '({element.data.tx_content_slug_fragment} && {element.data.header_layout} != 100)', then: 'c{element.data.uid}-{element.data.tx_content_slug_fragment}', else: 'c{element.data.uid}')}"
Copied!

New version:

<a href="{page.link}#{f:if(condition: '{element.fragmentIdentifier}', then: '{element.fragmentIdentifier}', else: 'c{element.data.uid}')}"
Copied!

The default configuration provides the same URL fragment as before (a combination of UID and human-readable fragment).

If you customized these templates in your sitepackage, this should not be a breaking change – the tx_content_slug_fragment database field is still available, after all. And if you adjusted the prefix, this will remain the same.

Considerations 

By default, this extension will generate the following HTML markup for TYPO3 content element headers:

<header>
    <h1 id="c35-section-of-interest" class="">
        This is the header of an interesting part of my article

        <!-- This link is only rendered if 'Set link to #anchor' is activated -->
        <a class="headline-anchor" href="#c35-section-of-interest">#</a>
    </h1>
</header>
Copied!

As you can see, the fragment identifier is used as an id attribute in HTML. This id can then be referenced in a link.

Potential issue 

By adding the uid of the current TYPO3 content element, we'll circumvent this potential issue.

TypoScript Constants Reference 

plugin.tx_contentslug

Property Data type Default
settings.renderPrefix_ boolean 1
settings.renderSuffix_ boolean 0
settings.replaceFragmentInPageLinks_ boolean 1
settings.checkForHiddenHeaders_ boolean 1

Property details 

settings.renderPrefix 

Property
settings.renderPrefix
Data type
boolean
Description

Enables the prefix to the human-readable URL fragment. By default, the content element's uid is prepended like:

c<uid>-<human-readable-fragment>
c123-section-of-interest
Copied!

You can customize the prefix in plugin.tx_contentslug.urlFragmentPrefix

Default
1

settings.renderSuffix 

Property
settings.renderSuffix
Data type
boolean
Description

Enables the suffix to the human-readable URL fragment. By default, the content element's uid is appended like:

<human-readable-fragment>-<uid>
section-of-interest-123
Copied!

You can customize the suffix in plugin.tx_contentslug.urlFragmentSuffix

Default
0

settings.checkForHiddenHeaders 

Property
settings.checkForHiddenHeaders
Data type
boolean
Description
If disabled, fragment links are replaced even if the content element's header is hidden. Use this with care! See TypoScript Setup Reference for details.
Default
1

TypoScript Setup Reference 

Configure prefix and suffix 

plugin.tx_contentslug

Property Data type Default
urlFragmentPrefix data-type-cobject TEXT cObject with current UID
urlFragmentSuffix data-type-cobject TEXT cObject with current UID
replaceFragmentInPageLinks boolean 1
checkForHiddenHeaders boolean 1

urlFragmentPrefix 

Property
urlFragmentPrefix
Data type
data-type-cobject
Description

This cObject can be used to render a prefix for the human-readable URL fragment.

Prefix, suffix, and fragment are assembled in the custom variable fragmentIdentifier of lib.contentElement.

Default:

plugin.tx_contentslug.urlFragmentPrefix = TEXT
plugin.tx_contentslug.urlFragmentPrefix {
    field = uid
    stdWrap.noTrimWrap = |c|-|
    if.isTrue = {$plugin.tx_contentslug.settings.renderPrefix}
}
Copied!

Result:

c<uid>-<human-readable-fragment>
c123-section-of-interest
Copied!

urlFragmentSuffix 

Property
urlFragmentSuffix
Data type
data-type-cobject
Description

This cObject can be used to render a suffix for the human-readable URL fragment.

Prefix, suffix, and fragment are assembled in the custom variable fragmentIdentifier of lib.contentElement.

Default:

plugin.tx_contentslug.urlFragmentSuffix = TEXT
plugin.tx_contentslug.urlFragmentSuffix {
    field = uid
    stdWrap.noTrimWrap = |-||
    if.isTrue = {$plugin.tx_contentslug.settings.renderSuffix}
}
Copied!

Result (if activated):

<human-readable-fragment>-<uid>
section-of-interest-123
Copied!

settings.checkForHiddenHeaders 

Property
settings.checkForHiddenHeaders
Data type
boolean
Description

By default, this extension renders the human-readable fragment as an id attribute on the content element's header. Therefore, a given fragment will not be used for content elements that have a hidden (non-rendered) header.

If you disable this setting, fragment links are replaced even if the content element's header is hidden. You will then need to render this attribute on a different HTML tag. You will also need to hide the checkbox "Set link to #anchor", or migrate the corresponding HTML markup as well.

Recommendation: add the id attribute to the Fluid layout of content elements.

EXT:site_package/Resources/Private/Layouts/ContentElements/Default.html
<div id="c{data.uid}" class="frame frame-{data.frame_class} frame-type-{data.CType} frame-layout-{data.layout}{f:if(condition: data.space_before_class, then: ' frame-space-before-{data.space_before_class}')}{f:if(condition: data.space_after_class, then: ' frame-space-after-{data.space_after_class}')}">
    <f:if condition="{data._LOCALIZED_UID}">
        <a id="c{data._LOCALIZED_UID}"></a>
    </f:if>

    <!-- Add these lines: -->
    <f:if condition="{fragmentIdentifier}">
        <div id="{fragmentIdentifier}"></div>
    </f:if>

    <!-- etc. -->
</div>
Copied!
Default
1 (via TypoScript constant)

Assemble the fragmentIdentifier variable 

This variable is available in all Fluid templates of EXT:fluid_styled_content and allows to configure the complete URL fragment at a central place.

lib.contentElement {
    // Override default templates of fluid_styled_content:
    partialRootPaths.101 = EXT:content_slug/Resources/Private/Overrides/fluid_styled_content/Partials/
    templateRootPaths.101 = EXT:content_slug/Resources/Private/Overrides/fluid_styled_content/Templates/

    // Build a complete fragment identifier with possible prefix and suffix:
    variables {
        fragmentIdentifier = COA
        fragmentIdentifier {
            if.isTrue.field = tx_content_slug_fragment

            10 =< plugin.tx_contentslug.urlFragmentPrefix

            20 = TEXT
            20.field = tx_content_slug_fragment

            30 =< plugin.tx_contentslug.urlFragmentSuffix

            stdWrap.trim = 1
        }
    }
}
Copied!

Use FragmentIdentifierProcessor for "Section Index" menus 

The menu content elements of type "Section Index" are built with DataProcessors.

To get the configured fragmentIdentifier variable for each of the linked content elements in these menus, the custom FragmentIdentifierProcessor is needed.

// Process 'fragmentIdentifier' variable in section menus:
tt_content.menu_section.dataProcessing.10.dataProcessing.20.dataProcessing.5 = fragment-identifier
tt_content.menu_section_pages.dataProcessing.10.dataProcessing.20.dataProcessing.5 = fragment-identifier
Copied!

Sanitize custom data with postUserFunc 

In case you append or prepend some custom strings, you can use the fragment evaluation to sanitize the completed URL fragment again:

urlFragmentSuffix = TEXT
urlFragmentSuffix {
    field = subheader
    if.isTrue.field = subheader
    stdWrap.noTrimWrap = |-||
}

lib.contentElement.variables.fragmentIdentifier {
    stdWrap.postUserFunc = Sebkln\ContentSlug\Evaluation\FragmentEvaluation->sanitizeFragment
}
Copied!

User permissions 

You can set individual access rights for your backend user groups for both new database fields.

If you don't want to use the anchor links at all, you might disable the whole field with Page TSconfig:

TCEFORM.tt_content.tx_content_slug_link.disabled = 1
Copied!

Templating 

This extension enhances the existing TYPO3 content elements, which are commonly rendered with EXT:fluid_styled_content. Therefore, customized Fluid templates have to be provided by this extension.

It also works well with the Bootstrap Package.

In both cases, be sure to load the configuration of this extension after EXT:fluid_styled_content or EXT:bootstrap_package.

TypoScript setup 

You can configure the fragment identifier with TypoScript.

If you customize the templates, override the template paths of the content elements.

lib.contentElement {
    partialRootPaths.101 = EXT:content_slug/Resources/Private/Overrides/fluid_styled_content/Partials/
    templateRootPaths.101 = EXT:content_slug/Resources/Private/Overrides/fluid_styled_content/Templates/
}
Copied!

Fluid templates 

The customized Fluid templates contain some new variables and ViewHelpers to render the contents of the new fields.

Resources/Private/Overrides/fluid_styled_content/Partials/Header/All.html 

We need to transfer additional variables to Header.html:

<f:render partial="Header/Header" arguments="{
    header: data.header,
    layout: data.header_layout,
    positionClass: '{f:if(condition: data.header_position, then: \'ce-headline-{data.header_position}\')}',
    link: data.header_link,
    fragmentIdentifier: fragmentIdentifier,
    renderAnchorLink: data.tx_content_slug_link,
    default: settings.defaultHeaderType}" />
Copied!

Resources/Private/Overrides/fluid_styled_content/Partials/Header/Header.html 

Each heading (<h1> to <h5>) gets a new id attribute. It will contain the configured fragment identifier, if a fragment was set in the content element.

If a fragment exists and the checkbox "Set link to #anchor" is activated, an additional link will be rendered right to the header.

You can style this anchor through the class name and/or change the displayed symbol in the template.

<h1 id="{fragmentIdentifier}" class="{positionClass}">
    <f:link.typolink parameter="{link}">{header}</f:link.typolink>
    <f:if condition="{fragmentIdentifier} && {renderAnchorLink}"><a class="headline-anchor" href="#{fragmentIdentifier}">#</a></f:if>
</h1>
Copied!

Also important: if header_layout is set to default, the Header.html partial is called a second time. Therefore, we need to transfer our additional variables again:

<f:defaultCase>
    <f:if condition="{default}">
        <f:render partial="Header/Header" arguments="{
            header: header,
            layout: default,
            positionClass: positionClass,
            fragmentIdentifier: fragmentIdentifier,
            renderAnchorLink: renderAnchorLink,
            link: link}"/>
    </f:if>
</f:defaultCase>
Copied!

Resources/Private/Overrides/fluid_styled_content/Templates/MenuSection.html 

The TYPO3 content elements of CType "Section Index" and "Section Index of subpages from selected pages" both build a list of pages and their included content elements.

By default, the content elements will be linked by their unique id, e.g. https://www.example.org/a-sub-page/#c123.

The new Fluid condition will check if a fragment identifier is given for the content element.

If available, the configured fragment identifier is then rendered (identical to the anchor link in Header.html).

Otherwise, the default anchor to the content element is rendered (#c123).

<f:for each="{page.content}" as="element">
    <f:if condition="{element.data.header}">
    <li>
        <a href="{page.link}#{f:if(condition: '{element.fragmentIdentifier}', then: '{element.fragmentIdentifier}', else: 'c{element.data.uid}')}"
            {f:if(condition: page.target, then: ' target="{page.target}"')} title="{element.data.header}">
            <span>{element.data.header}</span>
        </a>
    </li>
    </f:if>
</f:for>
Copied!

Adjusting TCA 

1. Adding fragment fields to additional content elements 

The custom fields of EXT:content_slug are added to the TCA palette headers. This palette is used by most of the content elements in the TYPO3 core.

Some extensions might not use this palette, though. Instead, a reduced or custom palette is used to display the header field with some selected fields in the backend.

A good example is EXT:beautyofcode. This useful extension by developer Felix Nagel allows to render code examples with syntax highlighting and line numbers. It uses the reduced palette header (mind the missing s at the end).

Solution A: Replace the palette 

One possible way to add the fragment-related fields is to replace the header palette for its CType:

$GLOBALS['TCA']['tt_content']['types']['beautyofcode_contentrenderer']['showitem'] = str_replace(
    '--palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.header;header,',
    '--palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.header;headers,',
    $GLOBALS['TCA']['tt_content']['types']['beautyofcode_contentrenderer']['showitem']
);
Copied!

Solution B: Replace the showitem section 

Note that EXT:beautyofcode also hides the palette appearanceLinks, which contains the field sectionIndex.

So in this case, we can overwrite the entire showitem section to change the header palette and insert the appearanceLinks palette as well:

$GLOBALS['TCA']['tt_content']['types']['beautyofcode_contentrenderer']['showitem'] = '
    --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xml:palette.general;general,
    --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.header;headers,
    --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.plugin,
        pi_flexform,
        bodytext;LLL:EXT:beautyofcode/Resources/Private/Language/locallang_db.xlf:code,
    --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance,
        --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames,
        --palette--;;appearanceLinks,
    --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access,
        --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.visibility;visibility,
        --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access,
    --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.extended
';
Copied!

Solution C: Add the fragment fields to another palette 

Some custom content element might use a completely new palette to render the header field with some extras. In this case, you can use the TYPO3 API to add the fields to this palette.

You need to adjust the name of the custom palette (line 3) and set the position to before or after an existing field in this palette (line 5).

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToPalette(
    'tt_content', // Table for TYPO3 content elements
    'custom_palette', // The palette which should contain the fragment fields
    '--linebreak--, tx_content_slug_fragment, tx_content_slug_link', // The fields, rendered in a new line
    'after:some_field' // Position of the fragment fields
);
Copied!

2. Removing the uniqueInPid evaluation 

What does the uniqueInPid evaluation even do? 

It's a mechanism that prevents duplicate field values on the same page. This is very helpful for our URL fragments, as they need to be unique on each page (otherwise the browser can't distinguish the anchor links).

Why would I even consider to remove it then!? 

Imagine a website with translated content on the same page. The uniqueInPid evaluation doesn't distinguish between languages. That means you can't have identical anchor links in e.g. English and German.

In practice this seldom is an issue. But it might become one if you want to use technical terms or brand names as anchors (e.g. https://www.example.org/info/#typo3).

How to remove it from the list of eval functions 

The following code removes uniqueInPid from the list of eval functions. You mustn't remove the other two evaluations!

// Original:
$GLOBALS['TCA']['tt_content']['columns']['tx_content_slug_fragment']['config']['eval'] = 'trim,Sebkln\\ContentSlug\\Evaluation\\FragmentEvaluation,uniqueInPid';

// Remove the evaluation for all content elements:
$GLOBALS['TCA']['tt_content']['columns']['tx_content_slug_fragment']['config']['eval'] = 'trim,Sebkln\\ContentSlug\\Evaluation\\FragmentEvaluation';

// Or, maybe better: only remove it for selected content elements:
$GLOBALS['TCA']['tt_content']['types']['beautyofcode_contentrenderer']['columnsOverrides']['tx_content_slug_fragment']['config']['eval'] = 'trim,Sebkln\\ContentSlug\\Evaluation\\FragmentEvaluation';
$GLOBALS['TCA']['tt_content']['types']['textpic']['columnsOverrides']['tx_content_slug_fragment']['config']['eval'] = 'trim,Sebkln\\ContentSlug\\Evaluation\\FragmentEvaluation';
Copied!

Known Problems 

Current limitation in FragmentIdentifierProcessor 

While the DataProcessor can process TypoScript references (=<) to other cObjects inside fragmentIdentifier, lib.contentElement.variables.fragmentIdentifier mustn't be a reference by itself.

// This would work:
lib.contentElement {
    variables.fragmentIdentifier < lib.yourCustomFragment
}

// This would work:
lib.contentElement {
    variables.fragmentIdentifier = COA
    variables.fragmentIdentifier {
        10 =< lib.yourCustomFragment
    }
}

// This won't work:
lib.contentElement {
    variables.fragmentIdentifier =< lib.yourCustomFragment
}
Copied!

ChangeLog 

  1. Releases

    You can find an overview of all releases on GitHub.

  2. Changelog

    The best changelog is the GitHub commit log.

    I use commit messages to document some design decisions and to explain new features briefly.

  3. Blog articles

    If a version contains new features or important changes, I'll write a blog post about it (available in English and German):

    May 17, 2025: "Speaking URL fragments" 4.2.0 (EXT:content_slug)
    New: Improved mass editing of human-readable anchors.
    April 13, 2025: "Speaking URL fragments" 4.1.0 (EXT:content_slug)
    New: Allows to disable the check for hidden content element headers.
    July 7, 2024: "Speaking URL fragments" 4.0.0 (EXT:content_slug)
    New: Support of TYPO3 v13 and Site Sets. Migration from RequireJS to ES6 modules.
    July 29, 2023: "Speaking URL fragments" 3.1.0 and 2.2.0 (EXT:content_slug)
    Bugfix: Correct translation of human-readable anchors in the RTE / Backend JavaScript adjustments.
    February 25, 2023: "Speaking URL fragments" 3.0.1 and 2.1.1 (EXT:content_slug)
    Bugfixes: Check for existence of linked content element / Check for configuration in multi-domain setup.
    January 29, 2023: "Speaking URL fragments" 3.0.0 (EXT:content_slug)
    New: TYPO3 v12 support. Allows using the content element's header as a fallback (or the primary source) for human-readable fragments.
    May 14, 2021: "Speaking URL fragments" 2.0.0 (EXT:content_slug)
    New: Central TypoScript configuration of the URL fragment, as well as the support of links in the RTE (and TCA fields).
    March 20, 2021: "Speaking URL fragments" 1.2.0 (EXT:content_slug)
    New: use a button to automatically generate the URL fragment from the current header.
    April 2, 2020: "Speaking URL fragments" 1.1.0 (EXT:content_slug)
    New: immediate evaluation of the URL fragment when the editor leaves the form field.
    March 4, 2020: Release of TYPO3 extension "Speaking URL fragments" (EXT:content_slug)
    Human-readable URL anchors ("domain.com/page/#interesting-section") for TYPO3 content elements.