3 способа создания анонса записи в WP. Как ограничить длину анонсов.

Если вы никак не можете разобраться, как сделать так, чтобы на главной и в рубриках выводилось только начало статьи со ссылкой «Читать далее» (или и вовсе какой-нибудь уникальный текст), то этот пост специально для вас.

Ни в одном из нижеперечисленных способов плагинов нам не потребуется.

Тег «Далее»

Сначала разберём самый простой и самый часто использующийся способ. Работает практически для любых тем WordPress.

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

  1. Перейти на страницу редактирования поста.
  2. Поставить курсор в то место в тексте, в котором вы хотите его обрезать и нажать кнопку в редакторе Вставить тег «Далее» кнопка вставки тега далее или кнопку more кнопка Далее для HTML-редактора — в зависимости от того, каким редактором вы пользуетесь (Визуальным или HTML).
  3. Обновить пост.

Записал видео для полной наглядности:

Применение: функция the_content()

Этот способ полностью реализует себя, если для вывода анонса постов используются функция the_content() или похожая функция get_the_content(), которая возвращает контент, а не выводит. В случае с последней фильтры также не будут применяться — текст не отформатируется, шорткоды не задействуются, однако тег «Далее» будет работать как положено.

При использовании the_content() весь HTML поста сохранится, картинки также будут в анонсе.

Вы вставили тег «Далее», но у вас всё равно выводится целиком весь пост? Смотрите решение проблемы здесь.

Цитата

Второй способ создания анонсов постов — использование поля «Цитата». Этот способ сработает только в том случае, если для вывода анонсов у вас используется the_excerpt() (её аналог get_the_excerpt() возвращает цитату, а не выводит).

поле Цитата на странице редактирования постов
Поле «Цитата».

Если вы не можете найти метабокс цитаты на странице редактирования записи, в правом верхнем углу откройте «Настройки экрана» и включите его там.

Пара слов о том как работают функция the_excerpt():

  1. В первую очередь в качестве анонса поста берется содержимое поля «Цитата».
  2. Если цитата пуста, тогда анонсом станет неотформатированный текст поста, обрезанный до 55 слов.
  3. Если в этих 55 словах присутствует тег «Далее», то анонс станет ещё короче.

Постарался показать это на видео:

Собственная функция, обрезающая содержимое поста до определенного количества символов

Код функции представлен ниже, добавляем его в functions.php текущей темы WP.

function the_truncated_post($symbol_amount) {
	$filtered = strip_tags( preg_replace('@<style[^>]*?>.*?</style>@si', '', preg_replace('@<script[^>]*?>.*?</script>@si', '', apply_filters('the_content', get_the_content()))) );
	echo substr($filtered, 0, strrpos(substr($filtered, 0, $symbol_amount), ' ')) . '...';
}

Затем, в том месте, в котором нужно вывести анонс, вставляем:

the_truncated_post( 100 );

Если при использовании этого метода у вас появятся кракозябры, тогда рекомендую внутри функции the_truncated_post(), на 3й строке, произвести следующие замены: substr() => mb_substr(), strrpos() => mb_strrpos(). Если в итоге функция вообще перестанет работать, то это уже вопросы к вашему хостеру.

Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

По теме

Комментарии 14

  • Илья2 января 2015 в 13:01 #

    Михаил, Вы пишете, что шорткоды не будут работать, но не пишете, как сделать чтобы они всё же работали. Надо сделать add_filter('the_content', 'do_shortcode');

    • Миша3 января 2015 в 08:01 #

      Так, мы добавляем фильтр (который по идее и так уже добавлен по умолчанию), но разве описанная выше функция get_the_content() содержит его? :)

      • Илья3 января 2015 в 14:01 #

        Хотел быстрее отписаться, а получилось как всегда :/
        Прошу прощения, конечно же Вы правы, надо do_shortcode(get_the_content())

  • Андрей28 января 2015 в 20:01 #

    Подскажите, пожалуйста, уникальная цитата the_excerpt() доступна только для постов? Можно ли реализовать подобный функционал для страниц ?
    По умолчанию в админке в настройках экрана для страниц отсутствует дополнительное поле Цитата. И вроде это не глюк моего сайта. Проверял на дефолтной теме при всех отключенных плагинах.

  • Елена23 февраля 2015 в 18:02 #

    Добрый день, спасибо за статью. У меня вопрос, а как настроить стиль вывода цитаты на странице? То есть на главной странице я хочу выводить несколько цитат, например, 3 и хотела бы, чтобы они размещались горизонтально 3 одинаковых блока. Заранее спасибо. Елена

  • firdavs27 сентября 2016 в 15:09 #

    а как укротит текст на главной странице по количеству и выводить заголовки страниц
    у меня стоит так: йй

    Но я бы хотел сделать так : йвй

    вот тут фанкшон код:

    * excerpt more */
    function new_excerpt_more($more) {
    	global $post;
    	//return ' <a class="tmore" href="'. get_permalink($post->ID) . '">Читать дальше...</a>';
    	return '';
    }
     
    add_filter('excerpt_more', 'new_excerpt_more');
    function new_excerpt_length($length) {
      return 30;
    }
    • Миша28 сентября 2016 в 10:09 #

      Рекомендую там, где выводите содержимое, попробовать использовать функцию:

      function truncate_post( $amount ) {
      	global $post;
      	$truncate = get_the_content();
      	$truncate = apply_filters('the_content', $truncate);
      	$truncate = preg_replace('@<script[^>]*?>.*?</script>@si', '', $truncate);
      	$truncate = preg_replace('@<style[^>]*?>.*?</style>@si', '', $truncate);
      	$truncate = strip_tags($truncate);
      	$truncate = mb_substr( $truncate, 0, mb_strrpos( mb_substr( $truncate, 0, $amount), ' ') );
      	echo $truncate . ' <a class="tmore" href="'. get_permalink( $post->ID ) . '">Читать дальше...</a>';
      }

      То есть сначала вставляете в functions.php, а потом в том месте в цикле, где нужно вывести, используете:

      truncate_post( 30 );
      • firdavs28 сентября 2016 в 11:09 #

        как то не получается ( может вы проверите ?

        • Миша28 сентября 2016 в 16:09 #

          А что именно не получается? Ошибка какая-то? Или просто ничего не происходит?

          • firdavs29 сентября 2016 в 08:09 #

            Да ничего не происходит однажды я таким способом сделал

            * excerpt more */
            function new_excerpt_more($more) {
            	global $post;
            	//return ' <a class="tmore" href="'. get_permalink($post->ID) . '">Читать дальше...</a>';
            	return '';
            }
             
            add_filter('excerpt_more', 'new_excerpt_more');
            function new_excerpt_length($length) {
              return 30;
            }

            как то получилось, после как сайт попал в ддос Аттаку я все с начало сделал потому что у меня бекапа не было ( или может быть я чего то забыл дописать

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Миша: Да, точно)

  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.