Consentire HTML nell'excerpt

13 apr 2014, 00:11:46
Visualizzazioni: 136K
Voti: 66

Ecco il mio codice per l'excerpt.

// Genera lunghezza personalizzata dell'excerpt
function wpbx_excerpt_length($length) {
    return 300;
}
add_filter('excerpt_length', 'wpbx_excerpt_length');

Come posso consentire html come <a> <b> <i> <br>

0
Tutte le risposte alla domanda 3
23
144

GUIDA COMPLETA AGLI EXCERPT

Recentemente ho risposto ad alcune domande riguardanti gli excerpt, quindi fornirò una spiegazione dettagliata che copra il più possibile.

PREFAZIONE

Sembrano esserci un paio di domande su dove dovrebbe andare il codice, e la risposta è che dipende davvero da te e da come ritieni opportuno. Ci sono un paio di opzioni su dove inserire il codice (se non esplicitamente indicato):

  • Nel file functions.php del tuo tema o in qualsiasi file utilizzato come file di funzioni. Ricorda solo che quando fai questo, se il tema non è tuo, tutte le modifiche andranno perse quando aggiornerai il tema

  • Un modo migliore sarebbe utilizzare il codice in un child theme. Come sopra, nel file functions.php o in un file correlato alle funzioni

  • Usare il codice in un plugin. Questo è il metodo preferito poiché rende il codice disponibile per tutti i temi. Se cambi tema, non devi preoccuparti di riscrivere lo stesso codice.

Spero che questo chiarisca un po' le cose :-)

TAG/FORMATTAZIONE HTML

the_excerpt() innanzitutto non accetta alcun parametro, quindi non gli può essere passato nulla. È un fatto che the_excerpt() taglia il contenuto a 55 parole, e tutti i tag HTML vengono rimossi prima di restituire il testo. the_excerpt() si trova in wp-includes/post-template.php. Per consentire determinati o tutti i tag HTML nell'excerpt, deve essere creato un nuovo excerpt.

Prima di tutto, la funzione originale deve essere rimossa, e poi la nuova funzione deve essere agganciata a get_the_excerpt. Nota bene, questo nuovo excerpt sarà ancora richiamabile come the_excerpt() nei file template, non c'è bisogno di cambiarlo. get_the_excerpt() si trova in wp-includes/post-template.php.

L'excerpt utilizza wp_trim_excerpt per restituire il testo tagliato, quindi dobbiamo prima rimuovere wp_trim_excerpt dal filtro dell'excerpt. wp_trim_excerpt() si trova in wp-includes/formatting.php, riga 2355. Ecco come:

remove_filter('get_the_excerpt', 'wp_trim_excerpt');

Ora puoi aggiungere il tuo nuovo excerpt a get_the_excerpt

add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt');

Per consentire tag HTML/formattazione, dovremo specificare quali tag vuoi permettere. Puoi usare la seguente istruzione strip_tags per ottenere ciò

$wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags());

Il secondo argomento wpse_allowedtags() è una piccola funzione che viene utilizzata per aggiungere i tag che the_excerpt() permetterà. Per una lista completa dei tag HTML 5 validi, vai a controllare qui. Ecco la funzione, aggiungi qualsiasi tag HTML a questa che hai bisogno di permettere/mantenere

function wpse_allowedtags() {
// Aggiungi tag personalizzati a questa stringa
    return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; 
}

Se hai bisogno di permettere tutti i tag HTML, cioè nessuna rimozione di alcun tag, la funzione strips_tags() può essere omessa/rimossa completamente.

Un punto da notare tuttavia, quando i tag html sono permessi, questi tag vengono contati come parole, quindi il conteggio delle parole per excerpt con tag e senza tag non sarà lo stesso. Per correggere questo, dovrai prima rimuovere questi tag dal conteggio effettivo delle parole in modo che solo le parole siano contate.

Ho scritto un excerpt che permetterà tutti i tag, conterà solo le parole come parole, completerà una frase dopo il numero impostato di parole (in modo che il testo non venga tagliato a metà frase) e aggiungerà un testo "leggi tutto" dopo l'ultima parola.

