Permitir HTML en extracto

56

Aquí está mi código de extracto.

// Generate custom excerpt length
function wpbx_excerpt_length($length) {
    return 300;
}
add_filter('excerpt_length', 'wpbx_excerpt_length');

¿Cómo permito html como <a> <b> <i> <br>

usuario32447
fuente

Respuestas:

125

GUÍA COMPLETA DE EXTRACTOS

Recientemente he respondido algunas preguntas sobre extractos, así que voy a dar una explicación detallada que cubra todo lo que pueda.

PREFACIO

Parece que hay un par de preguntas que surgen de esta respuesta sobre dónde debe ir el código, y la respuesta es que realmente depende de usted y cómo lo considere conveniente. Hay un par de opciones donde puede colocar el código (si no se indica explícitamente):

  • En las funciones de tu tema.php o cualquier archivo, utilízalo como archivo de funciones. Solo recuerde cuando haga esto, si el tema no es suyo, todos los cambios se perderán cuando actualice su tema

  • Una mejor manera sería usar el código en un tema secundario. Como arriba, en el archivo functions.php o funciones relacionadas

  • Use el código en un complemento. Esta es la forma preferida, ya que hace que el código esté disponible en todos los temas. Si cambia de tema, no tiene que preocuparse por reescribir el mismo código.

Espero que esto aclare las cosas un poco :-)

Etiquetas HTML / formato

the_excerpt()en primer lugar no acepta ningún parámetro, por lo que no se le puede pasar nada. Es un hecho que the_excerpt()recorta el contenido a 55 palabras, y todas las etiquetas HTML se eliminan antes de devolver el texto. the_excerpt()se encuentra en wp-includes / post-template.php . Para permitir ciertas o todas las etiquetas HTML en el extracto, se debe crear un nuevo extracto.

En primer lugar, la función original debe eliminarse primero, y luego la nueva función debe conectarse get_the_excerpt. Tenga en cuenta que este nuevo extracto seguirá siendo invocable como the_excerpt()en los archivos de plantilla, no es necesario cambiar eso. get_the_excerpt()se encuentra en wp-includes / post-template.php .

El extracto se utiliza wp_trim_excerptpara devolver el texto recortado, por lo que debemos eliminarlo wp_trim_excerptprimero del filtro de extracto. wp_trim_excerpt()se encuentra en wp-includes / formatting.php , línea 2355. Así es como:

remove_filter('get_the_excerpt', 'wp_trim_excerpt');

Ahora puede agregar su nuevo extracto a get_the_excerpt

add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt');

Para permitir el formato / etiquetas html, necesitaremos especificar qué etiquetas deberá permitir. Puede usar la siguiente strip_tagsdeclaración para lograr eso

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

El segundo argumento wpse_allowedtags()es una pequeña función que se usa para agregar las etiquetas the_excerpt()que permitirá. Para obtener una lista completa de etiquetas HTML 5 válidas, vaya y compruébelo aquí . Aquí está la función, agregue cualquier etiqueta html a esto que necesite permitir / mantener

function wpse_allowedtags() {
// Add custom tags to this string
    return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; 
}

Si necesita permitir todas las etiquetas HTML, es decir, sin quitar ninguna etiqueta, la strips_tags()función se puede omitir / eliminar por completo.

Sin embargo, un punto a tener en cuenta, cuando se permiten etiquetas html, estas etiquetas se cuentan como palabras, por lo que su recuento de palabras para extractos con etiquetas y sin etiquetas no será el mismo. Para corregir eso, primero deberá eliminar estas etiquetas del recuento de palabras real para que solo se cuenten las palabras.

He escrito un extracto que permitirá todas las etiquetas, contará solo las palabras como palabras y completará una oración después de la cantidad establecida de palabras (para que el texto no se recorte a mitad de la oración) y agregue un texto de leer más después de la última palabra .

Aquí está el código completo.

