Обрезать название поста WordPress до заданного количества символов или слов

Иногда, в связи с теми или иными особенностями дизайна WordPress-сайта бывает необходимо обрезать название поста до определенной заданной длины. Я покажу 2 варианта решения: когда нужно укоротить заголовок по количеству символов и по количеству слов.

Ограничение заголовка по количеству символов

Сначала в файл functions.php вашего шаблона вставьте следующую функцию:

function trim_title_chars($count, $after) {
	$title = get_the_title();
	if (mb_strlen($title) > $count) $title = mb_substr($title,0,$count);
	else $after = '';
	echo $title . $after;
}

Затем в шаблоне поменяйте код, который выводит название поста – <?php the_title(); ?> – на такой:

<?php trim_title_chars(30, '...'); ?>

Здесь цифра 30 – это количество символов, до которых нужно обрезать заголовок, а ... – то, что будет стоять после обрезанного текста. Можно вставить туда, например, какой-нибудь другой символ, либо вообще картинку.

Ограничение заголовка по количеству слов

В этом случае все по аналогии, только немного отличается функция.

Следующий код также нужно вставить в файл functions.php:

function trim_title_words($count, $after) {
	$title = get_the_title();
	$words = split(' ', $title);
	if (count($words) > $count) {
		array_splice($words, $count);
		$title = implode(' ', $words);
	}
	else $after = '';
	echo $title . $after;
}

После этого код заголовка поста – <?php the_title(); ?> – поменять на такой:

<?php trim_title_words(3, '...'); ?>

Здесь цифра 3 – это количество слов, до которых нужно обрезать заголовок, а ... – то, что будет стоять после обрезанного текста.

Комментарии (10)

  1. Дмитрий
    23 августа 2014 г. в 15:32

    Здравствуйте. Сделал ограничение заголовка по количеству символов. Код заработал, когда я убрал в mb_strlen mb_, т. е. оставил только strlen. Все заработало, но есть одна неприятность – даже когда заголовок равен или меньше указанного количества символов, все равно в конце появляется троеточие, за исключением совсем коротких заголовков. Не подскажите – почему так и можно ли это исправить?

    1. 23 августа 2014 г. в 16:17 / ответ на коммент Дмитрий

      Не знаю, в чем причина, у себя такого не наблюдаю – многоточие добавляется только к обрезанным заголовкам.

    2. Петр
      28 ноября 2017 г. в 16:46 / ответ на коммент Дмитрий

      даже если и меньше, будет ставится символ однозначно, в функции это прописано в конце.. хотя надо было бы включить это в условный оператор.. замечание автору

  2. 4 сентября 2014 г. в 19:41

    Респект за полезный материал!

  3. Олег
    31 мая 2015 г. в 18:21

    А как обрезать заголовок не с конца, а с начала

  4. 26 июня 2017 г. в 16:04

    Лучше всего оптимизировать заголовок, но так, чтобы смысл не терялся, чем его обрезать.

  5. Александр
    17 ноября 2018 г. в 01:40

    А как бы ту же фишку применить к Предыдущим и Следующим записям, через , например?

  6. Михаил
    27 ноября 2018 г. в 09:29

    Добрый день. Спасибо за материал. А как этот отрывок заголовка сделать ссылкой и с тегом H2

    Если заголовок выводится такой конструкцией

    <?php
    		if ( is_singular() ) :
    			the_title( '<h1 class="entry-title">', '</h1>' );
    		else :
    			the_title( '<h2 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h2>' );
    		endif;
    		if ( 'post' === get_post_type() ) :
    ?>

    При смене the_title , заголовок обрезается но выводится простым текстом.

  7. Илья
    10 мая 2022 г. в 09:35

    А можно как-то обрезать с начала поста заголовок? У меня все посты начинаются с одного названия и чтобы не спамить заголовком в странице катагорий, функция былабы круто встроена.

    1. 15 мая 2022 г. в 09:26 / ответ на коммент Илья

      Вот так:

      add_filter('the_title', 'change_title', 10);
      function change_title($title) {
          $title = preg_replace('#^SOME_TEXT(.*)#', '$1', $title);
          return $title;
      }

      Где SOME_TEXT – то, что нужно вырезать.

Ваш комментарий

Жирный текст

Ссылка

Цитата

Внутристрочный код

CSS-код

HTML-код

JavaScript-код

PHP-код