Ecco il codice completo

function wpse_allowedtags()
{
  // Aggiungi tag personalizzati a questa stringa
  return '<script>,<style>,<br>,<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)
  {
    $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(']]>', ']]&gt;', $wpse_excerpt);
      $wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags()); /*SE hai bisogno di permettere solo alcuni tag. Elimina se tutti i tag sono permessi */

      //Imposta il conteggio delle parole dell'excerpt e interrompi solo dopo che la frase è completa.
      $excerpt_word_count = 75;
      $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count);
      $tokens = array();
      $excerptOutput = '';
      $count = 0;

      // Divide la stringa in token; tag HTML, o parole, seguite da qualsiasi spazio bianco
      preg_match_all('/(<[^>]+>|[^<>\s]+)\s*/u', $wpse_excerpt, $tokens);

      foreach ($tokens[0] as $token) {

        if ($count >= $excerpt_length && preg_match('/[\,\;\?\.\!]\s*$/uS', $token)) {
          // Limite raggiunto, continua finché , ; ? . o ! non compaiono alla fine
          $excerptOutput .= trim($token);
          break;
        }

        // Aggiungi parole per completare la frase
        $count++;

        // Aggiungi ciò che resta del token
        $excerptOutput .= $token;
      }

      $wpse_excerpt = trim(force_balance_tags($excerptOutput));

      $excerpt_end = ' <a href="' . esc_url(get_permalink()) . '">' . '&nbsp;&raquo;&nbsp;' . sprintf(__('Leggi tutto su: %s &nbsp;&raquo;', 'wpse'), get_the_title()) . '</a>';
      $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end);

      //$pos = strrpos($wpse_excerpt, '</');
      //if ($pos !== false)
      // Dentro l'ultimo tag HTML
      //$wpse_excerpt = substr_replace($wpse_excerpt, $excerpt_end, $pos, 0); /* Aggiungi "leggi tutto" accanto all'ultima parola */
      //else
      // Dopo il contenuto
      $wpse_excerpt .= $excerpt_more; /*Aggiungi "leggi tutto" in un nuovo paragrafo */

      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');

Puoi semplicemente rimuovere i '//' dalle funzioni di cui hai bisogno extra.

LUNGHEZZE PERSONALIZZATE DEGLI EXCERPT

A volte hai bisogno di visualizzare excerpt semplici di lunghezze diverse e non è pratico scrivere un excerpt per ogni post/funzione/pagina. Ecco una bella piccola funzione che utilizza wp_trim_words

function wpse_custom_excerpts($limit) {
    return wp_trim_words(get_the_excerpt(), $limit, '<a href="'. esc_url( get_permalink() ) . '">' . '&nbsp;&hellip;' . __( 'Leggi tutto &nbsp;&raquo;', 'wpse' ) . '</a>');
}

Ciò che fa questa piccola funzione è prendere get_the_excerpt, tagliarlo al $limit impostato dall'utente, e restituire il testo con un link "leggi tutto" alla fine.

Puoi chiamare questo excerpt come segue nel tuo template

echo wpse_custom_excerpts($limit);

dove $limit sarà il tuo conteggio di parole, quindi un excerpt di 30 parole sarà

echo wpse_custom_excerpts(30);

Solo una cosa da ricordare qui, se imposti il tuo limite a più di 55 parole, verranno restituite solo 55 parole poiché l'excerpt è lungo solo 55 parole. Se sono necessari excerpt più lunghi, usa get_the_content invece.

LUNGHEZZA PERSONALIZZATA DELL'EXCERPT

Se hai solo bisogno di modificare la lunghezza di the_excerpt(), puoi usare la seguente funzione

function wpse_excerpt_length( $length ) {
    return 20;
}
add_filter( 'excerpt_length', 'wpse_excerpt_length', 999 );

Ricorda, dovrai impostare una priorità maggiore di 10 in modo che la tua funzione personalizzata venga eseguita dopo quella predefinita.

AGGIUNGI LINK "LEGGI TUTTO"

Tutto il testo restituito dall'excerpt ha il famigerato [...] alla fine che non è cliccabile. Per aggiungere un testo "leggi tutto" al posto dei puntini, usa questa funzione

 function wpse_excerpt_more( $more ) {
    return ' <a class="read-more" href="'. get_permalink( get_the_ID() ) . '">' . __('Leggi tutto', 'your-text-domain') . '</a>';
}
add_filter( 'excerpt_more', 'wpse_excerpt_more' );

MODIFICA

Excerpt del primo paragrafo

Voglio mantenere questa guida completa, quindi ecco l'excerpt che taglia dopo il primo paragrafo.

Ecco una funzione che mantiene intatti i tag HTML, aggiunge un link "Leggi tutto" alla fine dell'excerpt e taglia l'excerpt dopo il primo paragrafo.

if ( ! function_exists( 'wpse0001_custom_wp_trim_excerpt' ) ) : 
    
    function wpse0001_custom_wp_trim_excerpt($wpse0001_excerpt) {
        global $post;
        $raw_excerpt = $wpse0001_excerpt;
        if ( '' == $wpse0001_excerpt ) {
    
            $wpse0001_excerpt = get_the_content('');
            $wpse0001_excerpt = strip_shortcodes( $wpse0001_excerpt );
            $wpse0001_excerpt = apply_filters('the_content', $wpse0001_excerpt);
            $wpse0001_excerpt = substr( $wpse0001_excerpt, 0, strpos( $wpse0001_excerpt, '</p>' ) + 4 );
            $wpse0001_excerpt = str_replace(']]>', ']]&gt;', $wpse0001_excerpt);
    
            $excerpt_end = ' <a href="'. esc_url( get_permalink() ) . '">' . '&nbsp;&raquo;&nbsp;' . sprintf(__( 'Leggi tutto su: %s &nbsp;&raquo;', 'pietergoosen' ), get_the_title()) . '</a>'; 
            $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); 
    
            //$pos = strrpos($wpse0001_excerpt, '</');
            //if ($pos !== false)
            // Dentro l'ultimo tag HTML
            //$wpse0001_excerpt = substr_replace($wpse0001_excerpt, $excerpt_end, $pos, 0);
            //else
            // Dopo il contenuto
            $wpse0001_excerpt .= $excerpt_more;
    
            return $wpse0001_excerpt;
    
        }
        return apply_filters('wpse0001_custom_wp_trim_excerpt', $wpse0001_excerpt, $raw_excerpt);
    }
    
endif; 
    
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'wpse0001_custom_wp_trim_excerpt');

MODIFICA 29-10-2015

Per chiunque abbia bisogno di una soluzione alternativa per non visualizzare il link "leggi tutto" dopo l'excerpt quando l'excerpt è più corto del numero di parole impostato, si prega di vedere la seguente domanda e risposta

13 apr 2014 08:30:46
Commenti

dove esattamente devo inserire questa parte function wpse_allowedtags() { // Aggiungi tag personalizzati a questa stringa return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; } sono confuso

user32447 user32447
13 apr 2014 12:13:38

Tutto questo codice va nel file functions.php. Puoi aggiungerlo appena sopra if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) : nel tuo functions.php

Pieter Goosen Pieter Goosen
13 apr 2014 12:16:16

@user32447 vedi modifica

Pieter Goosen Pieter Goosen
13 apr 2014 12:19:14

lo so ma ci sono alcuni tag che voglio permettere e non so come ottenere questo, ho inserito il codice nel mio functions.php ma cosa devo cambiare per consentire determinati tag @pieter goosen

user32447 user32447
13 apr 2014 12:21:02

devo cancellare questa riga e sostituirla $wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags());

user32447 user32447
13 apr 2014 12:21:58

non importa, mi era sfuggita la parte superiore del codice

user32447 user32447
13 apr 2014 12:25:12

No, mantieni $wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags());. Devi aggiungere i tuoi tag a questi return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; Puoi anche eliminare tutti questi tag e aggiungere solo i tuoi

Pieter Goosen Pieter Goosen
13 apr 2014 12:25:27

