-
-
Save wordpressvn/28420db96041942443d4fb6b5bd7a429 to your computer and use it in GitHub Desktop.
WordPress Minifier
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* W3C Fix and HTML minifier | |
* Nobody knows how this work, so don't touch it!!! | |
* | |
* https://wordpress.stackexchange.com/a/227896/129134 | |
* https://stackoverflow.com/a/41148695 | |
*/ | |
add_action('wp_loaded', 'outputBufferStart'); | |
add_action('shutdown', 'outputBufferEnd'); | |
function outputBufferStart() | |
{ | |
ob_start("minify"); | |
} | |
function outputBufferEnd() | |
{ | |
ob_get_clean(); | |
} | |
/** | |
* Minify HTML output. | |
*/ | |
function minify($buffer) | |
{ | |
if (!is_admin() && !(defined('DOING_AJAX') && DOING_AJAX)) { | |
// Remove type from Javascript and CSS. | |
$buffer = preg_replace("%[ ]type=[\'\"]text\/(javascript|css)[\'\"]%", '', $buffer); | |
// Add alt attribute to images where not exists. | |
$buffer = preg_replace('%(<img(?!.*?alt=([\'"]).*?\2)[^>]*?)(/?>)%', '$1 alt="" $3', $buffer); | |
$buffer = preg_replace('%\s+alt="%', ' alt="', $buffer); | |
// Clear <head> tag. | |
$buffer = preg_replace_callback('/(?=<head(.*?)>)(.*?)(?<=<\/head>)/s', 'cleanHTML', $buffer); | |
// Clear <body>. | |
$buffer = preg_replace_callback('/(?=<body(.*?)>)(.*?)(?<=<\/body>)/s', 'cleanHTML', $buffer); | |
// Clear <scripts> | |
$buffer = preg_replace_callback('/(?=<script(.*?)>)(.*?)(?<=<\/script>)/s', 'cleanJavascript', $buffer); | |
// Clear <styles> | |
$buffer = preg_replace_callback('/(?=<style(.*?)>)(.*?)(?<=<\/style>)/s', 'cleanCSS', $buffer); | |
// Clean between <head> and <body> tags. | |
$buffer = preg_replace("%</head>([\s\t\n\r]+)<body%", '</head><body', $buffer); | |
// Clean between body and <html> tags. | |
$buffer = preg_replace("%</body>([\s\t\n\r]+)</html>%", '</body></html>', $buffer); | |
// Clean between <html> and <head> | |
$buffer = preg_replace("%<html(.*?)>([\s\t\n\r]+)<head%", '<html$1><head', $buffer); | |
} | |
return $buffer; | |
} | |
/** | |
* Clean HTML. | |
*/ | |
function cleanHTML($matches) | |
{ | |
return preg_replace([ | |
'/<!--(?!\s*(?:\[if [^\]]+]|<!|>))(?:(?!-->).)*-->/s', | |
'/\>[^\S ]+/s', | |
'/[^\S ]+\</s', | |
'/\>\s+\</', | |
], ['', '>', '<', '><'], $matches[2]); | |
} | |
/** | |
* Clean scripts. | |
*/ | |
function cleanJavascript($matches) | |
{ | |
return preg_replace([ | |
'@\/\*(.*?)\*\/@s', | |
'@((^|\t|\s|\r)\/{2,}.+?(\n|$))@s', | |
'@(\}(\n|\s+)else(\n|\s+)\{)@s', | |
'@((\)\{)|(\)(\n|\s+)\{))@s', | |
'@(\}(\n+|\t+|\s+)else\sif(\s+|)\()@s', | |
'@(if|for|while|switch|function)\(@s', | |
'@\s+(\={1,3}|\:)\s+@s', | |
'@\$\((.*?)\)@s', | |
'@(if|while)\s\((.*?)\)\s\{@s', | |
'@function\s\(\s+\)\s{@s', | |
'@(\n{2,})@s', | |
'@([\r\n\s\t]+)(,)@s', | |
'@([\r\n\s\t]+)?([;,{}()]+)([\r\n\s\t]+)?@', | |
], [ | |
"\n", | |
"\n", | |
'}else{', | |
'){', | |
'}else if(', | |
"$1(", | |
" $1 ", | |
'$' . "($1)", | |
"$1 ($2) {", | |
'function(){', | |
"\n", | |
',', | |
"$2", | |
], $matches[2]); | |
} | |
/** | |
* Clean styles. | |
*/ | |
function cleanCSS($matches) | |
{ | |
return preg_replace([ | |
'/([.#]?)([a-zA-Z0-9,_-]|\)|\])([\s|\t|\n|\r]+)?{([\s|\t|\n|\r]+)(.*?)([\s|\t|\n|\r]+)}([\s|\t|\n|\r]+)/s', | |
'/([0-9a-zA-Z]+)([;,])([\s|\t|\n|\r]+)?/s', | |
'@([\r\n\s\t]+)?([;:,{}()]+)([\r\n\s\t]+)?@', | |
], [ | |
'$1$2{$5} ', | |
'$1$2', | |
"$2", | |
], $matches[2]); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment