ограничить количество символов от <? php the_tags?> - PullRequest
0 голосов
/ 06 июля 2010

У меня есть макет, который должен показывать теги по горизонтали. Я хочу иметь возможность ограничить количество выводимых символов.

Пример - если я установлю ограничение на 14, должно произойти следующее.

Оригинал: Cats, Dogs, Rain
Новый вывод: Cats, Dogs, Ra..

Обратите внимание, что <?php the_tags ?> возвращает массив. Это все, что я хочу, ограничено 14 символами.

UPDATE Чтобы устранить путаницу, я обновил пост скриншотом, показывающим, почему я хочу установить этот лимит. Это должно прояснить, какое решение я ищу alt text http://img686.imageshack.us/img686/2253/linit.png

Ответы [ 5 ]

4 голосов
/ 06 июля 2010

substr

Проверьте это http://www.php.net/manual/en/function.substr.php

Что-то вроде этого должно работать для вас:

$tags = implode(', ', $the_tags)
echo substr($tags, 0, 14) . (strlen($tags) > 14) ? '..' : '';

substr будет обрабатывать только показ 14 символовзатем последняя часть добавляет .., когда это необходимо.

1 голос
/ 06 июля 2010

Как насчет использования функции substr:

$string_new = substr($string, 0, 14);
echo $string_new;

Возможно, вы захотите также использовать функцию strip_tags, если между вашим текстом есть html-теги.

0 голосов
/ 22 декабря 2010

Это действительно должно перестроить всю цепочку the_tags, get_the_tag_list и get_the_term_list, но вот решение в одной функции.

Оно основано на функции get_the_term_list WordPress в wp-includes/category-template.php.

Если не указано значение trim_length, оно переключается на the_tags.Объекты HTML были декодированы таким образом, чтобы количество строк было точным, а затем перекодированы в выходную строку.

Я не совсем понимал необходимость $before, $sep и $after в последнемthe_tags фильтр, так что я отложил до того, что WordPress уже делал там.

function the_tags_trimmed( $before = null, $sep = ', ', $after = '', $trim_length = -1, $trim_characters = '...' ) {
    if ( $trim_length < 1 )
        return the_tags( $before, $sep, $after );

    if ( null === $before )
        $before = __('Tags: ');

    $tags = get_the_terms( 0, 'post_tag' );

    if ( empty( $tags ) )
        return false;

    $html_length = 0;
    $x = 0;

    foreach ( $tags as $tag ) {
        $link = get_term_link( $tag, 'post_tag' );
        if ( is_wp_error( $link ) )
            return $link;
        $tag->name = html_entity_decode( $tag->name );
        if ( strlen($tag->name) + $html_length > $trim_length )
            $tag->name = substr( $tag->name, 0, $trim_length - $html_length) . $trim_characters;
        $tag_links[] = '<a href="' . $link . '" rel="tag">' . htmlentities($tag->name) . '</a>';
        $html_length += strlen($tag->name);
        if ( $x++ < count( $tags ) - 1 )
            $html_length += strlen( $sep );

        if ( $html_length >= $trim_length )
            break;
    }

    $tag_links = apply_filters( "term_links-post_tag", $tag_links );
    $tag_list = $before . join( $sep, $tag_links ) . $after;
    echo apply_filters( 'the_tags', $tag_list, $before, $sep, $after );
}

Это было слегка проверено и должно выполнить то, о чем мечтал @Thomas.

0 голосов
/ 08 июля 2010

Проблема со всеми этими ответами состоит в том, что не было ясно, что the_tags() возвращает массив HTML-ссылок !

Запуск substr(implode(', ', get_the_tags(), X) может возвращать что-то вроде;

<a href="/tag1/">Tag 1</a>, <a href="/tag2/">Tag 2</a>, <a href="/tag3

Вам было бы гораздо лучше выбрать CSS / front-end решение (как @Gumbo упоминалось в исходных комментариях).

Таким образом, вы по-прежнему будете отмечать сок ссылок и доступность, не заканчивая чем-то вроде;

<a href="/keyword-tag/">Keyword Tag</a>, <a href="/awesome-keyword/">Awes...</a>
0 голосов
/ 06 июля 2010

Не очень красиво резать слова посередине.
Эта функция обрезает вашу фразу после конца слова, но не больше указанной длины.

function short($txt,$length)
{
    $txt = trim(strip_tags($txt));
    if(strlen($txt) > $length)
    {
        $txt = substr($txt,0,$length);
        $pos = strrpos($txt, " ");
        $txt = substr($txt,0,$pos);
        $txt .= "...";
    }
    return $txt;
}

Но все ответы и раньше верны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...