se questo viene inserito nel file functions.php non verrà sovrascritto quando arriverà un aggiornamento?

mcgrailm mcgrailm
24 lug 2014 04:51:56

@mcgrailm sì, lo sarebbe. Ecco perché è importante aggiungerlo al functions.php del tuo child theme. Puoi anche aggiungerlo come must-use plugin

Pieter Goosen Pieter Goosen
24 lug 2014 06:55:16

Forse aggiungere anche ":" come token?

timocouckuyt timocouckuyt
28 mar 2015 15:49:13

@PieterGoosen Wow, questa è una spiegazione fantastica! C'è solo una cosa: la funzione aggiungerà parole fino al prossimo . o ! (ad esempio), ma cosa succede se non ci sono più parole dopo il . o ! finale? Il link "Leggi tutto" verrà comunque mostrato... So che la funzione excerpt non dovrebbe mostrare il contenuto completo, ma può essere difficile da controllare se un redattore scrive un articolo breve. Cosa ne pensi di questa situazione?

Pipo Pipo
12 giu 2015 18:34:15

@Pipo Hai ragione. Darò un'occhiata a questo problema dopo il weekend, sarò un po' impegnato. Ti terrò aggiornato. Grazie per la tua risposta

Pieter Goosen Pieter Goosen
13 giu 2015 06:12:00

@PieterGoosen Non preoccuparti, non c'è fretta, sto solo cercando di imparare dal tuo codice. Buona domenica

Pipo Pipo
14 giu 2015 21:13:09

Questo assicura che nessun tag rimanga aperto? Lo chiedo a causa di questa domanda.

Nicolai Grossherr Nicolai Grossherr
30 lug 2015 14:47:32

C'è un problema con i tag ul e li di cui sono a conoscenza, ma in generale, questo dovrebbe semplicemente essere rimosso da un estratto. @ialocin

Pieter Goosen Pieter Goosen
30 lug 2015 14:51:08

Ottimo! Quindi se ho diciamo 100 parole e c'è un tag di apertura senza quello di chiusura, verrà rimosso.

Nicolai Grossherr Nicolai Grossherr
30 lug 2015 14:53:32

@ialocin no, non lo farà. Puoi implementare qualcosa di simile per rimuovere i tag lasciati aperti. Quello che intendevo è che si dovrebbero effettivamente rimuovere tag come ul e li dall'excerpt. In una delle funzioni sopra puoi farlo.

Pieter Goosen Pieter Goosen
30 lug 2015 14:58:22

Peccato, allora ti ho frainteso - ovviamente. Questo era più relativo a tag come <b>.

Nicolai Grossherr Nicolai Grossherr
30 lug 2015 15:05:16

Penso che questo abbia bisogno di test :-). Quando ho costruito questo codice, era più pensato per i tag a, che in quel momento erano il mio problema principale. Solo più tardi ho notato che i tag ul e li venivano rimossi a metà, quindi ti ritrovavi con il tag di apertura ma senza quello di chiusura. Ad essere onesti, questo codice ha i suoi difetti :-)

Pieter Goosen Pieter Goosen
30 lug 2015 15:16:00

@PieterGoosen Ti faccio solo notare che agganciare la funzione excerpt_more non funzionerà a meno che non le assegni una priorità più bassa, dato che template-tags.php viene caricato dopo il functions.php del tema corrente

Cu7l4ss Cu7l4ss
16 dic 2015 03:05:11

@PieterGoosen grazie per il post molto informativo - domanda veloce: sarebbe possibile modificare l'excerpt in questo modo solo per un specifico post type?

nickpish nickpish
8 set 2017 01:52:04

Puoi scrivere una soluzione rapida che posso copiare e incollare nel mio codice? È estate e non ho voglia di leggere un libro.

Daniel Muñoz Parsapoormoghadam Daniel Muñoz Parsapoormoghadam
9 giu 2018 17:54:59

Per chi si chiede cosa copiare, c'è una sezione "Ecco il codice completo" nella risposta.

m4n0 m4n0
31 dic 2020 10:36:51
Mostra i restanti 18 commenti
0

