Minify HTML, JavaScript và CSS trong WordPress mà không cần plugin.
Sử dụng quá nhiều plugin trên blog/ website WordPress không bao giờ là một ý tưởng tốt. Bởi vì chúng ta đều biết rằng các hacker có thể dễ dàng tấn công blog/ website WordPress của bạn thông qua việc khai thác lỗ hổng từ plugin. Tại sao không cố gắng để giảm bớt sự phụ thuộc vào các plugin? Một số tính năng hữu ích có thể được bổ sung dễ dàng bằng cách thêm code snippets vào file function.php của theme mà bạn đang sử dụng. Bao gồm cả thủ thuật độc đáo sau đây để minify HTML, CSS và JavaScript.
Tham khảo thêm:
- Top 4 plugins minify dữ liệu tốt nhất cho WordPress
- Làm thế nào để giảm bớt HTTP requests cho WordPress?
Giảm bớt hay minify HTML, JavaScript và CSS về cơ bản là giảm kích thước của các tập tin. Từ đó, chúng sẽ nhỏ hơn, nhẹ hơn và load nhanh hơn, giúp cải thiện tốc độ hiển thị nội dung trên trình duyệt web. Việc minify dữ liệu về cơ bản là khá đơn giản. Bạn chỉ cần tìm cách loại bỏ các vùng không gian trống, tham số và comments của JavaScript, CSS, HTML là được. Chức năng minify có thể được tìm thấy trong một số plugin như WP-Minify hay Autoptimize. Nếu đang sử dụng plugin W3 Total Cache, bạn cũng chỉ cần vài thao tác đơn giản để kích hoạt tính năng này. Nhưng chúng ta đang cố gắng hạn chế sự phụ thuộc vào plugin. Vậy nên, điều chúng ta cần là một phương pháp để thay thế.
Minify HTML, JavaScript và CSS trong WordPress
Trên thực tế, các bạn có thể làm điều này một cách dễ dàng mà không cần đến plugin. Tất cả những gì bạn cần làm là copy và paste đoạn code sau đây vào file functions.php của theme mà bạn đang sử dụng.
class WP_HTML_Compression
{
// Settings
protected $compress_css = true;
protected $compress_js = true;
protected $info_comment = true;
protected $remove_comments = true;</p>
<p> // 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);</p>
<p> $savings = ($raw-$compressed) / $raw * 100;</p>
<p> $savings = round($savings, 2);</p>
<p> 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;</p>
<p> $content = $token[0];</p>
<p> 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;</p>
<p> // 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;</p>
<p> // Remove any empty attributes, except:
// action, alt, content, src
$content = preg_replace('/(\s+)(\w++(?<!\baction|\balt|\bcontent|\bsrc)="")/', '$1', $content);</p>
<p> // Remove any space before the end of self-closing XHTML tags
// JavaScript excluded
$content = str_replace(' />', '/>', $content);
}
}
}</p>
<p> if ($strip)
{
$content = $this->removeWhiteSpace($content);
}</p>
<p> $html .= $content;
}</p>
<p> return $html;
}</p>
<p> public function parseHTML($html)
{
$this->html = $this->minifyHTML($html);</p>
<p> if ($this->info_comment)
{
$this->html .= "\n" . $this->bottomComment($html, $this->html);
}
}</p>
<p> protected function removeWhiteSpace($str)
{
$str = str_replace("\t", ' ', $str);
$str = str_replace("\n", '', $str);
$str = str_replace("\r", '', $str);</p>
<p> while (stristr($str, ' '))
{
$str = str_replace(' ', ' ', $str);
}</p>
<p> return $str;
}
}</p>
<p>function wp_html_compression_finish($html)
{
return new WP_HTML_Compression($html);
}</p>
<p>function wp_html_compression_start()
{
ob_start('wp_html_compression_finish');
}
add_action('get_header', 'wp_html_compression_start');
Nếu code bị lỗi, các bạn có thể download file text tại đây về máy tính để xem chi tiết.
Để kiểm tra xem liệu các chức năng minify có thực sự hoạt động hay không, các bạn chỉ cần view source (Ctrl + U) của blog/ website. Ở cuối mã nguồn, các bạn sẽ thấy thông báo trông như thế này:
<!–-HTML compressed, size saved …%. From …bytes, now …bytes-–>
Đơn giản vậy thôi. Chúc các bạn thành công!
Nếu bạn thích bài viết này, hãy subscribe blog của tôi để thường xuyên cập nhật những bài viết hay nhất, mới nhất qua email nhé. Cảm ơn rất nhiều. :)
Đang tìm thì vớ được, sẽ đem cái này vào theme.
Cũng đưa khung comment lên trên rồi ạ :P
Anh đang tiến hành một số thay đổi để nâng cao trải nghiệm người dùng. :P
theme cuả mình nặng quá , chỉnh sao vẫn chậm
Mình sử dụng WP Rocket có hơn gì k nhỉ?
WP Rocket cũng có chức năng nén như này mà :D hơn ở chỗ ko cần phải làm thêm gì cho mất công :D
Code này bỏ vào trong thẻ PHP là được nhé mọi người bỏ ngoài là bị lỗi. Bác up code mà không chỉ mọi người nhé :(
Mình cũng đang dùng code của bạn để nén, thấy xài ổn hơn plugin Autoptimize đó. Thanks bạn !!
Kaka, dùng đoạn code bạn đưa có vẻ hay, mình đang áp dụng và chạy thấy cũng tạm ổn hơn plugin.
Thanks thớt.
thôi xong chèn xong code thì lỗi 500 k còn gì để khóc cán bộ xem có lỗi gì không
Nếu lỗi thì bạn vào Files Manager của cPanel/ DirectAdmin hoặc FTP, mở file functions.php của theme ra và xóa đoạn code vừa chèn vào là được. :P
Website anh Hiếu đang xài chức năng nén css và javascript là plugin hay cùng code vậy anh!
Mình không dùng code cũng không dùng plugin bạn nhé. Mình nén theo phương pháp thủ công. :)
Vô tình đọc được cả 2 bài :))
Nhưng mình thêm code vào function rồi nhưng bị lỗi.hay tại up lên WP 4.0 nhỉ
Chắc do mình paste code nó bị lỗi đó bạn. Nếu bị lỗi, bạn có thể download file text này về để xem: http://dvslabs.googlecode.com/files/minifier-script-en.txt
ok, để mình test lại thử :3
Lần này đảm bảo thành công 100% luôn. :D
Mình không làm được dù đã down file của bạn. Khi thêm vào web nó trắng xóa ko có 1 mã HTML nào cả :(
Nếu vậy thì có lẽ bạn nên sử dụng plugin sẽ tốt hơn. Bạn có thể tìm plugin HTML Minify. :-P
mình cũng viết một bài về minify, hình như thấy hơi giông giống :D
Bài của mình đăng lâu rồi mà. Từ hôm 4/6. :D