Для второй версии дизайна этого сайта я написал небольшую функцию, которая выводит примерное время чтения записи. Сейчас я хочу поделиться ей и рассказать как она работает.
Для чего это нужно?
Я использую это для того, чтобы пользователи могли понимать насколько длинная статья, которую они собираются читать.
Логика функции
Немного погуглив, я понял, что среднее кол-во прочитанных слов в минуту ~ 250. Тем самым мне лишь нужно получить текст записи, разбить его на отдельные слова и разделить кол-во слов на 250, округлить получившееся число (сделав его без дробных остатков (например: «2.31232231», что означает, что статья читается в течении 2 минут и 30 секунд). В моем случае — это просто «2 мин».
Функция и как она работает
Функция достаточна простая и в ней сможет разобраться даже начинающий разработчик, но я её все равно разложу все по полочкам. Для начала давайте посмотрим на нее:
/** * Получить примерное время чтение записи в WordPress * * @return string */ function bv2_get_post_reading_time() { $words_per_minutes = 250; $content_text = is_single() ? get_the_content() : get_post(get_the_ID())->post_content; $minutes = round(count(preg_split('/\s/', $content_text)) / $words_per_minutes); if( $minutes == 0 ) { return '<span title="'. __('Время прочтения', 'bologerv2').'">читать меньше минуты</span>'; } else { return '<span title="'. __('Время прочтения', 'bologerv2') .'">' . $minutes . ' мин чтения</span>'; } }
Сначала я дам объяснение и потом как поставить.
Если вам не интересно ее описание, а ТОЛЬКО УСТАНОВКА то можете перепрыгнуть на следующую часть, где пойдет речь о установке.
Для начала я объявляю переменную $words_per_minute
, которая будет хранить в себе кол-во прочитанных слов в минуту (250 в моем случае).
Далее, я создал $content_text
который содержит в себе текст записи, в зависимости от того is_single()
запись или нет. is_single()
возвращает булевое значение (открыта запись полностью или нет).
И если да, то я беру её содержимое, если нет, то мне нужно использовать функцию — get_post()
. Как аргумент в get_post()
, нужно написать текущий ID записи и чтобы его получить нужно использовать get_the_ID()
и далее я вытаскиваю содержимое записи с помощью ->post_content
. Это означает, что get_post(get_the_ID())
вернет информацию о записи в виде объекта. Тем самым, я могу получить любую информацию о ней (меня интересует только ее текст).
Важно понимать, что функцию нужно указывать внутри цикла для корректного отображения.
Сейчас поговорим об этой строчке, так как она самая важная:
$minutes = round(count(preg_split('/\s/', $content_text)) / $words_per_minutes);
Для начала я разбил весь $content_text
по пробелам с помощью регулярного выражения и функции preg_split()
— у нас получился массив. Далее я посчитал кол-во разбитых слов в массиве с помощью count()
и в самом конце я округлил число до целого (например с «1.312312» до «1») с помощью round()
.
Далее, с помощью if
условия проверяю следующее: если минуты равны нулю, то значит возвращать «читать меньше минуты», иначе — выводим кол-во минут.
Перейдем к установке.
Функция и ее установка
Установка проста до невозможности.
- Заходим в папку с текущей темой WordPress
- Находим и открывает
functions.php
- B добавляем функцию, которую я уже написал под заголовком «Функция и как она работает».
- Далее используем название функции (
bv2_get_post_reading_time()
) для вывода время чтения. В моем случае, я добавил ее в файлsingle.php
, который показывает полную запись и вcontent.php
. Но вы можете для начала добавить только вsingle.php
. - Внутри
single.php
илиcontent.php
пишите<?= bv2_get_post_reading_time() ?>
- Заходим на полную запись или в ленту записей и проверяем результат. У вас должно показать «меньше минуты назад» или например «2 мин». Все конечно же зависит от объема текста.
И все готово!
Демо
Пример работы этого скрипта можно посмотреть в этой записи в самом верху. У меня стоит в точности такая же функция.
Послесловие
Если у вас появились какие-либо вопросы, пишите их ниже к этой записи. Я буду рад вам помочь.
Источники
- is_single() — https://developer.wordpress.org/reference/functions/is_single/
- get_post() — https://developer.wordpress.org/reference/functions/get_post/
- get_the_ID() — https://developer.wordpress.org/reference/functions/get_the_ID/
- preg_split() — http://php.net/manual/ru/function.preg-split.php
- count() — http://php.net/manual/ru/function.count.php
- round() — http://php.net/manual/ru/function.round.php