Come controllare la lunghezza dell'estratto manuale?
Ho un sito web in cui ho bisogno di controllare la lunghezza dell'estratto visualizzato.
Alcuni dei post potrebbero avere un estratto manuale quindi non posso utilizzare il filtro excerpt_length
.
Potrei, ovviamente, utilizzare qualche tipo di substr()
, ma stavo cercando una soluzione più elegante (se esiste).

Dai un'occhiata alla mia risposta qui: Miglior raccolta di codice per il tuo file functions.php
Se ho capito bene la tua domanda, fa esattamente quello che stai cercando.
Inserisci questo nel tuo functions.php
:
function excerpt($num) {
$limit = $num+1;
$excerpt = explode(' ', get_the_excerpt(), $limit);
array_pop($excerpt);
$excerpt = implode(" ",$excerpt)."... (<a href='" .get_permalink($post->ID) ." '>Leggi tutto</a>)";
echo $excerpt;
}
Poi, nel tuo tema, usa il codice <?php excerpt('22'); ?>
per limitare l'estratto a 22 caratteri.
:)

La tua funzione dovrebbe utilizzare un intero corretto e non una stringa per passare valori numerici, oppure potrebbe convertire all'interno della funzione, ad esempio $num = (int) $num;
. '1' != 1
.. :)

Con la versione più recente di WordPress (v.3.3.0+), puoi effettivamente utilizzare wp_trim_words
.
function excerpt($limit) {
return wp_trim_words(get_the_excerpt(), $limit);
}
Vedi anche: https://stackoverflow.com/a/17177847/851045

Direi di dare un'occhiata a come lo fa il core: http://phpxref.ftwr.co.uk/wordpress/wp-includes/formatting.php.source.html#l1840
Mi sono permesso di inserire qui il codice per facilitare il copia e incolla.
global $post;
if( empty($post->post_excerpt) ){
$text = apply_filters( 'the_excerpt', get_the_excerpt() );
} else {
$text = $post->post_excerpt;
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
$text = strip_tags($text);
$excerpt_length = apply_filters('excerpt_length', 55);
$excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
$words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
if ( count($words) > $excerpt_length ) {
array_pop($words);
$text = implode(' ', $words);
$text = $text . $excerpt_more;
} else {
$text = implode(' ', $words);
}
}

Può essere fatto semplicemente come mostrato di seguito.
// Funzione per personalizzare la lunghezza dell'estratto
function custom_excerpt_length( $length ) {
return 20; // Restituisce 20 parole come lunghezza dell'estratto
}
// Aggiunge il filtro per modificare la lunghezza dell'estratto
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );
Riferimento: Codex

Prova questo: Puoi controllare il numero di parole che l'estratto restituisce utilizzando il filtro "excerpt_length". Di seguito ci sono un paio di esempi su come puoi controllare la lunghezza in base a diverse condizioni
add_filter( 'excerpt_length', 'new_excerpt_length' );
function new_excerpt_length( $more ) {
if(is_front_page()){
if(has_post_thumbnail()){
return 15;
} else {
return 45;
}
} else {
return 100;
}
}
MODIFICA: Accidenti, ho appena notato che hai detto che l'approccio con i filtri non era possibile. Beh, questo è per altre persone che arrivano qui tramite Google e vogliono questa soluzione allora.

Inserisci questo codice nel tuo file functions.php
/* limitazione facile dell'excerpt
*/
function
easy_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;
}
e usa echo easy_excerpt(miolimite)
invece di the_excerpt()
Funziona perfettamente.

Dovresti indentare correttamente il tuo codice per una migliore leggibilità, controlla la sezione di aiuto per la formattazione ;-)
