Почему не срабатывает функция для ограничения кол-во символов в названии постов?

Ссылка скопирована
1 ответ

Есть цикл для вывода списка постов

theme_post_thumbnail(); 			if ( is_singular() ) : // проверяется, просматривается ли страница записи, если нет, срабатывает else  						the_title( '<h1 class="entry-title">', '</h1>' ); 					       else :      //the_title('<h2 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h2>' );     //закрываем стандартный вывод названия статей 					custom_the_title($limit = 10); //вызываем свою функцию и огр. символы в названии до 10  					endif;

theme_post_thumbnail(); if ( is_singular() ) : // проверяется, просматривается ли страница записи, если нет, срабатывает else the_title( '<h1 class="entry-title">', '</h1>' ); else : //the_title('<h2 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h2>' ); //закрываем стандартный вывод названия статей custom_the_title($limit = 10); //вызываем свою функцию и огр. символы в названии до 10 endif;

Вот сама функция, лежащая в functions.php

function custom_the_title($limit) {     $title = get_the_title(); // Получаем название записи     $link_post_tag = the_title('<h2 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h2>' );  // формируем вывод title      if (strlen($title) > $limit) { // Проверка кол-ва символов в названии           	$title = substr($title, 0, $limit) . '...'; // Обрезаем название и добавляем многоточие          }      echo $link_post_tag  ; // Выводим ограниченное название  }

function custom_the_title($limit) { $title = get_the_title(); // Получаем название записи $link_post_tag = the_title('<h2 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h2>' ); // формируем вывод title if (strlen($title) > $limit) { // Проверка кол-ва символов в названии $title = substr($title, 0, $limit) . '...'; // Обрезаем название и добавляем многоточие } echo $link_post_tag ; // Выводим ограниченное название }

В результате функция не срабатывает и все символы отображаются без ограничений

Дополнительно:

Решил этот вопрос по-другому, дело в том, что $link_post_tag действительно не меняется, даже после проверки длины символов, а меняется только $title, поэтому его и будем выводить, добавим еще html теги, так как изначально заголовок должен быть в виде ссылки на страницу поста.

В функцию добавляем параметр $before и $after, которая будет хранить html теги и сразу объявляем их внутри

function custom_the_title($limit,$before,$after) {       $title = get_the_title(); // Получаем название записи       $before = '<h2 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">';      $after = '</a></h2>';          	if (strlen($title) > $limit) { // Проверка кол-ва символов в названии           			$title =  substr($title, 0, $limit)  . '...' ; // Обрезаем название и добавляем многоточие          	}  	      echo $before . $title . $after ; // Выводятится обрезаное    }

function custom_the_title($limit,$before,$after) { $title = get_the_title(); // Получаем название записи $before = '<h2 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">'; $after = '</a></h2>'; if (strlen($title) > $limit) { // Проверка кол-ва символов в названии $title = substr($title, 0, $limit) . '...' ; // Обрезаем название и добавляем многоточие } echo $before . $title . $after ; // Выводятится обрезаное }

А уже в шаблоне, вызываем функцию так:

if ( is_singular() ) : // проверяется, просматривается ли страница записи, если нет срабатывает else  						the_title( '<h1 class="entry-title">', '</h1>' ); 					else :   						//the_title( '<h2 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h2>' );  							custom_the_title(30,'',''); //ставим ограничение и 2 пустых параметра  					endif;

if ( is_singular() ) : // проверяется, просматривается ли страница записи, если нет срабатывает else the_title( '<h1 class="entry-title">', '</h1>' ); else : //the_title( '<h2 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h2>' ); custom_the_title(30,'',''); //ставим ограничение и 2 пустых параметра endif;

В результате названия всех постов ограничивается. Единственный момент, если ставить ограничение в 30 символов, то показывается 15 символов, вероятно из-за кириллицы

  • По идее, если использовать mb_strlen то длина строки должна подсчитываться корректно для кириллицы
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ольга Сеть Ответ

Функция ограничения количества символов в заголовке часто “не срабатывает”, потому что она написана, но не используется в нужном месте. В WordPress the_title() сразу выводит заголовок, а не возвращает его. Если вы хотите обрезать текст, нужно получить заголовок через get_the_title(), обработать и потом вывести.

Пример:

$title = get_the_title();
$short_title = mb_strimwidth($title, 0, 80, '...', 'UTF-8');
 
echo '<h2 class="entry-title">';
echo '<a href="' . esc_url(get_permalink()) . '">' . esc_html($short_title) . '</a>';
echo '</h2>';

$title = get_the_title(); $short_title = mb_strimwidth($title, 0, 80, '...', 'UTF-8'); echo '<h2 class="entry-title">'; echo '<a href="' . esc_url(get_permalink()) . '">' . esc_html($short_title) . '</a>'; echo '</h2>';

Если нужно ограничить не символы, а слова:

$short_title = wp_trim_words(get_the_title(), 10, '...');

$short_title = wp_trim_words(get_the_title(), 10, '...');

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

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

Также проверьте условие is_singular(). Внутри цикла архива оно будет false, а на странице одиночной записи true. Если код стоит не в той ветке if/else, он просто не выполняется там, где вы ждёте.

Итог: замените the_title() на get_the_title() + обрезку + безопасный вывод. И применяйте это только в нужном шаблоне, а не глобальным фильтром по всему сайту.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно