Fast Velocity Minify - Version 2.2.9

Version Description

[2018.05.23] = * fixed several bugs related to notices, css minification and file paths * added more pcre.backtrack_limit and pcre.recursion_limit to avoid blank pages on some servers * added new option to defer the ignore list for pagespeed

Download this release

Release Info

Developer Alignak
Plugin Icon 128x128 Fast Velocity Minify
Version 2.2.9
Comparing to
See all releases

Code changes from version 2.2.8 to 2.2.9

Files changed (4) hide show
  1. fvm.php +56 -4
  2. inc/functions-serverinfo.php +23 -15
  3. inc/functions.php +20 -5
  4. readme.txt +21 -2
fvm.php CHANGED
@@ -5,7 +5,7 @@ Plugin URI: http://fastvelocity.com
5
  Description: Improve your speed score on GTmetrix, Pingdom Tools and Google PageSpeed Insights by merging and minifying CSS and JavaScript files into groups, compressing HTML and other speed optimizations.
6
  Author: Raul Peixoto
7
  Author URI: http://fastvelocity.com
8
- Version: 2.2.8
9
  License: GPL2
10
 
11
  ------------------------------------------------------------------------
@@ -114,6 +114,7 @@ $force_inline_css_footer = get_option('fastvelocity_min_force_inline_css_footer'
114
  $force_inline_googlefonts = get_option('fastvelocity_min_force_inline_googlefonts');
115
  $remove_googlefonts = get_option('fastvelocity_min_remove_googlefonts');
116
  $defer_for_pagespeed = get_option('fastvelocity_min_defer_for_pagespeed');
 
117
  $exclude_defer_login = get_option('fastvelocity_min_exclude_defer_login');
118
  $preload = array_map('trim', explode("\n", get_option('fastvelocity_min_preload')));
119
  $preconnect = array_map('trim', explode("\n", get_option('fastvelocity_min_preconnect')));
@@ -131,7 +132,7 @@ $exc = array('/html5shiv.js', '/html5shiv-printshiv.min.js', '/excanvas.js', '/a
131
  if(!is_array($blacklist) || strlen(implode($blacklist)) == 0) { update_option('fastvelocity_min_blacklist', implode("\n", $exc)); }
132
 
133
  # default ignore list
134
- $exc = array('/Avada/assets/js/main.min.js', '/woocommerce-product-search/js/product-search.js', '/includes/builder/scripts/frontend-builder-scripts.js', '/assets/js/jquery.themepunch.tools.min.js');
135
  if(!is_array($ignorelist) || strlen(implode($ignorelist)) == 0) { update_option('fastvelocity_min_ignorelist', implode("\n", $exc)); }
136
 
137
 
@@ -269,6 +270,7 @@ function fastvelocity_min_register_settings() {
269
  register_setting('fvm-group', 'fastvelocity_min_force_inline_googlefonts');
270
  register_setting('fvm-group', 'fastvelocity_min_remove_googlefonts');
271
  register_setting('fvm-group', 'fastvelocity_min_defer_for_pagespeed');
 
272
  register_setting('fvm-group', 'fastvelocity_min_exclude_defer_login');
273
  register_setting('fvm-group', 'fastvelocity_min_preload');
274
  register_setting('fvm-group', 'fastvelocity_min_preconnect');
@@ -559,6 +561,11 @@ Enable defer parsing of JS files globally <span class="note-info">[ Not all brow
559
  Enable defer of JS for Pagespeed Insights <span class="note-info">[ Defer JS files for Pagespeed Insights only, <a target="_blank" href="https://www.chromestatus.com/feature/5718547946799104">except external scripts</a> (avoid using a CDN for JS files) ]</span></label>
560
  <br />
561
 
 
 
 
 
 
562
  <label for="fastvelocity_min_exclude_defer_jquery">
563
  <input name="fastvelocity_min_exclude_defer_jquery" type="checkbox" id="fastvelocity_min_exclude_defer_jquery" value="1" <?php echo checked(1 == get_option('fastvelocity_min_exclude_defer_jquery'), true, false); ?> >
564
  Skip deferring the jQuery library <span class="note-info">[ Will fix "undefined jQuery" errors on the Google Chrome console log ]</span></label>
@@ -1162,7 +1169,7 @@ if (stripos($tag, "\n") !== false) { return $tag; }
1162
 
1163
  # print code if there are no linebreaks, or return
1164
  if(!empty($tagdefer)) {
1165
- $deferinsights = '<script type="text/javascript">if(navigator.userAgent.match(/speed|gtmetrix|x11.*firefox\/53|x11.*chrome\/39/i)){document.write('.json_encode($tagdefer).');}else{document.write('.json_encode($tag).');}</script>';
1166
  return preg_replace('#<script(.*?)>(.*?)</script>#is', $deferinsights, $tag);
1167
  }
1168
 
@@ -1763,10 +1770,55 @@ echo implode('', $meta);
1763
  }
1764
 
1765
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1766
  # remove query from static assets and process defering (if enabled)
1767
  if (!is_admin()) {
1768
- add_filter('script_loader_tag', 'fastvelocity_min_defer_js', 10, 3);
1769
  add_filter('style_loader_src', 'fastvelocity_remove_cssjs_ver', 10, 2);
 
 
1770
  }
1771
 
1772
 
5
  Description: Improve your speed score on GTmetrix, Pingdom Tools and Google PageSpeed Insights by merging and minifying CSS and JavaScript files into groups, compressing HTML and other speed optimizations.
6
  Author: Raul Peixoto
7
  Author URI: http://fastvelocity.com
8
+ Version: 2.2.9
9
  License: GPL2
10
 
11
  ------------------------------------------------------------------------
114
  $force_inline_googlefonts = get_option('fastvelocity_min_force_inline_googlefonts');
115
  $remove_googlefonts = get_option('fastvelocity_min_remove_googlefonts');
116
  $defer_for_pagespeed = get_option('fastvelocity_min_defer_for_pagespeed');
117
+ $defer_for_pagespeed_optimize = get_option('fastvelocity_min_defer_for_pagespeed_optimize');
118
  $exclude_defer_login = get_option('fastvelocity_min_exclude_defer_login');
119
  $preload = array_map('trim', explode("\n", get_option('fastvelocity_min_preload')));
120
  $preconnect = array_map('trim', explode("\n", get_option('fastvelocity_min_preconnect')));
132
  if(!is_array($blacklist) || strlen(implode($blacklist)) == 0) { update_option('fastvelocity_min_blacklist', implode("\n", $exc)); }
133
 
134
  # default ignore list
135
+ $exc = array('/Avada/assets/js/main.min.js', '/woocommerce-product-search/js/product-search.js', '/includes/builder/scripts/frontend-builder-scripts.js', '/assets/js/jquery.themepunch.tools.min.js', '/js/TweenMax.min.js');
136
  if(!is_array($ignorelist) || strlen(implode($ignorelist)) == 0) { update_option('fastvelocity_min_ignorelist', implode("\n", $exc)); }
137
 
138
 
270
  register_setting('fvm-group', 'fastvelocity_min_force_inline_googlefonts');
271
  register_setting('fvm-group', 'fastvelocity_min_remove_googlefonts');
272
  register_setting('fvm-group', 'fastvelocity_min_defer_for_pagespeed');
273
+ register_setting('fvm-group', 'fastvelocity_min_defer_for_pagespeed_optimize');
274
  register_setting('fvm-group', 'fastvelocity_min_exclude_defer_login');
275
  register_setting('fvm-group', 'fastvelocity_min_preload');
276
  register_setting('fvm-group', 'fastvelocity_min_preconnect');
561
  Enable defer of JS for Pagespeed Insights <span class="note-info">[ Defer JS files for Pagespeed Insights only, <a target="_blank" href="https://www.chromestatus.com/feature/5718547946799104">except external scripts</a> (avoid using a CDN for JS files) ]</span></label>
562
  <br />
563
 
564
+ <label for="fastvelocity_min_defer_for_pagespeed_optimize">
565
+ <input name="fastvelocity_min_defer_for_pagespeed_optimize" type="checkbox" id="fastvelocity_min_defer_for_pagespeed_optimize" value="1" <?php echo checked(1 == get_option('fastvelocity_min_defer_for_pagespeed_optimize'), true, false); ?>>
566
+ Also defer the "ignore list" for Pagespeed Insights <span class="note-info">[ Defer JS files on the ignore list for Pagespeed Insights only ]</span></label>
567
+ <br />
568
+
569
  <label for="fastvelocity_min_exclude_defer_jquery">
570
  <input name="fastvelocity_min_exclude_defer_jquery" type="checkbox" id="fastvelocity_min_exclude_defer_jquery" value="1" <?php echo checked(1 == get_option('fastvelocity_min_exclude_defer_jquery'), true, false); ?> >
571
  Skip deferring the jQuery library <span class="note-info">[ Will fix "undefined jQuery" errors on the Google Chrome console log ]</span></label>
1169
 
1170
  # print code if there are no linebreaks, or return
1171
  if(!empty($tagdefer)) {
1172
+ $deferinsights = '<script type="text/javascript">if(navigator.userAgent.match(/speed|Lighthouse|gtmetrix|x11.*firefox\/53|x11.*chrome\/39/i)){document.write('.json_encode($tagdefer).');}else{document.write('.json_encode($tag).');}</script>';
1173
  return preg_replace('#<script(.*?)>(.*?)</script>#is', $deferinsights, $tag);
1174
  }
1175
 
1770
  }
1771
 
1772
 
1773
+
1774
+ ###########################################
1775
+ # optimize the ignore list for pagespeed insights
1776
+ ###########################################
1777
+ function fastvelocity_min_defer_js_optimize($tag, $handle, $src) {
1778
+ global $defer_for_pagespeed, $defer_for_pagespeed_optimize, $fvm_fix_editor;
1779
+
1780
+ # return if there are linebreaks (will break document.write)
1781
+ if (stripos($tag, "\n") !== false) { return $tag; }
1782
+
1783
+ # fix page editors
1784
+ if($fvm_fix_editor == true && is_user_logged_in()) { return $tag; }
1785
+
1786
+ # return if external script url https://www.chromestatus.com/feature/5718547946799104
1787
+ if (fvm_is_local_domain($src) == true) { return $tag; }
1788
+
1789
+ # exclude ignored scripts
1790
+ if(substr($handle, 0, 4) != "fvm-" && $defer_for_pagespeed == true && $defer_for_pagespeed_optimize == true) {
1791
+
1792
+ # get available nodes and add create with defer tag (if not async)
1793
+ $dom = new DOMDocument();
1794
+ libxml_use_internal_errors(true);
1795
+ @$dom->loadHTML($tag);
1796
+ $nodes = $dom->getElementsByTagName('script');
1797
+ $tagdefer = '';
1798
+ if ($nodes->length != 0) {
1799
+ $node = $dom->getElementsByTagName('script')->item(0);
1800
+ if (!$node->hasAttribute('async')) { $node->setAttribute('defer','defer'); };
1801
+ $tagdefer = $dom->saveHTML($node);
1802
+ }
1803
+
1804
+ # print code if there are no linebreaks, or return
1805
+ if(!empty($tagdefer)) {
1806
+ $deferinsights = '<script type="text/javascript">if(!navigator.userAgent.match(/speed|Lighthouse|gtmetrix|x11.*firefox\/53|x11.*chrome\/39/i)){document.write('.json_encode($tag).');}</script>';
1807
+ return preg_replace('#<script(.*?)>(.*?)</script>#is', $deferinsights, $tag);
1808
+ }
1809
+
1810
+ }
1811
+
1812
+ # fallback
1813
+ return $tag;
1814
+ }
1815
+
1816
+
1817
  # remove query from static assets and process defering (if enabled)
1818
  if (!is_admin()) {
 
1819
  add_filter('style_loader_src', 'fastvelocity_remove_cssjs_ver', 10, 2);
1820
+ add_filter('script_loader_tag', 'fastvelocity_min_defer_js', 10, 3);
1821
+ add_filter('script_loader_tag', 'fastvelocity_min_defer_js_optimize', 10, 3);
1822
  }
1823
 
1824
 
inc/functions-serverinfo.php CHANGED
@@ -108,17 +108,21 @@ function fvm_get_generalinfo() {
108
  ### Function: Format Bytes Into TiB/GiB/MiB/KiB/Bytes
109
  if(!function_exists('fvm_format_filesize')) {
110
  function fvm_format_filesize($rawSize) {
111
- if($rawSize / 1099511627776 > 1) {
112
- return number_format_i18n($rawSize/1099511627776, 1).' '.__('TiB', 'fvm-serverinfo');
113
- } elseif($rawSize / 1073741824 > 1) {
114
- return number_format_i18n($rawSize/1073741824, 1).' '.__('GiB', 'fvm-serverinfo');
115
- } elseif($rawSize / 1048576 > 1) {
116
- return number_format_i18n($rawSize/1048576, 1).' '.__('MiB', 'fvm-serverinfo');
117
- } elseif($rawSize / 1024 > 1) {
118
- return number_format_i18n($rawSize/1024, 1).' '.__('KiB', 'fvm-serverinfo');
119
- } elseif($rawSize > 1) {
120
- return number_format_i18n($rawSize, 0).' '.__('bytes', 'fvm-serverinfo');
121
- } else {
 
 
 
 
122
  return __('unknown', 'fvm-serverinfo');
123
  }
124
  }
@@ -232,7 +236,7 @@ if(!function_exists('fvm_get_mysql_data_usage')) {
232
  $data_usage = '';
233
  $tablesstatus = $wpdb->get_results("SHOW TABLE STATUS");
234
  foreach($tablesstatus as $tablestatus) {
235
- $data_usage += $tablestatus->Data_length;
236
  }
237
  if (!$data_usage) {
238
  $data_usage = __('N/A', 'fvm-serverinfo');
@@ -249,7 +253,7 @@ if(!function_exists('fvm_get_mysql_index_usage')) {
249
  $index_usage = '';
250
  $tablesstatus = $wpdb->get_results("SHOW TABLE STATUS");
251
  foreach($tablesstatus as $tablestatus) {
252
- $index_usage += $tablestatus->Index_length;
253
  }
254
  if (!$index_usage){
255
  $index_usage = __('N/A', 'fvm-serverinfo');
@@ -324,8 +328,12 @@ if(!function_exists('fvm_get_serverload')) {
324
  } else {
325
  $data = @system('uptime');
326
  preg_match('/(.*):{1}(.*)/', $data, $matches);
327
- $load_arr = explode(',', $matches[2]);
328
- $server_load = trim($load_arr[0]);
 
 
 
 
329
  }
330
  }
331
  if(empty($server_load)) {
108
  ### Function: Format Bytes Into TiB/GiB/MiB/KiB/Bytes
109
  if(!function_exists('fvm_format_filesize')) {
110
  function fvm_format_filesize($rawSize) {
111
+ if(is_numeric($rawSize)) {
112
+ if($rawSize / 1099511627776 > 1) {
113
+ return number_format_i18n($rawSize/1099511627776, 1).' '.__('TiB', 'fvm-serverinfo');
114
+ } elseif($rawSize / 1073741824 > 1) {
115
+ return number_format_i18n($rawSize/1073741824, 1).' '.__('GiB', 'fvm-serverinfo');
116
+ } elseif($rawSize / 1048576 > 1) {
117
+ return number_format_i18n($rawSize/1048576, 1).' '.__('MiB', 'fvm-serverinfo');
118
+ } elseif($rawSize / 1024 > 1) {
119
+ return number_format_i18n($rawSize/1024, 1).' '.__('KiB', 'fvm-serverinfo');
120
+ } elseif($rawSize > 1) {
121
+ return number_format_i18n($rawSize, 0).' '.__('bytes', 'fvm-serverinfo');
122
+ } else {
123
+ return __('unknown', 'fvm-serverinfo');
124
+ }
125
+ } else {
126
  return __('unknown', 'fvm-serverinfo');
127
  }
128
  }
236
  $data_usage = '';
237
  $tablesstatus = $wpdb->get_results("SHOW TABLE STATUS");
238
  foreach($tablesstatus as $tablestatus) {
239
+ if(is_numeric($tablestatus->Data_length)) { $data_usage += $tablestatus->Data_length; } else { $data_usage += 0; }
240
  }
241
  if (!$data_usage) {
242
  $data_usage = __('N/A', 'fvm-serverinfo');
253
  $index_usage = '';
254
  $tablesstatus = $wpdb->get_results("SHOW TABLE STATUS");
255
  foreach($tablesstatus as $tablestatus) {
256
+ if(is_numeric($tablestatus->Index_length)) { $index_usage += $tablestatus->Index_length; } else { $index_usage += 0; }
257
  }
258
  if (!$index_usage){
259
  $index_usage = __('N/A', 'fvm-serverinfo');
328
  } else {
329
  $data = @system('uptime');
330
  preg_match('/(.*):{1}(.*)/', $data, $matches);
331
+ if(isset($matches[2])) {
332
+ $load_arr = explode(',', $matches[2]);
333
+ $server_load = trim($load_arr[0]);
334
+ } else {
335
+ $server_load = __('N/A', 'fvm-serverinfo');
336
+ }
337
  }
338
  }
339
  if(empty($server_load)) {
inc/functions.php CHANGED
@@ -3,6 +3,10 @@
3
  # handle better utf-8 and unicode encoding
4
  if(function_exists('mb_internal_encoding')) { mb_internal_encoding('UTF-8'); }
5
 
 
 
 
 
6
  # Consider fallback to PHP Minify [2017.12.17] from https://github.com/matthiasmullie/minify (must be defined on the outer scope)
7
  $path = $plugindir . 'libs/matthiasmullie';
8
  require_once $path . '/minify/src/Minify.php';
@@ -143,8 +147,14 @@ function fastvelocity_min_in_arrayi($hurl, $ignore){
143
 
144
  # better compatibility urls, fix bootstrap 4 svg images https://www.w3.org/TR/SVG/intro.html#NamespaceAndDTDIdentifiers
145
  function fvm_compat_urls($code) {
146
- $code = str_ireplace(array('http://', 'https://'), '//', $code);
147
- $code = str_ireplace('//www.w3.org/2000/svg', 'http://www.w3.org/2000/svg', $code);
 
 
 
 
 
 
148
  return $code;
149
  }
150
 
@@ -161,7 +171,10 @@ return fvm_compat_urls($css);
161
 
162
  # find if we are running windows
163
  function fvm_server_is_windows() {
164
- if(defined('PHP_OS_FAMILY') && strtolower(PHP_OS_FAMILY) == 'windows') { return true; } # PHP 7.2.0+
 
 
 
165
  if(function_exists('php_uname')) {
166
  $os = @php_uname('s');
167
  if (stripos($os, 'Windows') !== false) {
@@ -298,7 +311,9 @@ global $wp_domain;
298
  $css = fastvelocity_min_remove_utf8_bom($css);
299
 
300
  # fix url paths
301
- if(!empty($url)) { $css = preg_replace("/url\(\s*['\"]?(?!data:)(?!http)(?![\/'\"])(.+?)['\"]?\s*\)/ui", "url(".dirname($url)."/$1)", $css); }
 
 
302
 
303
  # remove query strings from fonts (for better seo, but add a small cache buster based on most recent updates)
304
  $ctime = get_option('fvm-last-cache-update', '0'); # last update or zero
@@ -804,7 +819,7 @@ function fastvelocity_godaddy_request( $method, $url = null ) {
804
 
805
  function fastvelocity_purge_others(){
806
 
807
- # wodpress default cache
808
  if (function_exists('wp_cache_flush')) {
809
  wp_cache_flush();
810
  }
3
  # handle better utf-8 and unicode encoding
4
  if(function_exists('mb_internal_encoding')) { mb_internal_encoding('UTF-8'); }
5
 
6
+ # must have
7
+ @ini_set('pcre.backtrack_limit',5000000);
8
+ @ini_set('pcre.recursion_limit',5000000);
9
+
10
  # Consider fallback to PHP Minify [2017.12.17] from https://github.com/matthiasmullie/minify (must be defined on the outer scope)
11
  $path = $plugindir . 'libs/matthiasmullie';
12
  require_once $path . '/minify/src/Minify.php';
147
 
148
  # better compatibility urls, fix bootstrap 4 svg images https://www.w3.org/TR/SVG/intro.html#NamespaceAndDTDIdentifiers
149
  function fvm_compat_urls($code) {
150
+ $default_protocol = get_option('fastvelocity_min_default_protocol', 'dynamic');
151
+ if($default_protocol == 'dynamic' || empty($default_protocol)) {
152
+ $default_protocol = '//';
153
+ } else {
154
+ $default_protocol = $default_protocol.'://';
155
+ }
156
+ $code = str_ireplace(array('http://', 'https://'), $default_protocol, $code);
157
+ $code = str_ireplace($default_protocol.'www.w3.org/2000/svg', 'http://www.w3.org/2000/svg', $code);
158
  return $code;
159
  }
160
 
171
 
172
  # find if we are running windows
173
  function fvm_server_is_windows() {
174
+ # PHP 7.2.0+
175
+ if(defined('PHP_OS_FAMILY')) {
176
+ if(strtolower(PHP_OS_FAMILY) == 'windows') { return true; }
177
+ }
178
  if(function_exists('php_uname')) {
179
  $os = @php_uname('s');
180
  if (stripos($os, 'Windows') !== false) {
311
  $css = fastvelocity_min_remove_utf8_bom($css);
312
 
313
  # fix url paths
314
+ if(!empty($url)) {
315
+ $css = preg_replace("/url\(\s*['\"]?(?!data:)(?!http)(?![\/'\"])(.+?)['\"]?\s*\)/ui", "url(".dirname($url)."/$1)", $css);
316
+ }
317
 
318
  # remove query strings from fonts (for better seo, but add a small cache buster based on most recent updates)
319
  $ctime = get_option('fvm-last-cache-update', '0'); # last update or zero
819
 
820
  function fastvelocity_purge_others(){
821
 
822
+ # wordpress default cache
823
  if (function_exists('wp_cache_flush')) {
824
  wp_cache_flush();
825
  }
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: Alignak
3
  Tags: PHP Minify, YUI Compressor, GTmetrix, Pingdom, Pagespeed, CSS Merging, JS Merging, CSS Minification, JS Minification, Speed Optimization, HTML Minification, Performance
4
  Requires at least: 4.5
5
- Stable tag: 2.2.8
6
- Tested up to: 4.9.4
7
  License: GPLv3 or later
8
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
 
@@ -44,10 +44,20 @@ I can offer you aditional `custom made` optimization on top of this plugin. If y
44
  * Support for gzip_static on Nginx
45
  * Support for the CDN Enabler plugin
46
  * Auto purging of cache files on W3 Total Cache, WP Supercache, WP Rocket, Wp Fastest Cache, Cachify, Comet Cache, Zen Cache, LiteSpeed Cache, Nginx Cache (by Till Krüss ), SG Optimizer, Godaddy Managed WordPress Hosting and WP Engine (read the FAQs)
 
47
  * Support for preconnect and preload headers
48
  * and some more...
49
 
50
 
 
 
 
 
 
 
 
 
 
51
  = Notes =
52
  * The JavaScript minification is by [PHP Minify](https://github.com/matthiasmullie/minify)
53
  * The alternative JavaScript minification is by [YUI Compressor](http://yui.github.io/yuicompressor/)
@@ -256,6 +266,15 @@ Note: Kindly re-save all options and purge all caches (the plugin cache as well
256
 
257
  == Changelog ==
258
 
 
 
 
 
 
 
 
 
 
259
  = 2.2.8 [2018.01.21] =
260
  * rollback to 2.2.6 + bugfixes
261
 
2
  Contributors: Alignak
3
  Tags: PHP Minify, YUI Compressor, GTmetrix, Pingdom, Pagespeed, CSS Merging, JS Merging, CSS Minification, JS Minification, Speed Optimization, HTML Minification, Performance
4
  Requires at least: 4.5
5
+ Stable tag: 2.3.0
6
+ Tested up to: 4.9.6
7
  License: GPLv3 or later
8
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
 
44
  * Support for gzip_static on Nginx
45
  * Support for the CDN Enabler plugin
46
  * Auto purging of cache files on W3 Total Cache, WP Supercache, WP Rocket, Wp Fastest Cache, Cachify, Comet Cache, Zen Cache, LiteSpeed Cache, Nginx Cache (by Till Krüss ), SG Optimizer, Godaddy Managed WordPress Hosting and WP Engine (read the FAQs)
47
+ * WP CLI support
48
  * Support for preconnect and preload headers
49
  * and some more...
50
 
51
 
52
+ = WP-CLI Commands =
53
+ * Purge all caches: `wp fvm purge`
54
+ * Purge all caches on a network site: `wp --url=blog.example.com fvm purge`
55
+ * Purge all caches on the entire network (linux): `wp site list --field=url | xargs -n1 -I % wp --url=% fvm purge`
56
+ * Get cache size: `wp fvm stats`
57
+ * Get cache size on a network site: `wp --url=blog.example.com fvm stats`
58
+ * Get cache size on each site (linux): `wp site list --field=url | xargs -n1 -I % wp --url=% fvm stats`
59
+
60
+
61
  = Notes =
62
  * The JavaScript minification is by [PHP Minify](https://github.com/matthiasmullie/minify)
63
  * The alternative JavaScript minification is by [YUI Compressor](http://yui.github.io/yuicompressor/)
266
 
267
  == Changelog ==
268
 
269
+ = 2.3.0 [2018.05.24] =
270
+ * added wp cli support for purge cache (usage: wp fvm purge)
271
+ * added wp cli support for getting the cache size (usage: wp fvm stats)
272
+
273
+ = 2.2.9 [2018.05.23] =
274
+ * fixed several bugs related to notices, css minification and file paths
275
+ * added more pcre.backtrack_limit and pcre.recursion_limit to avoid blank pages on some servers
276
+ * added new option to defer the ignore list for pagespeed
277
+
278
  = 2.2.8 [2018.01.21] =
279
  * rollback to 2.2.6 + bugfixes
280