Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Minify HTML for WordPress without a Plugin - Add to function.php
<?php
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');
?>
@Cerberus27

This comment has been minimized.

Copy link

Cerberus27 commented Nov 10, 2015

Hey Seth, works like a charm and compresses HTML, but I've noticed it disables Revolution Slider from displaying. Any thoughts?

@vasanthdeveloper

This comment has been minimized.

Copy link

vasanthdeveloper commented Dec 18, 2017

That's Awesome!
Thank You 🥇

@jdgranja

This comment has been minimized.

Copy link

jdgranja commented Feb 4, 2018

That's works! Thanks.

@gchoyal

This comment has been minimized.

Copy link

gchoyal commented Feb 15, 2018

Working gratefully .. Thanks a lot!

@abhi21x

This comment has been minimized.

Copy link

abhi21x commented Mar 5, 2018

Working great Seth. Thanks!

@ChrisButterworth

This comment has been minimized.

Copy link

ChrisButterworth commented Mar 8, 2018

Life saver!!

@levizimmerman

This comment has been minimized.

Copy link

levizimmerman commented Mar 12, 2018

It only compresses HTML in <head> element

@maycomayco

This comment has been minimized.

Copy link

maycomayco commented Jul 4, 2018

Works fine but i have problems in some premium templates.
Excellent!

@zakirsajib

This comment has been minimized.

Copy link

zakirsajib commented Nov 22, 2018

Works for me.

@waqaransari

This comment has been minimized.

Copy link

waqaransari commented Dec 7, 2018

Really help full.

@saidqb

This comment has been minimized.

Copy link

saidqb commented Mar 18, 2019

nice effort for make this code, thank's

@docdrue

This comment has been minimized.

Copy link

docdrue commented Apr 24, 2019

Thanks. It's a good one but aint working on https( Is any ideas what it cant be?

@SHABU89

This comment has been minimized.

Copy link

SHABU89 commented Jun 27, 2019

It was removing the schema added to html is there any possibility to do without affecting schema ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.