Search code examples
htmlwordpressstrip

Wordpress html tags strip on manual excerpt


I have tried to make links, br and italics tags works on manual excerpt but no luck, no the excerpt breaks. I have tried many differents codes like the proposed in http://bacsoftwareconsulting.com/blog/index.php/wordpress-cat/how-to-preserve-html-tags-in-wordpress-excerpt-without-a-plugin/ and nothing, now I have this code:

    function wp_trim_all_excerpt($text) {
global $post;
$raw_excerpt = $text;
//Add the allowed HTML tags separated by a comma
$excerpt_length = apply_filters('excerpt_length', 150000);
$text = wp_trim_words( $text, $excerpt_length ); //since wp3.3
$allowed_tags = '<p>,<a>,<em>,<strong>,<i>,<br>';
$text = strip_tags($text, $allowed_tags);

return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); //since wp3.3
}

remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'wp_trim_all_excerpt');

but the $allowed_tags doesn't save anything, I think cause I have the wp_trim but I have played with it for hours an nothing, I also try the advanced excerpt plugin and I activated excerpt in pages, but, don't know why, there html works.

Any idea?


Solution

  • The solution above still has a limitatioṅ, because some HTML tags occur in pairs. If an excerpt contains an opening tag but not the corresponding closing tag, then the rest of the web page is likely to be formatted incorrectly.

    This code checks the excerpt for such tags and adds closing tags as needed:

    <?php
    /******************************************************************************
    * @Author: Richard Chonak
    * @Date:   August 6, 2013
    * @Description: Ensures closure of HTML tags opened in an automatically generated excerpt.
    * Also trims off any trailing incomplete HTML tag at the end of the excerpt.
    * @Tested: Up to WordPress version 3.6
    *
    * @Author: Boutros AbiChedid 
    * @Date:   June 20, 2011
    * @Websites: http://bacsoftwareconsulting.com/ ; http://blueoliveonline.com/
    * @Description: Preserves HTML formating to the automatically generated Excerpt.
    * Also Code modifies the default excerpt_length and excerpt_more filters.
    * @Tested: Up to WordPress version 3.1.3
    *******************************************************************************/
    function custom_wp_trim_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 = '<img>,<small>,<strong>,<em>,<b>,<i>,<p>,<br>,<a>,<blockquote>,<ul>,<li>'; /*** MODIFY THIS. Add the allowed HTML tags separated by a comma.***/
        $twopart_tags = '<small>,<strong>,<em>,<b>,<i>,<p>,<br>,<a>,<blockquote>,<ul>,<li>'; /*** MODIFY THIS. Add the twopart HTML tags separated by a comma.***/
        /* turn tag list into one big search pattern */
        $search_patterns = "/" . str_replace(",","|",str_replace(">", "[^>]*>",$twopart_tags)) . '/';
    
        $text = strip_tags($text, $allowed_tags);
    
        $excerpt_word_count = 200; /*** 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);
        };
    
    
        /* if fragment ends in open tag, trim off */
        preg_replace ("/<[^>]*$/", "", $text);
    
        /* search for tags in excerpt */
        preg_match_all ($search_patterns, $text, $matches);
        /* if any tags found, check for matching pairs */
        $tagstack = array (""); 
        $tagsfound = $matches[0];
        while ( count ($tagsfound) > 0) {
            $tagmatch = array_shift($tagsfound);
        /* if it's a closing tag, hooray; but if it's not, then look for the closer */
            if ( !strpos($tagmatch,"</") && !strpos ($tagmatch,"/>") ) {
          preg_match("/\pL+/",$tagmatch, $tagwords);
              $endtag = "</" . $tagwords[0] . ">";
              /* if this tag was not closed, put the closing tag on the stack */
              if (!in_array($endtag, $tagsfound) ) {
            array_push($tagstack,$endtag);
              };
            };
        };
    
        /* if any unbalanced tags were found, add the closing tags */
        while (count ($tagstack) > 1) {
        $text = $text . array_pop($tagstack);
        }
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
    }
    remove_filter('get_the_excerpt', 'wp_trim_excerpt');
    add_filter('get_the_excerpt', 'custom_wp_trim_excerpt');
    ?>