function wpse_allowedtags() {
    // Add custom tags to this string
        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()); /*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 = 75;
                $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_length && 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 = ' <a href="'. esc_url( get_permalink() ) . '">' . '&nbsp;&raquo;&nbsp;' . sprintf(__( 'Read more about: %s &nbsp;&raquo;', '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_more; /*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'); 

Simplemente puede eliminar el '//' de las funciones que necesita extra.

LONGITUDES DE EXTRACTO PERSONALIZADAS

A veces es necesario mostrar extractos simples de diferentes longitudes y no es viable escribir un extracto para cada publicación / función / página. Aquí hay una pequeña y bonita función usandowp_trim_words

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

Lo que hace esta pequeña función es tomarla get_the_excerpt, recortarla para $limitque el usuario la configure y devolver el texto con un enlace de leer más al final.

Puedes llamar a este extracto como sigue en tu plantilla

echo wpse_custom_excerpts($limit);

¿Dónde $limitestará su número de palabras, por lo que un extracto de 30 palabras será

echo wpse_custom_excerpts(30);

Solo una cosa para recordar aquí, si establece su límite en más de 55 palabras, solo se devolverán 55 palabras ya que el extracto tiene solo 55 palabras de longitud. Si se necesitan extractos más largos, use get_the_contenten su lugar.

LONGITUD DE EXTRACTO PERSONALIZADO

Si solo necesita modificar la longitud de the_excerpt(), puede usar la siguiente función

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

Recuerde, deberá establecer una prioridad mayor que 10 para que su función personalizada se ejecute después de la predeterminada.

AGREGAR LEER MÁS ENLACE

Todo el texto devuelto por el extracto tiene [...]el final al que no se puede hacer clic. Para agregar un texto de leer más en lugar de los infiernos, use esta función

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

EDITAR

Extracto del primer párrafo

Quiero mantener esto completo, así que aquí está el extracto que se recorta después del primer párrafo.

Aquí hay una función que mantiene intactas las etiquetas HTML, agrega un enlace "Leer más" al final del extracto y recorta el extracto después del primer párrafo.

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(__( 'Read more about: %s &nbsp;&raquo;', 'pietergoosen' ), get_the_title()) . '</a>'; 
            $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); 

            //$pos = strrpos($wpse0001_excerpt, '</');
            //if ($pos !== false)
            // Inside last HTML tag
            //$wpse0001_excerpt = substr_replace($wpse0001_excerpt, $excerpt_end, $pos, 0);
            //else
            // After the content
            $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');

EDITAR 29-10-2015

Para cualquiera que necesite una solución alternativa para no mostrar el enlace leer más después del extracto cuando el extracto es más corto que la cantidad de palabras establecida, consulte la siguiente pregunta y respuesta

Pieter Goosen
fuente
¿Dónde exactamente function wpse_allowedtags() { // Add custom tags to this string return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; }
coloco
1
Todo este código entra functions.php. Puede agregar eso justo arriba if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) :en sufunctions.php
Pieter Goosen
1
nvm me perdí la parte superior del código
user32447
1
si esto entra en el archivo functions.php, ¿no se sobrescribirá cuando aparezca una actualización?
mcgrailm
3
@mcgrailm sí lo haría. Por eso es importante agregar esto a las funciones.php de sus temas secundarios . Incluso puede agregarlo a un complemento de uso obligatorio
Pieter Goosen
1

Agregue más etiquetas si necesita $allowed_tags = ...

function _20170529_excerpt($text) {
$raw_excerpt = $text;
if ( '' == $text ) {
    //Retrieve the post content. 
    $text = get_the_content('');

    //Delete all shortcode tags from the content. 
    $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; /*** MODIFY THIS. change the excerpt word count to any integer you like.***/
    $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count); 

    $excerpt_end = '[...]'; /*** MODIFY THIS. change the excerpt endind to something else.***/
    $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);
}

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

prosti
fuente
0

También puede agregar un editor de texto enriquecido para extractos, agregue el código a continuación en el archivo de complemento o en el archivo function.php del tema y podrá ver el editor HTML para extractos. Además, también representará extractos en formato HTML. #salud

He copiado esto de alguna parte pero no recuerdo la fuente. Estoy usando esto en todos mis proyectos y está funcionando.

ingrese la descripción de la imagen aquí

/**
  * Replaces the default excerpt editor with TinyMCE.
*/
add_action( 'add_meta_boxes', array ( 'T5_Richtext_Excerpt', 'switch_boxes' ) );
class T5_Richtext_Excerpt
{
    /**
     * Replaces the meta boxes.
     *
     * @return void
     */
    public static function switch_boxes()
    {
        if ( ! post_type_supports( $GLOBALS['post']->post_type, 'excerpt' ) )
        {
            return;
        }

        remove_meta_box(
            'postexcerpt', // ID
            '',            // Screen, empty to support all post types
            'normal'      // Context
        );

        add_meta_box(
            'postexcerpt2',     // Reusing just 'postexcerpt' doesn't work.
            __( 'Excerpt' ),    // Title
            array ( __CLASS__, 'show' ), // Display function
            null,              // Screen, we use all screens with meta boxes.
            'normal',          // Context
            'core',            // Priority
        );
    }

    /**
     * Output for the meta box.
     *
     * @param  object $post
     * @return void
     */
    public static function show( $post )
    {
        ?>
        <label class="screen-reader-text" for="excerpt"><?php
        _e( 'Excerpt' )
        ?></label>
        <?php
            // We use the default name, 'excerpt', so we don’t have to care about
            // saving, other filters etc.
            wp_editor(
                self::unescape( $post->post_excerpt ),
                'excerpt',
                array (
                    'textarea_rows' => 15,
                    'media_buttons' => FALSE,
                    'teeny'         => TRUE,
                    'tinymce'       => TRUE
                )
            );
    }

    /**
     * The excerpt is escaped usually. This breaks the HTML editor.
     *
     * @param  string $str
     * @return string
     */
    public static function unescape( $str )
    {
        return str_replace(
            array ( '&lt;', '&gt;', '&quot;', '&amp;', '&nbsp;', '&amp;nbsp;' ),
                array ( '<',    '>',    '"',      '&',     ' ', ' ' ),
                $str
        );
    }
}
Mayur Chauhan
fuente