Это действительно должно перестроить всю цепочку 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.