• Risolto zippo978

    (@zippo978)


    Buon giorno a tutti,

    premesso che non so molto di PHP vi espongo il mio problema:

    sto finendo di modificare un blog in WordPress per mia moglie, l’ ultima cosa che mi manca di fare è creare un estratto degli articoli con lo stesso numero di caratteri, non di parole perchè l’ anteprima non viene precisa, quindi pensavo al conteggio delle lettere cosi da permettere una visualizzazione omogenea (tutti gli estratti delle stesse dimensioni), ho provato mille funzioni da mettere nel file function.php ma tutte quelle che ho provato, anche quelle che dicevano di contare i caratteri contano le parole, al momento uso questa funzione:

    function wpse_allowedtags() {
        // Add custom tags to this string
            return '<script>,<style>,<br>,<pre>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; 
        }
    
    if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) : 
    
        function wpse_custom_wp_trim_excerpt($wpse_excerpt) {
        global $post;
        $raw_excerpt = $wpse_excerpt;
            if ( '' == $wpse_excerpt ) {
    
                $wpse_excerpt = get_the_content('');
                $wpse_excerpt = strip_shortcodes( $wpse_excerpt );
                $wpse_excerpt = apply_filters('the_content', $wpse_excerpt);
                $wpse_excerpt = str_replace(']]>', ']]>', $wpse_excerpt);
                $wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags()); /*IF you need to allow just certain tags. Delete if all tags are allowed */
    
               //Set the excerpt word count and only break after sentence is complete.
                    $excerpt_word_count = 15;
                    $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count); 
                    $tokens = array();
                    $excerptOutput = '';
                    $count = 0;
    
                    // Divide the string into tokens; HTML tags, or words, followed by any whitespace
                    preg_match_all('/(<[^>]+>|[^<>\s]+)\s*/u', $wpse_excerpt, $tokens);
    
                    foreach ($tokens[0] as $token) { 
    
                        if ($count >= $excerpt_word_count && preg_match('/[\,\;\?\.\!]\s*$/uS', $token)) { 
                        // Limit reached, continue until , ; ? . or ! occur at the end
                            $excerptOutput .= trim($token);
                            break;
                        }
    
                        // Add words to complete sentence
                        $count++;
    
                        // Append what's left of the token
                        $excerptOutput .= $token;
                    }
    
                 $wpse_excerpt = trim(force_balance_tags($excerptOutput));
    
                    $excerpt_end = '... <br/><br/> <a style="font-family: Merriweather, Georgia, serif; font-size: 0.75rem; text-transform: uppercase;" href="'. esc_url( get_permalink() ) . '">' . '' . sprintf(__( 'Read more: %s ', 'wpse' ), get_the_title()) . '</a>'; 
                    $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); 
    
                    $pos = strrpos($wpse_excerpt, '</');
                    if ($pos !== false)
                    // Inside last HTML tag
                    $wpse_excerpt = substr_replace($wpse_excerpt, $excerpt_end, $pos, 0); /* Add read more next to last word */
                    //else
                    // After the content
                    //$wpse_excerpt .= $excerpt_end; /*Add read more in new paragraph */
    
                return $wpse_excerpt;   
    
            }
            return apply_filters('wpse_custom_wp_trim_excerpt', $wpse_excerpt, $raw_excerpt);
        }
    
    endif; 
    
    remove_filter('get_the_excerpt', 'wp_trim_excerpt');
    add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt'); 
    

    che oltre a contare le parole mantiene la formattazione e mantiene parole intere.

    C’è una possibilità di fare quello che cerco mantenendo la funzione? O comunque una funzione che fa tutto quello che cerco ?

    Grazie a tutti in anticipo

    P.s. Dimenticavo Uso WordPress 4.6, il tema modificato è twenty sixteen, non vorrei usare Plugin.

    il sito dove faccio tutte le modifiche è http://etherealprove.altervista.org/

