0

I'm trying to optimize my page load on my WP site. I've copied a custom function (can't remember where I pulled it from) to optimize my pages.

Things that it can are the following:

  • move javascript to footer
  • put css links on header
  • collapse white spaces
  • removes html comments

The function serves it purpose well, but when I install and activate WordPress SEO plugin (v2.2.1), the custom function does not minify my html page anymore.

The custom code I'm talking about is this:

class WP_HTML_Compression
{
    // Settings
    protected $compress_css = true;
    protected $compress_js = true;
    protected $info_comment = true;
    protected $remove_comments = true;

    // Variables
    protected $html;
    public function __construct($html)
    {
     if (!empty($html))
     {
       $this->parseHTML($html);
     }
    }
    public function __toString()
    {
     return $this->html;
    }
    protected function bottomComment($raw, $compressed)
    {
     $raw = strlen($raw);
     $compressed = strlen($compressed);

     $savings = ($raw-$compressed) / $raw * 100;

     $savings = round($savings, 2);

     return '<!--HTML compressed, size saved '.$savings.'%. From '.$raw.' bytes, now '.$compressed.' bytes-->';
    }
    protected function minifyHTML($html)
    {
     $pattern = '/<(?<script>script).*?<\/script\s*>|<(?<style>style).*?<\/style\s*>|<!(?<comment>--).*?-->|<(?<tag>[\/\w.:-]*)(?:".*?"|\'.*?\'|[^\'">]+)*>|(?<text>((<[^!\/\w.:-])?[^<]*)+)|/si';
     preg_match_all($pattern, $html, $matches, PREG_SET_ORDER);
     $overriding = false;
     $raw_tag = false;
     // Variable reused for output
     $html = '';
     foreach ($matches as $token)
     {
       $tag = (isset($token['tag'])) ? strtolower($token['tag']) : null;

       $content = $token[0];

       if (is_null($tag))
       {
         if ( !empty($token['script']) )
         {
           $strip = $this->compress_js;
         }
         else if ( !empty($token['style']) )
         {
           $strip = $this->compress_css;
         }
         else if ($content == '<!--wp-html-compression no compression-->')
         {
           $overriding = !$overriding;

           // Don't print the comment
           continue;
         }
         else if ($this->remove_comments)
         {
           if (!$overriding && $raw_tag != 'textarea')
           {
             // Remove any HTML comments, except MSIE conditional comments
             $content = preg_replace('/<!--(?!\s*(?:\[if [^\]]+]|<!|>))(?:(?!-->).)*-->/s', '', $content);
           }
         }
       }
       else
       {
         if ($tag == 'pre' || $tag == 'textarea')
         {
           $raw_tag = $tag;
         }
         else if ($tag == '/pre' || $tag == '/textarea')
         {
           $raw_tag = false;
         }
         else
         {
           if ($raw_tag || $overriding)
           {
             $strip = false;
           }
           else
           {
             $strip = true;

             // Remove any empty attributes, except:
             // action, alt, content, src
             $content = preg_replace('/(\s+)(\w++(?<!\baction|\balt|\bcontent|\bsrc)="")/', '$1', $content);

             // Remove any space before the end of self-closing XHTML tags
             // JavaScript excluded
             $content = str_replace(' />', '/>', $content);
           }
         }
       }

       if ($strip)
       {
         $content = $this->removeWhiteSpace($content);
       }

       $html .= $content;
     }

     return $html;
    }

    public function parseHTML($html)
    {
     $this->html = $this->minifyHTML($html);

     if ($this->info_comment)
     {
       $this->html .= "\n" . $this->bottomComment($html, $this->html);
     }
    }

    protected function removeWhiteSpace($str)
    {
     $str = str_replace("\t", ' ', $str);
     $str = str_replace("\n",  '', $str);
     $str = str_replace("\r",  '', $str);

     while (stristr($str, '  '))
     {
       $str = str_replace('  ', ' ', $str);
     }

     return $str;
    }
}

function wp_html_compression_finish($html)
{
    return new WP_HTML_Compression($html);
}

function wp_html_compression_start()
{
    ob_start('wp_html_compression_finish');
}
add_action('get_header', 'wp_html_compression_start');

Using this function in my function.php reduces my page size to almost 5%.

  • 1
    No offence but after 10 sec. googling it showed that your code is from setuix.com, did you ask Damian de Costa already also? He is the dev/auhtor of that function and they even help out on their forum. Not meaning by that that nobody can/will help you here but just out of curiosity asking. – Charles Jun 19 '15 at 1:44
  • There are caching plugins that will accomplish what you are trying to do plus a lot more. I would consider using one of those. Regarding the problem at hand, Yoast also attaches an output buffer to the get_header action. Output buffers are stackable so that shouldn't cause an issue, but I would still try using a higher or lower priority on your call to add_action. – Mathew Tinsley Jun 19 '15 at 6:32
  • @mtinsley < I plan to use mod_pagespeed so I resorted to use the code instead. Furthermore, I already have too many plugins that slows down my admin dashboard. – Kupalzky Jun 19 '15 at 9:38
-2

We got it working by changing the hook:

add_action( 'wp_loaded', 'wp_html_compression_start' );
  • Hi fjorge, welcome to WPSE and thanks for your answer. Could you expand a little more to help others understand why this works, and perhaps how you came to the solution? Btw please feel free to take the site tour and check out How do I write a good answer? to learn more. – Tim Malone May 24 '16 at 0:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.