Personalizzazione di get_the_excerpt() per lunghezza specifica e output "Leggi altro"
Sto personalizzando un template. C'è un elenco che prende l'introduzione dai primi 1-2 paragrafi (tutti gli articoli di una categoria). Se imposto l'estratto a 295 parole, a volte l'elenco prende parole aggiuntive dal paragrafo successivo. Vorrei aggiungere un tag Leggi altro per fermarlo. Qualcuno può aiutarmi con questa parte?
<div id="all-div-cabrand-content-stories">
<div class="kids-families-con-cabrand-stories">
<?php echo get_the_post_thumbnail($page->ID, 'thubmnailstorysmall'); ?>
</div>
<div class="kids-con-cabrand-new-stories">
<span>
<?php print substr(get_the_excerpt(),wp_trim_excerpt(),295); ?>
<i><a style="color:#1975D1;float:Right;" class="title" href="<?php the_permalink() ?>" rel="bookmark">Clicca per Storia e Video</a></i>
<br/>
</span>
</div>
</div>
Per ottenere una lunghezza specifica puoi usare la funzione: wp_trim_words. Ha 3 parametri.
- Testo da tagliare. Es:
get_the_content()
- Numero di parole. Es:
295
- Cosa aggiungere alla fine del testo. Es:
''
Questo significa null.
Usa questo codice:
<span>
<?php echo wp_trim_words( get_the_content(), 295, '' ); ?>
<i><a style="color:#1975D1;float:Right;" class="title" href="<?php
the_permalink() ?>" rel="bookmark">Clicca per la Storia & Video</a></i>
<br/>
</span>

Puoi estrarre il primo o i primi due paragrafi con un'espressione regolare (regexp)
function custom_excerpt( $content = '' ){
if( empty( $content ) )
return $content;
$result = '';
$matches = array();
// estrae tutti i paragrafi da $content
preg_match_all( '#<\s*p[^>]*>(.*?)<\s*/\s*p>#ui', $content, $matches );
if( ! empty( $matches ) ){
// aggiunge il primo paragrafo
$result = $matches[0][0];
// aggiunge il secondo paragrafo se disponibile
if( isset( $matches[0][1] ) )
$result .= $matches[0][1];
// imposta la lunghezza dell'estratto
add_filter( 'excerpt_length', 'custom_excerpt_length' );
// crea l'estratto personalizzato
$result = custom_trim_excerpt( $result );
}
return $result;
}
function custom_excerpt_length(){
return 295;
}
function custom_trim_excerpt( $text = '' ){
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
$excerpt_length = apply_filters('excerpt_length', 55);
$excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
$text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
return $text;
}
Chiama la funzione con
<?php print custom_excerpt( get_the_content( 'Leggi tutto' ) ); ?>
Questo è un po' complicato perché non puoi passare un testo a wp_trim_excerpt()
. wp_trim_excerpt()
restituirà semplicemente il testo se gli viene fornito.
Devi copiare e personalizzare un po' la funzione.

Puoi utilizzare questa funzione:
function get_excerpt_trim($num_words='20', $more='...'){
$excerpt = get_the_excerpt();
$excerpt = wp_trim_words( $excerpt, $num_words , $more );
return $excerpt;
}
https://codex.wordpress.org/Function_Reference/wp_trim_words

Puoi utilizzare la funzione integrata
function custom_excerpt_length( $length ) {
return 20;
}
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );

Per ottenere ciò che desideri, devi fare due cose.
1) Stabilire una lunghezza personalizzata per l'estratto (in parole, non in caratteri), ottenibile al meglio seguendo questa risposta.
2) Basta chiamare wp_trim_excerpt(), senza avvolgerlo all'interno di substr
La tua riga di codice sopra non sta facendo quello che ti aspetti. Credo che stia restituendo i primi 295 caratteri dell'estratto, ma non sono completamente sicuro di cosa farà la funzione php subtr() quando le passerai una stringa come secondo argomento quando si aspetta un intero.
