Limitare lungime titlu - similar cu excerpt length în afara single.php
Am căutat un fragment de cod care să îmi permită să limitez lungimea titlurilor similar cu funcționalitatea the_excerpt, afișând "(...)" dacă titlul este prea lung.
Vreau să folosesc această funcționalitate în loop-uri în afara single.php, de exemplu în sidebar unde un titlu extrem de lung ar afecta layout-ul.
Tot ce am găsit a fost acest fragment de cod, dar evident că nu face ceea ce doresc:
function maxWord($title)
{
global $post;
$title = $post->post_title;
if (str_word_count($title) >= 10 ) // setează numărul maxim de cuvinte
wp_die( __('Eroare: titlul articolului depășește numărul maxim de cuvinte permise.') );
}
add_action('publish_post', 'maxWord');
Este posibil acest lucru?
Caut ceva similar cu acesta, dar nu pentru excerpt ci pentru titlu:
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;
}

Acest lucru depinde 100% de modul în care obții titlul. Dacă folosești un obiect global (adică $post->post_title
), atunci nu-l treci prin niciun filtru și va trebui să folosești o post-procesare avansată pentru a scurta titlul.
Totuși, dacă ești în interiorul unei bucle de postări, folosește fie the_title()
pentru a afișa titlul postării curente, fie get_the_title()
pentru a-l returna programatic.
Dacă folosești una dintre aceste două funcții, WordPress va trece automat titlul postării printr-un filtru înainte de a ți-l returna.
Apoi poți adăuga următoarele la începutul fișierului tău sidebar.php
:
function japanworm_shorten_title( $title ) {
$newTitle = substr( $title, 0, 20 ); // Preia doar primele 20 de caractere
return $newTitle . " …"; // Adaugă punctele de suspensie la text (...)
}
add_filter( 'the_title', 'japanworm_shorten_title', 10, 1 );
Acum, de fiecare dată când folosești the_title()
sau get_the_title()
în bara laterală, acestea vor returna versiunea scurtată automat în loc de versiunea completă.
Doar nu uita să elimini acest filtru la sfârșitul fișierului tău sidebar.php
, altfel se va aplica și în alte părți ale temei:
remove_filter( 'the_title', 'japanworm_shorten_title' );
Actualizare 10/3/2011
Dacă dorești o funcție pe care o poți folosi oriunde, recomand să creezi versiunile tale ale funcțiilor get_the_title()
și the_title()
și să le folosești în codul tău. De exemplu:
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', __('Protejat: %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', __('Privat: %s'));
$title = sprintf($private_title_format, $title);
}
}
// Scurtează titlul
if ( null != $length ) {
$length = (int) $length;
$title = substr( $title, 0, $length ); // Preia doar primele 20 de caractere
$title .= " …";
}
return apply_filters( 'the_title', $title, $id );
}
function japanworm_the_title($before = '', $after = '', $echo = true, $length = null) {
$title = get_the_title($length);
if ( strlen($title) == 0 )
return;
$title = $before . $title . $after;
if ( $echo )
echo $title;
else
return $title;
}
Acestea sunt copiate din funcțiile originale the_title()
și get_the_title()
, așa că ar trebui să funcționeze în buclă în același mod. Totuși, nu am testat acest lucru.

Salut. Mulțumesc foarte mult. De fapt, caut ceva pe care să-l pot folosi mai "liber" oriunde doresc (vezi întrebarea mea actualizată). Nu vreau să-l folosesc doar în bara laterală, acela a fost doar un exemplu. Am un cod similar în function.php pentru un fragment personalizat unde pot ajusta lungimea prin introducerea unui număr în "(30)". Este posibil și pentru titlu?

Salut. Îmi pare rău pentru răspunsul întârziat. Am fost plecat câteva zile. Am încercat codul și l-am pus în function.php, dar am primit o eroare de sintaxă, așa că din păcate nu pare să funcționeze.

De aici vine comentariul "Nu am testat asta totuși". Care a fost eroarea de sintaxă? Poate am avut o greșeală de tastare.

Se pare că este vorba despre această linie $title .= " …"
}
deoarece mesajul de eroare spune: "Parse error: syntax error, unexpected '}' in /hermes/bosweb25a/b155/ipg.zoomingjapancom/wp-content/themes/alltuts/functions.php on line 51"

Ar trebui să fie un punct și virgulă în plus la sfârșitul acelei linii (făcând-o să fie $title .= " …";
). Editez răspunsul meu...

Bine, grozav, acum nu mai primesc mesaj de eroare, dar funcția nu pare să funcționeze. Poate apelez titlul greșit. Am încercat: <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title('12'); ?></a>
Am încercat cu și fără ghilimele... de fiecare dată afișează doar un "12" în fața titlului. Aveți idei? Și vă mulțumesc mult!

Uită-te din nou la cod. Dacă încă apelezi the_title()
înseamnă că nu folosești funcțiile pe care le-am scris mai sus. Acestea erau menite să înlocuiască funcțiile standard din WordPress pentru a include funcționalitatea personalizată.

Așa, corect? <?php japanworm_the_title(2); ?>
Aceeași problemă. Și dacă încerc asta <?php japanworm_get_the_title(12); ?>
nu se afișează niciun titlu.

Uită-te la semnătura funcției: function japanworm_get_the_title( $length = null, $id = 0 )
... deci trebuie să specifici atât lungimea cât și ID-ul. Încearcă japanworm_get_the_title(20, 12)
pentru a returna un titlu de 20 de caractere pentru postul cu ID-ul 12.

Am înțeles, deci asta înseamnă că pot alege să scurtez titlul doar pentru UN singur post pe buclă, corect? Sau este posibil să folosesc mai multe ID-uri conectate cu &? Dar presupun că ar fi mai bine să pot seta o lungime maximă globală pentru toate postările dintr-o buclă.

Puteți utiliza funcția wp_trim_excerpt().
Dacă aveți nevoie să specificați o limită de caractere, ar trebui să puteți folosi filtrul excerpt_length.
<?php echo wp_trim_excerpt( get_the_title() ); ?>

Soluție API Wordpress
Dacă doriți să trunchiați doar limbi precum engleza sau alte limbi bazate pe caractere, folosirea substring
ar fi cea mai bună metodă. Totuși, dacă doriți să trunchiați limbi precum Chineza, Japoneza sau altele, folosirea substring ar putea fi problematică, deoarece acestea folosesc Unicode pentru reprezentare.
Folosirea wp_trim_words() ar fi o soluție simplă și directă pentru problema dumneavoastră.
wp_trim_words( $text, $num_words = 55, $more = null );
p.s. inspirat de Leo Caseiro.
Soluție bazată doar pe CSS
Dacă doriți să aflați cum să trunchiați cuvintele dinamic, mai ales în designul responsive, ar trebui să folosiți CSS astfel:
.card-title {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
