Calculate the estimated read time for content.
Read Time is a lightweight Craft CMS plugin that calculates the estimated reading time for your content. Whether you're running a blog, news site, or content-heavy publication, it gives your readers a quick "X min read" estimate so they know what to expect before they dive in. Just point it at your entries, Matrix, or Neo fields and it handles the rest—counting words and converting them into clean, human-readable reading times. You can fine-tune the calculation to match your audience by adjusting the average reading speed in a simple config file, and access the results anywhere in your templates through easy-to-use Twig filters and functions.
Usage
Using the Filter
The |readTime filter returns a TimeModel of how long it takes the average user to read the provided content. The value provided can be a string or an array of values.
Seconds are included by default, but can be disabled by using |readTime(false) — this only affects the human time format.
{{ string|readTime }}
{# Returns: 30 seconds #}
{{ richTextField|readTime }}
{# Returns: 2 minutes, 40 seconds #}
{{ richTextField|readTime(false) }}
{# Returns: 3 minutes #}
Using the Function
The readTime() function returns a TimeModel for the whole entry (based on its field layout) or for a block field passed directly.
Seconds are included by default, but can be disabled by passing false as a second parameter — this only affects the human time format.
{{ readTime(entry) }}
{{ readTime(entry.matrixField.all()) }}
{{ readTime(entry, false) }}
{{ readTime(entry.matrixField.all(), false) }}
Supported Field Types
When you pass an entry to readTime(), the plugin walks its field layout and counts the content of each field, recursing into nested-block fields:
| Field type | Notes |
|---|---|
| Plain text / rich text (e.g. Redactor, Plain Text) | Counted directly. |
| Matrix (native) | On Craft 5, Matrix blocks are entrified — each block is an Entry element. Their nested fields are walked recursively. |
Neo (spicyweb/craft-neo) | Each Neo block's fields are walked recursively. |
Vizy (verbb/vizy) | Rich-text content is counted and Vizy blocks' nested fields are walked recursively. |
CKEditor (craft/ckeditor) | The editor's rich-text content is counted, plus the content of any entries embedded inside the field. |
Neo, Vizy, and CKEditor are treated as optional, soft dependencies — the plugin loads and computes read time fine on sites that don't have them installed.
Super Table is no longer supported. It does not exist for Craft 5, so it has been removed from the Craft 5 code path. Super Table support remains in the Craft 4 (2.x) line.
TimeModel
Both the filter and the function return a TimeModel. Output it directly for a human-readable duration, or read one of its properties for a specific value:
{% set time = readTime(entry) %}
{{ time }} {# 2 minutes, 40 seconds #}
{{ time.human }} {# 2 minutes, 40 seconds #}
{{ time.seconds }} {# 160 #}
{{ time.minutes }} {# 2 #}
{{ time.hours }} {# 0 #}
| Property | Returns |
|---|---|
time / time.human | The human-readable duration. |
time.seconds | The total number of seconds. |
time.minutes | The total number of whole minutes. |
time.hours | The total number of whole hours. |
You can also format the duration as a DateInterval by passing a format string to interval():
{{ time.interval('%h hours, %i minutes, %s seconds') }} {# 0 hours, 2 minutes, 40 seconds #}
Overriding Plugin Settings
The average user read speed is set at 200 words per minute by default. This can be changed in the plugin settings, or overridden with a config file.
If you create a config file in your config folder called read-time.php, you can override the plugin's settings in the Control Panel. Since that config file is fully multi-environment aware, this is a handy way to have different settings across multiple environments. An example is included at config/read-time.php.
<?php
return [
'wordsPerMinute' => 200,
];
To install this plugin, copy the command above to your terminal.
This plugin doesn't have any reviews.