Limitare le parole nel contenuto del post e aggiungere un link "Leggi tutto"
Come puoi vedere nel codice, la routine mostra il post che ha un id
di 266
. Ora tutto quello che voglio è limitare le parole visualizzate nel contenuto di quel post. Diciamo che voglio limitare le parole a un numero di 300 e poi aggiungere un link "Leggi tutto".
Questo è il codice che ho finora:
$post_id = 266;
echo "<div id='widgets-wrapper3'><div id='marginwidgets' style='overflow: auto; max-width: 100%; margin: 0 auto; border: none !important;'>";
$queried_post = get_post($post_id);
echo "<div class='thewidgets'>";
echo $queried_post->post_content;
echo '</div>';
echo "</div></div>";
?>

Ho sempre lo stesso problema con l'estratto del post e il contenuto del post. Ci sono diversi hook e funzioni per questo scopo, come ha sottolineato @kaiser. Ma a volte non fanno esattamente quello che voglio.
Ecco la mia soluzione, scrivo la mia funzione che prende il contenuto del post e lo tronca in un numero specifico di parole:
function wpse69204_excerpt( $num_words = 20, $ending = '...', $post_id = null )
{
global $post;
// Tronca il contenuto del post
$current_post = $post_id ? get_post( $post_id ) : $post;
$excerpt = strip_shortcodes( $current_post->post_content );
$excerpt = wp_trim_words( $excerpt, $num_words, $ending );
// Link "Continua a leggere"
$excerpt .= '<a href="' . get_permalink( $post ) . '" title="">Continua a leggere...</a>';
return $excerpt;
}

Ho appena scoperto wp_trim_words/*_excerpt()
. Una cosa interessante da notare: gestisce anche lingue dove 1 carattere = parola come il cinese.

E se ci fosse del HTML all'interno del contenuto del post? Verrebbe conteggiato nel limite di parole? Vorrei escludere i tag HTML e mantenerli così che quando c'è del HTML, solo il contenuto puro venga preso dalla funzione che limita il conteggio delle parole.

La funzione wp_trim_words
rimuove tutti i tag HTML. Vedi sorgente qui

Ci sono tre filtri che controllano il link "continua a leggere", a seconda della funzione/Template Tag utilizzata. La cosa negativa è che si sovrappongono. La cosa positiva è che puoi facilmente modificare l'output del filtro utilizzando current_filter()
per recuperare il nome del filtro attualmente collegato e modificare l'output.
Poi abbiamo il filtro 'excerpt_length'
per limitare la lunghezza dell'estratto. Questo non ci permette di aggiungere un permalink, ma ci aiuta in combinazione con gli altri filtri. Vedi il 2o plugin.
Il plugin permalink-more
Questo plugin aggiunge il permalink al contenuto o all'estratto - a seconda di cosa viene visualizzato. Resetta anche il filtro excerpt_more
per non restituire nulla, in modo da non interferire con gli altri filtri.
<?php
/** Plugin Name: (#69204) »kaiser« Aggiunge un permalink all'estratto e al contenuto */
/**
* Modifica la visualizzazione del link "continua a leggere"
*
* @param string $permalink
* @param string $testo
* @return string $html
*/
function wpse69204_more_link( $output )
{
$html .= '<span class="post-more"> ';
$html .= sprintf(
'<a href="%s#more-%s" class="more-link" title="leggi tutto" >'
,get_permalink()
,get_the_ID()
);
$html .= '</a></span>';
// Sovrascrive 'excerpt_more'
if ( 'excerpt_more' === current_filter() )
return;
// Riduce il contenuto per il filtro `get_the_excerpt`.
$output = wp_trim_words( $output, 300 );
// Aggiunge per l'estratto
if ( 'get_the_excerpt' === current_filter() )
return $output.$html;
// Il permalink per il filtro `the_content_more_link`.
return $html;
}
# Link "continua a leggere" per il contenuto
add_filter( 'the_content_more_link', 'wpse69204_more_link' );
add_filter( 'get_the_excerpt', 'wpse69204_more_link' );
add_filter( 'excerpt_more', 'wpse69204_more_link' );
Il plugin per la lunghezza dell'estratto
Se vuoi solo modificare la lunghezza dell'estratto, puoi usare una configurazione di filtri molto più semplice. Il seguente plugin fa un lavoro molto raffinato. Riduce il contenuto (siamo nel loop e abbiamo accesso ai dati del post) a 300 parole. Nel passo successivo conta le lettere di ogni singola parola. Poi restituisce semplicemente questo numero (assegnato dinamicamente).
<?php
/** Plugin Name: (#69204) »kaiser« Limita la lunghezza dell'estratto per numero di parole */
function wpse69204_excerpt_length( $length )
{
$to_count = array_splice( get_the_content(), 300 );
$i = 0;
foreach ( $to_count as $word )
{
$i += strlen( $word );
}
return $i;
}
add_filter( 'excerpt_length', 'wpse69204_excerpt_length' );
Note
- Entrambi i plugin sono »zero configurazione«. Basta caricare, attivare, fatto.
- Dovrai usare
the_content()
othe_excerpt()
nel tuo tema per utilizzare questi plugin.

e se all'interno del contenuto di un post c'è del codice html? verrà conteggiato anche quello nel limite di parole? vorrei escludere i tag html e mantenerli così che, quando è presente del codice html, solo il contenuto puro venga preso dalla funzione che limita il conteggio delle parole.