Stai visualizzando 15 risposte - dal 1 al 15 (di 18 totali)
  • Ciao @zippo978,
    prova a sostituire il ciclo foreach con questo codice:

    
    foreach ($tokens[0] as $token) { 
        if ($count + strlen($token) <= $excerpt_word_count){
            $excerptOutput .= $token;  
        }
        else {
            $excerptOutput .= substr($token, 0, $excerpt_word_count - $count);  
        }
            
        $count = strlen($excerptOutput);
    }
    

    Nella variabile $excerpt_word_count inserisci il numero di caratteri desiderati (e magari la rinomini $excerpt_char_count).
    Ho provato solo il ciclo foreach, non ho provato tutto il codice, quindi non ti garantisco al 100% che funzioni.
    Inoltre tieni presente che se il font che usi non è monospace non hai la garanzia che a parità di numero di caratteri lo spazio occupato sia lo stesso.
    Facci sapere se la soluzione funziona.
    Giancarlo

    • Questa risposta è stata modificata 8 anni, 4 mesi fa da Giancarlo Mosso.
    Chi ha creato la discussione zippo978

    (@zippo978)

    Ciao @gmosso

    innanzitutto grazie per la risposta, il codice funziona perfettamente, il conteggio dei caratteri è perfetto ed il testo rimane formattato forse l’ unico neo è che tronca le parole è possibile far finire l’ excertp con parole intere ?

    Grazie sempre

    • Questa risposta è stata modificata 8 anni, 4 mesi fa da zippo978.

    Ciao,
    per avere le parole intere usa questo codice:

    
    foreach ($tokens[0] as $token) { 
        $excerptOutput .= $token;  
    
        $count = strlen($excerptOutput);
        
        if ($count >= $excerpt_word_count){
            break;
        }
    }
    

    Nel caso volessi riutilizzare il codice di ieri è meglio che aggiungi un’istruzione break, ieri l’avevo dimenticata:

    
    foreach ($tokens[0] as $token) { 
        if ($count + strlen($token) <= $excerpt_word_count){
            $excerptOutput .= $token;  
        }
        else{
            $excerptOutput .= substr($token, 0, $excerpt_word_count - $count);
            break;
        }
        
        $count = strlen($excerptOutput);
    }
    

    Giancarlo

    • Questa risposta è stata modificata 8 anni, 4 mesi fa da Giancarlo Mosso.
    Chi ha creato la discussione zippo978

    (@zippo978)

    Ciao
    il codice funziona solo che non capisco perchè, avendo messo come numero di caratteri 250 alcuni post li fa per esempio a 189 altri a 240 piu o meno, capisco che per terminare le parole usa piu caratteri ma non capisco questa differenza.

    Grazie sempre

    Ciao,
    tra i caratteri vengono contati anche gli spazi, quelli li inseriti nel tuo conteggio ?

    Chi ha creato la discussione zippo978

    (@zippo978)

    Ciao,
    Sara perxhè mi sono svegliato da poco ma non ho capito cosa vuoi sapere, se vengono contati gli spazi o quanti spazi ci sono nell’ articolo.

    Ciao,
    leggo che hai contato il numero di caratteri che vengono visualizzati (189, 240). La mia domanda è: nei 189 o 240 sono inclusi anche gli spazi tra le parole o in fondo ?
    Il motivo è che il conteggio dei caratteri (max 250 nel tuo caso) include anche gli spazi tra le parole e al fondo

    • Questa risposta è stata modificata 8 anni, 4 mesi fa da Giancarlo Mosso.
    Chi ha creato la discussione zippo978

    (@zippo978)

    Si vengono inclusi anche gli spazi nel conteggio

    Ciao,
    non avendo io provato tutto il codice come ti dicevo può darsi che scappi qualcosa. Questo è quello che si può fare nello spazio di un forum.
    Inserisco qui una versione modificata, prova questa, comunque non lavorando sul conteggio esatto dei caratteri può darsi che in alcuni casi non dia esattamente i risultati attesi, come ti ho detto per avere un risultato ottimo bisogna lavorarci su di più di quello che si può fare in un forum e fare diversi test. Fammi sapere se va meglio:

    
    foreach ($tokens[0] as $token) { 
        if ($count + strlen($token) <= $excerpt_word_count){
            $excerptOutput .= $token;  
        }
        else{
            break;
        }
        
        $count = strlen($excerptOutput);
    }
    $excerptOutput .= $token;
    

    Giancarlo

    Chi ha creato la discussione zippo978

    (@zippo978)

    Si capisco che via forum e senza poter provare direttamente sul codice non è facile ed è uno sbattimento e per questo ti ringrazio tanto.

    Detto questo l’ ultimo codice dato non funziona, non fa vedere nulla dell’ estratto 🙁

    Se puo servire posso passarti il file function.

    • Questa risposta è stata modificata 8 anni, 4 mesi fa da zippo978.

    Puoi inserire il codice del tuo file (prima verifica che non contenga informazioni riservate) in http://pastebin.com e inserire qui il link.
    Giancarlo

    Ciao @zippo978,
    ho provato il codice che avevi inserito nel tuo primo post in una mia installazione WordPress di test. Prendi il codice del tuo primo post e sostituisci il ciclo foreach con il codice che trovi qui sotto:

    
    foreach ($tokens[0] as $token) { 
    
        $excerptOutput .= $token;
    
        $excerptOutputWithoutTags = strip_tags(trim($excerptOutput));
    
        if (strlen($excerptOutputWithoutTags) >= $excerpt_word_count){
            break;
        }
    }  
    

    Così a me funziona. Come sempre dovrai provare il tutto con i tuoi articoli, io ho fatto alcune prove con del testo fittizio.
    Il motivo per cui il conteggio dei caratteri era a volte molto diverso dai 250 da te impostati era che avevo ipotizzato che $tokens[0] contenesse le sole parole di testo, mentre contiene anche i tag html. Questo codice che ti ho mandato ne tiene conto.
    Facci sapere se funziona.
    Giancarlo

    Chi ha creato la discussione zippo978

    (@zippo978)

    È perfetto fa esattamente quello che volevo!

    Grazie di tutto sei stato grande 😀 😀

    Benissimo, sono contento.
    Un’ultima cosa: assicurati di fare le modifiche in un child theme e non direttamente nei file del tema, altrimenti al primo aggiornamento del tema perderai tutte le modifiche che hai fatto.
    A questo link trovi la spiegazione di come si crea un child theme: https://codex.wordpress.org/it:Temi_Child
    Giancarlo

    Chi ha creato la discussione zippo978

    (@zippo978)

    È vero fa esattamente quello che cerco ma purtroppo ancora non ha la precisione che cerco, mettendolo sul sito definitivo mi sono accorto che alcuni post sono piu alti ed altri piu bassi e mi p venuto in mente un’ idea malsana:

    Si puo fare in modo che l’ estratto non superi un toto di righe ?

    So che sto un po rompendo ma mi piace la precisione essendo grafico 😀

    Prima io mi occupavo della parte grafica ( layout, css, loghi etv… ) e per il codice mi facevo aiutare da un amico ma adesso purtroppo non ci sentiamo piu ed io mi arrabatto come posso cerccando e conservando codici via internet.

    Grazie sempre

    Dimenticavo, se ti puo servire:

    http://pastebin.com/rLLDM138

    • Questa risposta è stata modificata 8 anni, 4 mesi fa da zippo978.
Stai visualizzando 15 risposte - dal 1 al 15 (di 18 totali)
  • Il topic ‘Conteggio caratteri estratto articoli’ è chiuso a nuove risposte.