Imposta la lunghezza massima del titolo - simile alla lunghezza dell'estratto al di fuori di single.php
Sto cercando un frammento di codice che mi permetta di limitare la lunghezza del titolo, simile a quello che si può fare con the_excerpt, e poi visualizzare "(...)" se il titolo è troppo lungo. Vorrei usarlo nei loop al di fuori di single.php, ad esempio nella sidebar dove un titolo estremamente lungo potrebbe compromettere il layout.
Tutto quello che ho trovato è questo frammento di codice, ma ovviamente non fa quello che voglio.
function maxWord($title)
{
global $post;
$title = $post->post_title;
if (str_word_count($title) >= 10 ) //imposta questo al numero massimo di parole
wp_die( __('Errore: il titolo del post supera il numero massimo di parole consentite.') );
}
add_action('publish_post', 'maxWord');
È possibile farlo?
Cerco qualcosa di simile a questo, ma non per l'estratto, bensì per il titolo:
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;
}

Questo dipende al 100% da come stai ottenendo il titolo. Se stai utilizzando un oggetto globale (ad esempio $post->post_title
) allora non stai passandolo attraverso alcun filtro e dovrai utilizzare qualche elaborazione avanzata per ridurre il titolo.
Tuttavia, se sei all'interno di un loop di post, utilizza the_title()
per visualizzare il titolo del post corrente o get_the_title()
per ottenerlo programmaticamente.
Se utilizzi una di queste due funzioni, WordPress passerà automaticamente il titolo del post attraverso un filtro prima di restituirlo.
Quindi puoi aggiungere il seguente codice all'inizio del tuo file sidebar.php
:
function japanworm_shorten_title( $title ) {
$newTitle = substr( $title, 0, 20 ); // Prende solo i primi 20 caratteri
return $newTitle . " …"; // Aggiunge i puntini di sospensione al testo (...)
}
add_filter( 'the_title', 'japanworm_shorten_title', 10, 1 );
Ora, ogni volta che farai riferimento a the_title()
o get_the_title()
nella tua sidebar, restituiranno la versione automaticamente abbreviata invece di quella completa.
Ricordati di rimuovere questo filtro alla fine del tuo file sidebar.php
altrimenti si applicherà anche altrove nel tuo tema:
remove_filter( 'the_title', 'japanworm_shorten_title' );
Aggiornamento 10/3/2011
Se vuoi una funzione che puoi utilizzare ovunque, ti consiglio di creare le tue versioni di get_the_title()
e the_title()
e di utilizzarle nel tuo codice. Ad esempio:
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', __('Protetto: %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', __('Privato: %s'));
$title = sprintf($private_title_format, $title);
}
}
// Accorcia il titolo
if ( null != $length ) {
$length = (int) $length;
$title = substr( $title, 0, $length ); // Prende solo i primi 20 caratteri
$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;
}
Queste sono copiate dalle funzioni originali the_title()
e get_the_title()
, quindi dovrebbero funzionare nel loop allo stesso modo. Non ho però testato questo codice.

Ciao. Grazie mille. In realtà sto cercando qualcosa che possa usare più "liberamente" ovunque mi piaccia (vedi la mia domanda aggiornata). Non voglio usarlo solo nella mia sidebar, quello era solo un esempio. Ho un codice simile nel mio function.php per un estratto personalizzato dove posso regolare la lunghezza inserendo un numero in "(30)". È possibile fare lo stesso anche per il titolo?

Ciao. Scusa per la risposta tardiva. Sono stato via per alcuni giorni. Ho provato il codice e l'ho inserito nel mio function.php ma ho ricevuto un errore di sintassi, quindi purtroppo non sembra funzionare.

È qui che entra in gioco il commento "Non l'ho testato però". Qual era l'errore di sintassi? Potrei aver fatto un errore di battitura.

Sembra essere questa riga $title .= " …"
}
poiché il messaggio di errore dice: "Parse error: syntax error, unexpected '}' in /hermes/bosweb25a/b155/ipg.zoomingjapancom/wp-content/themes/alltuts/functions.php on line 51"

Dovrebbe esserci un punto e virgola in più alla fine di quella riga (rendendola $title .= " …";
). Modifico la mia risposta...

Ok, perfetto, ora non ricevo più un messaggio di errore, ma la funzione non sembra funzionare. Forse sto chiamando il titolo in modo sbagliato. Ho provato: <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title('12'); ?></a>
L'ho provato con e senza gli apici '' ... in entrambi i casi mostra solo un "12" davanti al titolo. Qualche idea? E grazie mille!

Dai un'altra occhiata al codice. Se stai ancora chiamando the_title()
allora non stai usando le funzioni che ho scritto sopra. Queste erano pensate come sostituti delle funzioni standard di WordPress che includono la tua funzionalità personalizzata.

Così giusto? <?php japanworm_the_title(2); ?>
Stesso problema. E se provo questo <?php japanworm_get_the_title(12); ?>
non viene visualizzato alcun titolo.

Guarda la firma della funzione: function japanworm_get_the_title( $length = null, $id = 0 )
... quindi devi specificare sia la lunghezza che l'id. Prova japanworm_get_the_title(20, 12)
per ottenere un titolo di 20 caratteri per il post con ID 12.

Ok, capisco, quindi significa che posso scegliere di accorciare il titolo di UN SOLO post per ciclo, giusto? Oppure è possibile usare vari id collegati con &? Ma immagino sarebbe meglio poter impostare una lunghezza massima globale del titolo per tutti i post in un ciclo.

Puoi utilizzare la funzione wp_trim_excerpt().
Se hai bisogno di specificare un limite di caratteri, puoi utilizzare il filtro excerpt_length.
<?php echo wp_trim_excerpt( get_the_title() ); ?>

Soluzione API WordPress
Se vuoi troncare solo lingue come l'inglese o lingue con caratteri semplici, usare substring
sarebbe la soluzione giusta. Tuttavia, se vuoi troncare lingue come il Cinese, il Giapponese o altre, usare substring potrebbe essere problematico, poiché utilizzano unicode per la rappresentazione.
Usare wp_trim_words() sarebbe un modo semplice e diretto per risolvere il tuo problema.
wp_trim_words( $testo, $numero_parole = 55, $altro = null );
p.s. ispirato da Leo Caseiro.
Soluzione Solo CSS
Se vuoi scoprire come troncare le parole dinamicamente, specialmente in un design responsive, dovresti usare CSS in questo modo:
.card-title {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
