Limitare lungime titlu - similar cu excerpt length în afara single.php

2 oct. 2011, 15:42:58
Vizualizări: 19.5K
Voturi: 1

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;
    }
0
Toate răspunsurile la întrebare 3
12

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.

2 oct. 2011 19:25:41
Comentarii

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?

japanworm japanworm
3 oct. 2011 04:30:44

Vezi ediția mea pentru o altă opțiune.

EAMann EAMann
3 oct. 2011 17:09:35

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.

japanworm japanworm
12 oct. 2011 16:32:41

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

EAMann EAMann
12 oct. 2011 16:51:00

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"

japanworm japanworm
12 oct. 2011 16:57:12

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...

EAMann EAMann
12 oct. 2011 18:52:24

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!

japanworm japanworm
13 oct. 2011 15:29:03

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ă.

EAMann EAMann
13 oct. 2011 17:37:40

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.

japanworm japanworm
13 oct. 2011 17:56:29

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.

EAMann EAMann
13 oct. 2011 18:54:27

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ă.

japanworm japanworm
13 oct. 2011 19:00:19

Te rog să adaugi punctul și virgulă care lipsește - asta previne funcționarea acestui răspuns. Probabil că ar primi mult mai multe voturi pozitive dacă codul ar funcționa, pentru că este un răspuns bun.

pjk_ok pjk_ok
11 oct. 2019 22:07:19
Arată celelalte 7 comentarii
0

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() ); ?>
19 feb. 2015 07:46:39
0

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;
}
19 iul. 2017 14:04:09