Ограничение длины заголовка - аналогично excerpt, но вне single.php
Я ищу фрагмент кода, который позволит мне ограничить длину заголовка аналогично тому, как это можно сделать с the_excerpt, а затем просто отображать "(...)", если заголовок слишком длинный.
Я хочу использовать это в циклах вне single.php, например, в сайдбаре, где слишком длинный заголовок может нарушить макет.
Всё, что я нашёл, это такой фрагмент кода, но он явно делает не то, что мне нужно.
function maxWord($title)
{
global $post;
$title = $post->post_title;
if (str_word_count($title) >= 10 ) // установите здесь максимальное количество слов
wp_die( __('Ошибка: заголовок записи превышает максимальное количество слов.') );
}
add_action('publish_post', 'maxWord');
Возможно ли это вообще?
Я ищу что-то похожее на это, но не для excerpt, а для заголовка:
function excerpt($limit) {
$excerpt = explode(' ', get_the_excerpt(), $limit);
if (count($excerpt)>=$limit) {
array_pop($excerpt);
$excerpt = implode(" ",$excerpt).' (...)';
} else {
$excerpt = implode(" ",$excerpt);
}
$excerpt = preg_replace('`\[[^\]]*\]`','',$excerpt);
return $excerpt;
}
function content($limit) {
$content = explode(' ', get_the_content(), $limit);
if (count($content)>=$limit) {
array_pop($content);
$content = implode(" ",$content).' (...)';
} else {
$content = implode(" ",$content);
}
$content = preg_replace('/\[.+\]/','', $content);
$content = apply_filters('the_content', $content);
$content = str_replace(']]>', ']]>', $content);
return $content;
}

Это полностью зависит от того, как вы получаете заголовок. Если вы используете глобальный объект (например, $post->post_title
), то он не проходит через фильтры, и вам придется использовать дополнительную обработку для сокращения заголовка.
Однако, если вы находитесь внутри цикла записей, используйте либо the_title()
для вывода заголовка текущей записи, либо get_the_title()
для его программного получения.
Если вы используете одну из этих функций, WordPress автоматически пропустит заголовок записи через фильтр перед его возвращением.
Затем вы можете добавить следующий код в начало вашего файла sidebar.php
:
function japanworm_shorten_title( $title ) {
$newTitle = substr( $title, 0, 20 ); // Берем только первые 20 символов
return $newTitle . " …"; // Добавляем многоточие (...)
}
add_filter( 'the_title', 'japanworm_shorten_title', 10, 1 );
Теперь каждый раз, когда вы обращаетесь к the_title()
или get_the_title()
в сайдбаре, они будут возвращать автоматически сокращенную версию вместо полной.
Не забудьте удалить этот фильтр в конце вашего файла sidebar.php
, иначе он будет применяться и в других частях вашей темы:
remove_filter( 'the_title', 'japanworm_shorten_title' );
Обновление от 03.10.2011
Если вам нужна функция, которую можно использовать где угодно, я рекомендую создать собственные версии get_the_title()
и the_title()
и использовать их в вашем коде. Например:
function japanworm_get_the_title( $length = null, $id = 0 ) {
$post = &get_post($id);
$title = isset($post->post_title) ? $post->post_title : '';
$id = isset($post->ID) ? $post->ID : (int) $id;
if ( !is_admin() ) {
if ( !empty($post->post_password) ) {
$protected_title_format = apply_filters('protected_title_format', __('Защищено: %s'));
$title = sprintf($protected_title_format, $title);
} else if ( isset($post->post_status) && 'private' == $post->post_status ) {
$private_title_format = apply_filters('private_title_format', __('Приватно: %s'));
$title = sprintf($private_title_format, $title);
}
}
// Сокращаем заголовок
if ( null != $length ) {
$length = (int) $length;
$title = substr( $title, 0, $length ); // Берем только первые N символов
$title .= " …";
}
return apply_filters( 'the_title', $title, $id );
}
function japanworm_the_title($before = '', $after = '', $echo = true, $length = null) {
$title = japanworm_get_the_title($length);
if ( strlen($title) == 0 )
return;
$title = $before . $title . $after;
if ( $echo )
echo $title;
else
return $title;
}
Эти функции скопированы из оригинальных the_title()
и get_the_title()
, поэтому они должны работать в цикле так же. Хотя я это не тестировал.

Привет. Большое спасибо. На самом деле я ищу что-то, что можно использовать более "свободно" в любом месте (см. мой обновленный вопрос). Я не хочу использовать это только в сайдбаре, это был лишь пример. У меня есть похожий код в function.php для пользовательского отрывка, где я могу регулировать длину, указывая число в "(30)". Возможно ли такое же для заголовка?

Привет. Извините за поздний ответ. Я отсутствовал несколько дней. Попробовал код, добавил в function.php, но получил синтаксическую ошибку, так что, к сожалению, это не сработало.

Вот откуда взялся комментарий "Хотя я это не тестировал". Какая была синтаксическая ошибка? Возможно, у меня была опечатка.

Похоже, проблема в этой строке $title .= " …"
}
, так как сообщение об ошибке гласит: "Parse error: syntax error, unexpected '}' in /hermes/bosweb25a/b155/ipg.zoomingjapancom/wp-content/themes/alltuts/functions.php on line 51"

Нужно добавить точку с запятой в конце этой строки (чтобы получилось $title .= " …";
). Редактирую свой ответ...

Хорошо, отлично, теперь я не получаю сообщение об ошибке, но функция, кажется, не работает. Возможно, я неправильно вызываю заголовок. Я пробовал: <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title('12'); ?></a>
Я пробовал с кавычками и без них... В обоих случаях просто отображается "12" перед заголовком. Есть идеи? И большое спасибо!

Внимательно посмотрите на код. Если вы всё ещё вызываете the_title()
, значит, вы не используете функции, которые я написал выше. Они предназначены для замены стандартных функций WordPress и включают вашу пользовательскую функциональность.

Вот так, верно? <?php japanworm_the_title(2); ?>
Проблема остаётся. А если я попробую так <?php japanworm_get_the_title(12); ?>
заголовок вообще не отображается.

Посмотрите на сигнатуру функции: function japanworm_get_the_title( $length = null, $id = 0 )
... значит, вам нужно указать и длину, и ID. Попробуйте japanworm_get_the_title(20, 12)
, чтобы получить заголовок длиной 20 символов для поста с ID 12.

Понятно, значит, я могу выбрать сокращение заголовка только для ОДНОГО поста в цикле, верно? Или возможно использовать несколько ID, соединив их через &? Но, думаю, лучше было бы иметь возможность установить одну глобальную максимальную длину заголовка для всех постов в одном цикле.

Вы можете использовать функцию wp_trim_excerpt().
Если вам нужно указать ограничение по количеству символов, вы можете использовать фильтр excerpt_length.
<?php echo wp_trim_excerpt( get_the_title() ); ?>

Решение с использованием WordPress API
Если вам нужно обрезать текст только для английского или других языков с однобайтовыми символами, использование substring
будет правильным выбором. Однако, если требуется обрезать текст на таких языках, как китайский, японский или других, использование substring может дать плохой результат, поскольку они используют Unicode для представления символов.
Использование wp_trim_words() — это простой и прямой способ решить вашу проблему.
wp_trim_words( $text, $num_words = 55, $more = null );
P.S. Вдохновлено Leo Caseiro.
Решение только с помощью CSS
Если вам нужно динамически обрезать текст, особенно в адаптивном дизайне, следует использовать CSS следующим образом:
.card-title {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
