Ограничение длины заголовка - аналогично excerpt, но вне single.php

2 окт. 2011 г., 15:42:58
Просмотры: 19.5K
Голосов: 1

Я ищу фрагмент кода, который позволит мне ограничить длину заголовка аналогично тому, как это можно сделать с 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;
    }
0
Все ответы на вопрос 3
12

Это полностью зависит от того, как вы получаете заголовок. Если вы используете глобальный объект (например, $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(), поэтому они должны работать в цикле так же. Хотя я это не тестировал.

2 окт. 2011 г. 19:25:41
Комментарии

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

japanworm japanworm
3 окт. 2011 г. 04:30:44

Смотрите мою правку с другим вариантом.

EAMann EAMann
3 окт. 2011 г. 17:09:35

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

japanworm japanworm
12 окт. 2011 г. 16:32:41

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

EAMann EAMann
12 окт. 2011 г. 16:51:00

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

japanworm japanworm
12 окт. 2011 г. 16:57:12

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

EAMann EAMann
12 окт. 2011 г. 18:52:24

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

japanworm japanworm
13 окт. 2011 г. 15:29:03

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

EAMann EAMann
13 окт. 2011 г. 17:37:40

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

japanworm japanworm
13 окт. 2011 г. 17:56:29

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

EAMann EAMann
13 окт. 2011 г. 18:54:27

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

japanworm japanworm
13 окт. 2011 г. 19:00:19

Пожалуйста, добавьте пропущенную точку с запятой — без неё этот ответ не работает. Вероятно, он получил бы больше голосов, если бы код работал, потому что это хороший ответ.

pjk_ok pjk_ok
11 окт. 2019 г. 22:07:19
Показать остальные 7 комментариев
0

Вы можете использовать функцию wp_trim_excerpt().

Если вам нужно указать ограничение по количеству символов, вы можете использовать фильтр excerpt_length.

<?php echo wp_trim_excerpt( get_the_title() ); ?>
19 февр. 2015 г. 07:46:39
0

Решение с использованием 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;
}
19 июл. 2017 г. 14:04:09