Permitir HTML no trecho

56

Aqui está o meu código de trecho.

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

Como permito html como <a> <b> <i> <br>

user32447
fonte

Respostas:

125

GUIA COMPLETO DE PERCERTOS

Recentemente, respondi a algumas perguntas sobre trechos, por isso darei uma explicação detalhada sobre o máximo que puder.

PREFÁCIO

Parece haver algumas perguntas decorrentes desta resposta sobre onde o código deve ir, e a resposta é: depende realmente de você e como você achar melhor. Existem algumas opções em que você pode colocar o código (se não explicitamente indicado):

  • No arquivo functions.php do seu tema, use qualquer arquivo de funções. Lembre-se de quando você fizer isso, se o tema não for seu, todas as alterações serão perdidas quando você atualizar seu tema

  • Uma maneira melhor seria usar o código em um tema filho. Como acima, no arquivo functions.php ou relacionado às funções

  • Use o código em um plugin. Essa é a maneira preferida, pois disponibiliza o código em todos os temas. Se você alternar temas, não precisará se preocupar em reescrever o mesmo código.

Espero que isso esclareça as coisas um pouco :-)

TAGS / FORMATO DO HTML

the_excerpt()Antes de tudo, não aceita nenhum parâmetro; portanto, nada pode ser passado para ele. É um fato que the_excerpt()apara o conteúdo em 55 palavras e todas as tags HTML são removidas antes de retornar o texto. the_excerpt()está localizado em wp-includes / post-template.php . Para permitir determinadas ou todas as tags HTML no trecho, um novo trecho deve ser criado.

Primeiro, a função original precisa ser removida primeiro e, em seguida, a nova função precisa ser conectada get_the_excerpt. Observe que este novo trecho ainda poderá ser chamado como the_excerpt()nos arquivos de modelo, sem necessidade de alterar isso. get_the_excerpt()está localizado em wp-includes / post-template.php .

O trecho é usado wp_trim_excerptpara retornar o texto aparado; portanto, precisamos wp_trim_excerptprimeiro remover o filtro do trecho. wp_trim_excerpt()está localizado em wp-includes / formatting.php , linha 2355. É assim:

remove_filter('get_the_excerpt', 'wp_trim_excerpt');

Agora você pode adicionar seu novo trecho a get_the_excerpt

add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt');

Para permitir tags / formatação html, precisaremos especificar quais tags você precisará permitir. Você pode usar a seguinte strip_tagsdeclaração para conseguir isso

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

O segundo argumento wpse_allowedtags()é uma pequena função usada para adicionar as tags the_excerpt()permitidas. Para obter uma lista completa de tags HTML 5 válidas, vá e confira aqui . Aqui está a função, adicione tags HTML a isso que você precisa permitir / manter

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

Se você precisar permitir todas as tags HTML, ou seja, nenhuma remoção de nenhuma tag, a strips_tags()função poderá ser omitida / removida completamente.

Um ponto a ser observado, no entanto, quando as tags html são permitidas, essas tags são contadas como palavras; portanto, sua contagem de palavras para trechos com tags e sem tags não será a mesma. Para corrigir isso, você precisará remover essas tags da contagem real de palavras primeiro, para que apenas as palavras sejam contadas.

Escrevi um trecho que permitirá todas as tags, conte apenas palavras como palavras e complete uma frase após a quantidade definida de palavras (para que o texto não seja aparado no meio da frase) e adicione mais um texto após a última palavra .

Aqui está o 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'); 

Você pode simplesmente remover o '//' das funções que você precisa extra.

COMPRIMENTOS COM EXCERTOS PERSONALIZADOS

Às vezes, você precisa exibir trechos simples de diferentes comprimentos e não é viável escrever um trecho para cada post / função / página. Aqui está uma pequena função agradável 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>');
}

O que essa pequena função faz é pegar get_the_excerpt, aparar para $limitdefinir pelo usuário e retornar o texto com um link leia mais no final.

Você pode chamar esse trecho da seguinte forma no seu modelo

echo wpse_custom_excerpts($limit);

onde $limitserá sua contagem de palavras, então um trecho de 30 palavras será

echo wpse_custom_excerpts(30);

Apenas uma coisa a lembrar aqui, se você definir seu limite para mais de 55 palavras, apenas 55 serão retornadas, pois o trecho terá apenas 55 palavras. Se forem necessários trechos mais longos, use-o get_the_content.

COMPRIMENTO EXCERTO PERSONALIZADO

Se você apenas precisar alterar o comprimento the_excerpt(), poderá usar a seguinte função

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

Lembre-se de que você precisará definir uma prioridade maior que 10 para que sua função personalizada seja executada após o padrão.

ADICIONAR LEIA MAIS LINK

Todo o texto retornado pelo trecho tem o ódio [...]no final que não é clicável. Para adicionar um texto para ler mais no lugar dos hellips, use esta função

 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

Trecho do primeiro parágrafo

Eu quero manter isso completo, então aqui está o trecho que apara após o primeiro parágrafo.

Aqui está uma função que mantém as tags HTML intactas, adiciona um link "Leia mais" no final do trecho e apara o trecho após o primeiro parágrafo.

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

EDIT 29-10-2015

Para qualquer pessoa que precise de uma solução alternativa para não exibir o link ler mais após o trecho, quando o trecho for menor que a quantidade de palavras definida, consulte a seguinte pergunta e resposta

Pieter Goosen
fonte
onde exatamente eu colocar esta parte function wpse_allowedtags() { // Add custom tags to this string return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; }im confuso
user32447
11
Todo esse código entra functions.php. Você pode adicionar que um pouco acima if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) :da suafunctions.php
Pieter Goosen
11
NVM eu perdi a parte superior do código
user32447
11
se isso for incluído no arquivo functions.php, isso não será substituído quando uma atualização aparecer?
Mcgrailm
3
@mcgrailm sim, seria. É por isso que é importante adicionar isso ao functions.php dos temas do seu filho . Você mesmo pode adicioná-lo a um plugin deve usar
Pieter Goosen
1

Adicione mais tags se precisar $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
fonte
0

Você também pode adicionar um editor de texto rico para trechos, adicionar o código abaixo no arquivo do plug-in ou no arquivo function.php do tema e poderá ver o editor HTML para trechos. Além disso, ele renderizará trechos no formato HTML também. #Felicidades

Eu copiei isso de algum lugar, mas não me lembro da fonte. Estou usando isso em todos os meus projetos e está funcionando.

insira a descrição da imagem aqui

/**
  * 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
fonte