Справочники, инструменты, документация

PHP: Время прочтения статьи

В отличие от похожего модуля на jQuery, он выполняется на стороне сервера, а потому более стабилен. И если ваш хостинг имеет поддержку PHP – смело ставьте именно этот вариант.

Способ 1

Преимущества модуля:

  • Легкое использование.
  • Возможность задать скорость чтения слов в минуту.
  • Возможность включить изображения в общее время чтения.
  • Склонение «минут» в зависимости от числа.
  • Более стабильная работа модуля.

Приведенный ниже код используйте в нужном месте вашего сайта, где $content – это переменная, содержащая в себе ваш контент.

$content = "Ваш контент";
$words_per_minute = "250"; // Время чтения слов в минуту
$img_per_minute = "12"; // Время чтения изображения в секундах
$img_numb = preg_match_all("~<img~i", $content, $result_numb); // Получаем общее количество изображений в тексте
$text_read = round(count(preg_split("/s/", $content)) / $words_per_minute, 1); // Получаем общее время чтения текста
$img_read = floor((count($result_numb[0]) * $img_per_minute) / 60); // Получаем общее время чтения изображений
$all_read = $img_read + $text_read; // Получаем общее время чтения (текст + изображения)

function decl_of_numb($all_numb, $titles) {
    $cases = array(2, 0, 1, 1, 1, 2);
    return $all_numb." ".$titles[($all_numb%100>4 && $all_numb%100<20) ? 2 : $cases[min($all_numb%10, 5)]];
}

echo "<b>Время чтения статьи:</b> ".decl_of_numb(round($all_read), array(" минута", " минуты", " минут"));

Если вы хотите исключить время чтения для изображений, то переменную $img_per_minute выставите в 0.

Способ 2

// @param float|null $k - коэффициент трудности, а точнее скорости чтения материала. С его помощью вносится поправка на время чтения
// @example [[readingTime? &k = `1,5`]] здесь в параметре ошибка (запятая вместо точки), которая будет исправлена в сниппете

// Если значение &k не указано в вызове сниппета, то делаем равным 1, заодно исправляем, если вместо десятичной точки человек поставил запятую

$k = isset($k) ? str_replace(",", ".", $k) : 1;

// Время чтения одного знака. Исходя из эксперимента равно 0.042 сек.
$t = 0.042;

// Вычисляем кол-во знаков в статье, исключая теги
$symbolsCount = mb_strlen(strip_tags($modx->documentObject['content']));

// Вычисляем общее время чтения в секундах с учетом коэффициента трудности
$readingTime = $symbolsCount * $t * $k;

// Переводим в часы-минуты
$hours = floor($readingTime / 3600);
$min = ceil(($readingTime % 3600) / 60); // ceil вместо round для того, чтобы для очень короткой статьи не получилось 0 минут

$hours = ($hours >= 1) ? $hours." ч " : "";
$min = ($min >= 1) ? $min." мин " : "";

return $hours.$min;
На этой странице