Limitare le parole nel contenuto del post e aggiungere un link "Leggi tutto"

15 ott 2012, 01:27:08
Visualizzazioni: 18K
Voti: 4

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>";    
?>
1
Commenti

Qualche progresso su questa domanda? Hai ricevuto tre risposte (di alto livello).

kaiser kaiser
26 nov 2012 04:59:40
Tutte le risposte alla domanda 2
3

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;
}
15 ott 2012 04:26:04
Commenti

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

kaiser kaiser
15 ott 2012 04:30:21

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.

Juliver Galleto Juliver Galleto
16 ott 2012 01:03:51

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

Anh Tran Anh Tran
16 ott 2012 04:01:40
2

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">&nbsp;';
    $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

  1. Entrambi i plugin sono »zero configurazione«. Basta caricare, attivare, fatto.
  2. Dovrai usare the_content() o the_excerpt() nel tuo tema per utilizzare questi plugin.
15 ott 2012 04:17:15
Commenti

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.

Juliver Galleto Juliver Galleto
16 ott 2012 01:02:21

No, the_excerpt non include i tag HTML. Suggerimento: prova sempre prima di segnalare. Provare e sbagliare è più semplice che discutere e fare ipotesi :) Grazie.

kaiser kaiser
16 ott 2012 01:04:27