Aggiungi più tag se necessario in $allowed_tags = ...

function _20170529_excerpt($text) {
$raw_excerpt = $text;
if ( '' == $text ) {
    //Recupera il contenuto del post.
    $text = get_the_content('');

    //Elimina tutti gli shortcode dal contenuto.
    $text = strip_shortcodes( $text );

    $text = apply_filters('the_content', $text);
    $text = str_replace(']]>', ']]&gt;', $text);

    $allowed_tags = '<a>,<b>,<br><i>'; 
    $text = strip_tags($text, $allowed_tags);

    $excerpt_word_count = 55; /*** MODIFICA QUESTO. cambia il conteggio delle parole dell'estratto con qualsiasi numero intero desideri.***/
    $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count); 

    $excerpt_end = '[...]'; /*** MODIFICA QUESTO. cambia la fine dell'estratto con qualcos'altro.***/
    $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end);

    $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);
    }
}
return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

Da: http://bacsoftwareconsulting.com/blog/index.php/wordpress-cat/how-to-preserve-html-tags-in-wordpress-excerpt-without-a-plugin/

29 mag 2017 11:21:49
1

Puoi aggiungere un editor di testo avanzato anche per gli estratti, inserisci il seguente codice nel file del plugin o nel file functions.php del tema e sarai in grado di vedere un editor HTML per gli estratti. Inoltre, renderà gli estratti anche in formato HTML. #saluti

Ho copiato questo codice da qualche parte ma non ricordo la fonte. Lo uso in tutti i miei progetti e funziona perfettamente.

Modifica: Questo codice è stato copiato dalla risposta del 2012 di fuxia Aggiungere un editor di testo avanzato all'Estratto

Anteprima editor HTML per estratti

/**
  * Sostituisce l'editor predefinito per gli estratti con TinyMCE.
*/
add_action( 'add_meta_boxes', array ( 'T5_Richtext_Excerpt', 'switch_boxes' ) );
class T5_Richtext_Excerpt
{
    /**
     * Sostituisce le meta box.
     *
     * @return void
     */
    public static function switch_boxes()
    {
        if ( ! post_type_supports( $GLOBALS['post']->post_type, 'excerpt' ) )
        {
            return;
        }

        remove_meta_box(
            'postexcerpt', // ID
            '',            // Schermata, vuoto per supportare tutti i tipi di post
            'normal'      // Contesto
        );

        add_meta_box(
            'postexcerpt2',     // Riutilizzare semplicemente 'postexcerpt' non funziona.
            __( 'Estratto' ),  // Titolo
            array ( __CLASS__, 'show' ), // Funzione di visualizzazione
            null,              // Schermata, usiamo tutte le schermate con meta box.
            'normal',          // Contesto
            'core',            // Priorità
        );
    }

    /**
     * Output per la meta box.
     *
     * @param  object $post
     * @return void
     */
    public static function show( $post )
    {
        ?>
        <label class="screen-reader-text" for="excerpt"><?php
        _e( 'Estratto' )
        ?></label>
        <?php
            // Usiamo il nome predefinito, 'excerpt', così non dobbiamo preoccuparci
            // del salvataggio, altri filtri ecc.
            wp_editor(
                self::unescape( $post->post_excerpt ),
                'excerpt',
                array (
                    'textarea_rows' => 15,
                    'media_buttons' => FALSE,
                    'teeny'         => TRUE,
                    'tinymce'       => TRUE
                )
            );
    }

    /**
     * L'estratto è solitamente escapato. Questo rompe l'editor HTML.
     *
     * @param  string $str
     * @return string
     */
    public static function unescape( $str )
    {
        return str_replace(
            array ( '&lt;', '&gt;', '&quot;', '&amp;', '&nbsp;', '&amp;nbsp;' ),
                array ( '<',    '>',    '"',      '&',     ' ', ' ' ),
                $str
        );
    }
}
7 apr 2019 03:18:36
Commenti

Grazie, @peter-wooster per la modifica.

Mayur Chauhan Mayur Chauhan
22 nov 2021 02:07:52