Почему не срабатывает функция для ограничения кол-во символов в названии постов?
Есть цикл для вывода списка постов
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 то длина строки должна подсчитываться корректно для кириллицы
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Функция ограничения количества символов в заголовке часто “не срабатывает”, потому что она написана, но не используется в нужном месте. В 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>';
Если нужно ограничить не символы, а слова:
$short_title = wp_trim_words(get_the_title(), 10, '...');
Для русского текста лучше использовать
mb_*, потому что обычные строковые функции могут некорректно считать кириллицу.Если вы пытаетесь фильтровать
the_title, проверьте, не применяется ли фильтр в админке, меню или виджетах. Такой фильтр может неожиданно обрезать заголовки везде. Безопаснее ограничивать длину только в конкретном шаблоне карточки.Также проверьте условие
is_singular(). Внутри цикла архива оно будет false, а на странице одиночной записи true. Если код стоит не в той веткеif/else, он просто не выполняется там, где вы ждёте.Итог: замените
the_title()наget_the_title()+ обрезку + безопасный вывод. И применяйте это только в нужном шаблоне, а не глобальным фильтром по всему сайту.