Version Description
- Bug Fix: Prevent fatal error from showing in PHP 5.4 when the plugin was updated
- Re-organised the plugin's links within the Dashboard to make it easier to navigate through
- "Combine CSS files into one" feature update - CSS files having media="print" or media="only screen and (max-width: 768px)" (and so on) are not combined
- "Combine JS files into fewer ones" feature update - jQuery and jQuery Migrate are combined as a single group (not together with any other files); if only jQuery is loaded (without jQuery Migrate), it will not be added to any group and load independently
Download this release
Release Info
Developer | gabelivan |
Plugin | Asset CleanUp: Page Speed Booster |
Version | 1.2.9.7 |
Comparing to | |
See all releases |
Code changes from version 1.2.9.6 to 1.2.9.7
- classes/Main.php +30 -61
- classes/MetaBoxes.php +126 -0
- classes/OptimiseAssets/CombineCss.php +47 -18
- classes/Update.php +34 -8
- readme.txt +7 -1
- templates/admin-page-settings-plugin.php +3 -3
- templates/meta-box-page-options.php +37 -0
- wpacu.php +2 -2
classes/Main.php
CHANGED
@@ -1,6 +1,8 @@
|
|
1 |
<?php
|
2 |
namespace WpAssetCleanUp;
|
3 |
|
|
|
|
|
4 |
/**
|
5 |
* Class Main
|
6 |
* @package WpAssetCleanUp
|
@@ -236,16 +238,23 @@ class Main
|
|
236 |
add_action('wp_footer', array($this, 'printScriptsStyles'), PHP_INT_MAX);
|
237 |
}
|
238 |
|
239 |
-
|
240 |
-
|
241 |
-
if (
|
242 |
-
//
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
|
|
|
|
|
|
247 |
|
248 |
-
|
|
|
|
|
|
|
|
|
249 |
}
|
250 |
|
251 |
if ($this->settings['disable_emojis'] == 1) {
|
@@ -266,6 +275,8 @@ class Main
|
|
266 |
|
267 |
// it will update $this->isUpdateable;
|
268 |
$this->getCurrentPostId();
|
|
|
|
|
269 |
}
|
270 |
|
271 |
/**
|
@@ -302,57 +313,6 @@ class Main
|
|
302 |
}
|
303 |
}
|
304 |
|
305 |
-
/**
|
306 |
-
* @param $postType
|
307 |
-
*/
|
308 |
-
public function addMetaBox($postType)
|
309 |
-
{
|
310 |
-
$obj = get_post_type_object($postType);
|
311 |
-
|
312 |
-
if (isset($obj->public) && $obj->public > 0) {
|
313 |
-
add_meta_box(
|
314 |
-
WPACU_PLUGIN_ID . '_asset_list',
|
315 |
-
__('Asset CleanUp', WPACU_PLUGIN_TEXT_DOMAIN),
|
316 |
-
array($this, 'renderMetaBoxContent'),
|
317 |
-
$postType,
|
318 |
-
'advanced',
|
319 |
-
'high'
|
320 |
-
);
|
321 |
-
}
|
322 |
-
}
|
323 |
-
|
324 |
-
/**
|
325 |
-
* This is triggered only in the Edit Mode Dashboard View
|
326 |
-
*/
|
327 |
-
public function renderMetaBoxContent()
|
328 |
-
{
|
329 |
-
global $post;
|
330 |
-
|
331 |
-
if ($post->ID === null) {
|
332 |
-
return;
|
333 |
-
}
|
334 |
-
|
335 |
-
$postId = $post->ID;
|
336 |
-
|
337 |
-
$getAssets = true;
|
338 |
-
|
339 |
-
if (get_post_status($postId) !== 'publish') {
|
340 |
-
$getAssets = false;
|
341 |
-
}
|
342 |
-
|
343 |
-
if ($getAssets) {
|
344 |
-
// Add an nonce field so we can check for it later.
|
345 |
-
wp_nonce_field( WPACU_PLUGIN_ID . '_meta_box', WPACU_PLUGIN_ID . '_nonce');
|
346 |
-
}
|
347 |
-
|
348 |
-
$data = array();
|
349 |
-
|
350 |
-
$data['get_assets'] = $getAssets;
|
351 |
-
$data['fetch_url'] = Misc::getPageUrl($postId);
|
352 |
-
|
353 |
-
$this->parseTemplate('meta-box', $data, true);
|
354 |
-
}
|
355 |
-
|
356 |
/**
|
357 |
* See if there is any list with scripts to be removed in JSON format
|
358 |
* Only the handles (the ID of the scripts) are saved
|
@@ -498,7 +458,8 @@ class Main
|
|
498 |
if (! empty($globalUnload['styles']) && $nonAssetConfigPage) {
|
499 |
$list = $globalUnload['styles'];
|
500 |
} else { // [/wpacu_lite]
|
501 |
-
// Post, Page, Front-page
|
|
|
502 |
$toRemove = $this->getAssetsUnloaded();
|
503 |
|
504 |
$jsonList = @json_decode($toRemove);
|
@@ -1622,6 +1583,14 @@ class Main
|
|
1622 |
return true; // visitors (non-logged in) will view the pages with all the assets loaded
|
1623 |
}
|
1624 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1625 |
return false;
|
1626 |
}
|
1627 |
|
1 |
<?php
|
2 |
namespace WpAssetCleanUp;
|
3 |
|
4 |
+
use FakerPress\Module\Meta;
|
5 |
+
|
6 |
/**
|
7 |
* Class Main
|
8 |
* @package WpAssetCleanUp
|
238 |
add_action('wp_footer', array($this, 'printScriptsStyles'), PHP_INT_MAX);
|
239 |
}
|
240 |
|
241 |
+
$metaboxes = new MetaBoxes;
|
242 |
+
|
243 |
+
if ( is_admin() ) {
|
244 |
+
// Do not load the meta box nor do any AJAX calls
|
245 |
+
// if the asset management is not enabled for the Dashboard
|
246 |
+
if ($this->settings['dashboard_show'] == 1) {
|
247 |
+
// Send an AJAX request to get the list of loaded scripts and styles and print it nicely
|
248 |
+
add_action(
|
249 |
+
'wp_ajax_' . WPACU_PLUGIN_ID . '_get_loaded_assets',
|
250 |
+
array( $this, 'ajaxGetJsonListCallback' )
|
251 |
+
);
|
252 |
|
253 |
+
$metaboxes->initManagerMetaBox();
|
254 |
+
}
|
255 |
+
|
256 |
+
// Side Meta Box: Asset CleanUp Options
|
257 |
+
$metaboxes->initCustomOptionsMetaBox();
|
258 |
}
|
259 |
|
260 |
if ($this->settings['disable_emojis'] == 1) {
|
275 |
|
276 |
// it will update $this->isUpdateable;
|
277 |
$this->getCurrentPostId();
|
278 |
+
|
279 |
+
define('WPACU_CURRENT_PAGE_ID', $this->getCurrentPostId());
|
280 |
}
|
281 |
|
282 |
/**
|
313 |
}
|
314 |
}
|
315 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
316 |
/**
|
317 |
* See if there is any list with scripts to be removed in JSON format
|
318 |
* Only the handles (the ID of the scripts) are saved
|
458 |
if (! empty($globalUnload['styles']) && $nonAssetConfigPage) {
|
459 |
$list = $globalUnload['styles'];
|
460 |
} else { // [/wpacu_lite]
|
461 |
+
// Post, Page, Front-page
|
462 |
+
// and more (if the Premium Extension is activated)
|
463 |
$toRemove = $this->getAssetsUnloaded();
|
464 |
|
465 |
$jsonList = @json_decode($toRemove);
|
1583 |
return true; // visitors (non-logged in) will view the pages with all the assets loaded
|
1584 |
}
|
1585 |
|
1586 |
+
if (defined('WPACU_CURRENT_PAGE_ID') && WPACU_CURRENT_PAGE_ID > 0) {
|
1587 |
+
$pageOptions = MetaBoxes::getPageOptions(WPACU_CURRENT_PAGE_ID);
|
1588 |
+
|
1589 |
+
if (isset($pageOptions['no_assets_settings']) && $pageOptions['no_assets_settings']) {
|
1590 |
+
return true;
|
1591 |
+
}
|
1592 |
+
}
|
1593 |
+
|
1594 |
return false;
|
1595 |
}
|
1596 |
|
classes/MetaBoxes.php
ADDED
@@ -0,0 +1,126 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace WpAssetCleanUp;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Class MetaBoxes
|
6 |
+
* @package WpAssetCleanUp
|
7 |
+
*/
|
8 |
+
class MetaBoxes
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
*
|
12 |
+
*/
|
13 |
+
public function initManagerMetaBox()
|
14 |
+
{
|
15 |
+
add_action( 'add_meta_boxes', array( $this, 'addAssetManagerMetaBox' ) );
|
16 |
+
}
|
17 |
+
|
18 |
+
/**
|
19 |
+
*
|
20 |
+
*/
|
21 |
+
public function initCustomOptionsMetaBox()
|
22 |
+
{
|
23 |
+
add_action( 'add_meta_boxes', array( $this, 'addPageOptionsMetaBox' ) );
|
24 |
+
}
|
25 |
+
|
26 |
+
/**
|
27 |
+
* @param $postType
|
28 |
+
*/
|
29 |
+
public function addAssetManagerMetaBox($postType)
|
30 |
+
{
|
31 |
+
$obj = get_post_type_object($postType);
|
32 |
+
|
33 |
+
if (isset($obj->public) && $obj->public > 0) {
|
34 |
+
add_meta_box(
|
35 |
+
WPACU_PLUGIN_ID . '_asset_list',
|
36 |
+
__('Asset CleanUp: CSS & JavaScript Manager', WPACU_PLUGIN_TEXT_DOMAIN),
|
37 |
+
array($this, 'renderAssetManagerMetaBoxContent'),
|
38 |
+
$postType,
|
39 |
+
'advanced',
|
40 |
+
'high'
|
41 |
+
);
|
42 |
+
}
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* This is triggered only in the Edit Mode Dashboard View
|
47 |
+
*/
|
48 |
+
public function renderAssetManagerMetaBoxContent()
|
49 |
+
{
|
50 |
+
global $post;
|
51 |
+
|
52 |
+
if ($post->ID === null) {
|
53 |
+
return;
|
54 |
+
}
|
55 |
+
|
56 |
+
$postId = $post->ID;
|
57 |
+
|
58 |
+
$getAssets = true;
|
59 |
+
|
60 |
+
if (get_post_status($postId) !== 'publish') {
|
61 |
+
$getAssets = false;
|
62 |
+
}
|
63 |
+
|
64 |
+
if ($getAssets) {
|
65 |
+
// Add an nonce field so we can check for it later.
|
66 |
+
wp_nonce_field( WPACU_PLUGIN_ID . '_meta_box', WPACU_PLUGIN_ID . '_nonce');
|
67 |
+
}
|
68 |
+
|
69 |
+
$data = array();
|
70 |
+
|
71 |
+
$data['get_assets'] = $getAssets;
|
72 |
+
$data['fetch_url'] = Misc::getPageUrl($postId);
|
73 |
+
|
74 |
+
Main::instance()->parseTemplate('meta-box', $data, true);
|
75 |
+
}
|
76 |
+
|
77 |
+
/**
|
78 |
+
* @param $postType
|
79 |
+
*/
|
80 |
+
public function addPageOptionsMetaBox($postType)
|
81 |
+
{
|
82 |
+
$obj = get_post_type_object($postType);
|
83 |
+
|
84 |
+
if (isset($obj->public) && $obj->public > 0) {
|
85 |
+
add_meta_box(
|
86 |
+
WPACU_PLUGIN_ID . '_page_options',
|
87 |
+
__('Asset CleanUp Options', WPACU_PLUGIN_TEXT_DOMAIN),
|
88 |
+
array($this, 'renderPageOptionsMetaBoxContent'),
|
89 |
+
$postType,
|
90 |
+
'side',
|
91 |
+
'high'
|
92 |
+
);
|
93 |
+
}
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
*
|
98 |
+
*/
|
99 |
+
public function renderPageOptionsMetaBoxContent()
|
100 |
+
{
|
101 |
+
$data = array('page_options' => self::getPageOptions());
|
102 |
+
|
103 |
+
Main::instance()->parseTemplate('meta-box-page-options', $data, true);
|
104 |
+
}
|
105 |
+
|
106 |
+
|
107 |
+
/**
|
108 |
+
* @param int $postId
|
109 |
+
*
|
110 |
+
* @return array|mixed|object
|
111 |
+
*/
|
112 |
+
public static function getPageOptions($postId = 0)
|
113 |
+
{
|
114 |
+
if ($postId < 1) {
|
115 |
+
global $post;
|
116 |
+
$postId = (int)$post->ID;
|
117 |
+
}
|
118 |
+
|
119 |
+
if ($postId > 1) {
|
120 |
+
$metaPageOptionsJson = get_post_meta($postId, '_'.WPACU_PLUGIN_ID.'_page_options', true);
|
121 |
+
return @json_decode($metaPageOptionsJson, ARRAY_A);
|
122 |
+
}
|
123 |
+
|
124 |
+
return array();
|
125 |
+
}
|
126 |
+
}
|
classes/OptimiseAssets/CombineCss.php
CHANGED
@@ -3,6 +3,7 @@ namespace WpAssetCleanUp\OptimiseAssets;
|
|
3 |
|
4 |
use WpAssetCleanUp\Main;
|
5 |
use WpAssetCleanUp\Menu;
|
|
|
6 |
|
7 |
/**
|
8 |
* Class CombineCss
|
@@ -25,6 +26,9 @@ class CombineCss
|
|
25 |
*/
|
26 |
public $jsonStorageFile = 'css-combined{maybe-extra-info}.json';
|
27 |
|
|
|
|
|
|
|
28 |
public function init()
|
29 |
{
|
30 |
add_action('wp_loaded', function() {
|
@@ -33,6 +37,13 @@ class CombineCss
|
|
33 |
}
|
34 |
|
35 |
ob_start(function ($htmlSource) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
$useDom = function_exists('libxml_use_internal_errors') && function_exists('libxml_clear_errors') && class_exists('DOMDocument');
|
37 |
|
38 |
if (! $useDom) {
|
@@ -52,6 +63,7 @@ class CombineCss
|
|
52 |
|
53 |
// $uriToFinalCssFile will always be relative ONLY within WP_CONTENT_DIR . self::$relPathCssCacheDir
|
54 |
// which is usually "wp-content/cache/asset-cleanup/css/"
|
|
|
55 |
if (! empty($localFinalCssFileData) && isset($localFinalCssFileData['local_final_css_file']) && file_exists($localFinalCssFileData['local_final_css_file'])) {
|
56 |
/*
|
57 |
* URIs to the LINK tags are already cached; No need to parse the DOM
|
@@ -73,16 +85,20 @@ class CombineCss
|
|
73 |
$documentHead = $document->getElementsByTagName('head')->item(0);
|
74 |
libxml_use_internal_errors( true );
|
75 |
|
76 |
-
$combinedUriPaths = $
|
77 |
|
78 |
foreach ($documentHead->getElementsByTagName('link') as $tagObject) {
|
79 |
if (! $tagObject->hasAttributes()) {
|
80 |
continue;
|
81 |
}
|
82 |
|
83 |
-
$getHref = $
|
|
|
|
|
84 |
|
85 |
foreach ($tagObject->attributes as $attrObj) {
|
|
|
|
|
86 |
// Only rel="stylesheet" (with no rel="preload" associated with it) gets prepared for combining as links with rel="preload" (if any) are never combined into a standard render-blocking CSS file
|
87 |
// rel="preload" is there for a reason to make sure the CSS code is made available earlier prior to the one from rel="stylesheet" which is render-blocking
|
88 |
if ($attrObj->nodeName === 'rel' && $attrObj->nodeValue === 'stylesheet') {
|
@@ -96,40 +112,54 @@ class CombineCss
|
|
96 |
|
97 |
$localAssetPath = CombineCommon::getLocalAssetPath($href, 'css');
|
98 |
|
|
|
99 |
if ($localAssetPath) {
|
100 |
$combinedUriPaths[] = CombineCommon::getHrefRelPath($href);
|
101 |
$localAssetsPaths[$href] = $localAssetPath;
|
102 |
$linkHrefs[] = $href;
|
103 |
}
|
104 |
}
|
|
|
105 |
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
$checkCssPreload = true;
|
110 |
-
}
|
111 |
|
112 |
-
|
113 |
-
|
114 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
115 |
}
|
116 |
}
|
117 |
|
118 |
-
// Any rel="preload" found? Remove the stylesheet from the combination
|
119 |
-
if (! empty($
|
120 |
-
foreach ($
|
121 |
-
if (in_array($
|
122 |
-
$linkHrefUriKey = array_search($
|
123 |
unset($combinedUriPaths[$linkHrefUriKey]);
|
124 |
|
125 |
foreach (array_keys($localAssetsPaths) as $localAssetPathKey) {
|
126 |
-
if (substr($localAssetPathKey, -strlen($
|
127 |
unset($localAssetsPaths[$localAssetPathKey]);
|
128 |
}
|
129 |
}
|
130 |
|
131 |
foreach ($linkHrefs as $linkHrefKey => $linkHref) {
|
132 |
-
if (substr($linkHref, -strlen($
|
133 |
unset($linkHrefs[$linkHrefKey]);
|
134 |
}
|
135 |
}
|
@@ -174,7 +204,6 @@ HTML;
|
|
174 |
|
175 |
$htmlSource = preg_replace('#<head>#si', '<head>'."\n" . $finalCssTag . "\n", $htmlSource, 1);
|
176 |
|
177 |
-
$htmlSourceBeforeLinkTagLoopReplacement = $htmlSource;
|
178 |
$htmlSource = CombineCommon::stripJustCombinedFileTags($linkHrefs, $htmlSource, 'css'); // Strip the combined files to avoid duplicate code
|
179 |
|
180 |
// There should be at least two replacements made
|
3 |
|
4 |
use WpAssetCleanUp\Main;
|
5 |
use WpAssetCleanUp\Menu;
|
6 |
+
use WpAssetCleanUp\MetaBoxes;
|
7 |
|
8 |
/**
|
9 |
* Class CombineCss
|
26 |
*/
|
27 |
public $jsonStorageFile = 'css-combined{maybe-extra-info}.json';
|
28 |
|
29 |
+
/**
|
30 |
+
*
|
31 |
+
*/
|
32 |
public function init()
|
33 |
{
|
34 |
add_action('wp_loaded', function() {
|
37 |
}
|
38 |
|
39 |
ob_start(function ($htmlSource) {
|
40 |
+
// If "Do not combine CSS on this page" is checked in "Asset CleanUp Options" side meta box
|
41 |
+
$pageOptions = MetaBoxes::getPageOptions(WPACU_CURRENT_PAGE_ID);
|
42 |
+
|
43 |
+
if (isset($pageOptions['no_css_optimize']) && $pageOptions['no_css_optimize']) {
|
44 |
+
return $htmlSource;
|
45 |
+
}
|
46 |
+
|
47 |
$useDom = function_exists('libxml_use_internal_errors') && function_exists('libxml_clear_errors') && class_exists('DOMDocument');
|
48 |
|
49 |
if (! $useDom) {
|
63 |
|
64 |
// $uriToFinalCssFile will always be relative ONLY within WP_CONTENT_DIR . self::$relPathCssCacheDir
|
65 |
// which is usually "wp-content/cache/asset-cleanup/css/"
|
66 |
+
|
67 |
if (! empty($localFinalCssFileData) && isset($localFinalCssFileData['local_final_css_file']) && file_exists($localFinalCssFileData['local_final_css_file'])) {
|
68 |
/*
|
69 |
* URIs to the LINK tags are already cached; No need to parse the DOM
|
85 |
$documentHead = $document->getElementsByTagName('head')->item(0);
|
86 |
libxml_use_internal_errors( true );
|
87 |
|
88 |
+
$combinedUriPaths = $hrefUriNotCombinableList = $localAssetsPaths = $linkHrefs = array();
|
89 |
|
90 |
foreach ($documentHead->getElementsByTagName('link') as $tagObject) {
|
91 |
if (! $tagObject->hasAttributes()) {
|
92 |
continue;
|
93 |
}
|
94 |
|
95 |
+
$getHref = $href = false;
|
96 |
+
|
97 |
+
$linkAttributes = array();
|
98 |
|
99 |
foreach ($tagObject->attributes as $attrObj) {
|
100 |
+
$linkAttributes[$attrObj->nodeName] = $attrObj->nodeValue;
|
101 |
+
|
102 |
// Only rel="stylesheet" (with no rel="preload" associated with it) gets prepared for combining as links with rel="preload" (if any) are never combined into a standard render-blocking CSS file
|
103 |
// rel="preload" is there for a reason to make sure the CSS code is made available earlier prior to the one from rel="stylesheet" which is render-blocking
|
104 |
if ($attrObj->nodeName === 'rel' && $attrObj->nodeValue === 'stylesheet') {
|
112 |
|
113 |
$localAssetPath = CombineCommon::getLocalAssetPath($href, 'css');
|
114 |
|
115 |
+
// It will skip external stylesheets (from a different domain)
|
116 |
if ($localAssetPath) {
|
117 |
$combinedUriPaths[] = CombineCommon::getHrefRelPath($href);
|
118 |
$localAssetsPaths[$href] = $localAssetPath;
|
119 |
$linkHrefs[] = $href;
|
120 |
}
|
121 |
}
|
122 |
+
}
|
123 |
|
124 |
+
if (! $getHref) {
|
125 |
+
continue;
|
126 |
+
}
|
|
|
|
|
127 |
|
128 |
+
$cssNotCombinable = false;
|
129 |
+
|
130 |
+
// 1) Check if there is any rel="preload" connected to the rel="stylesheet"
|
131 |
+
// making sure the file is not added to the final CSS combined file
|
132 |
+
|
133 |
+
// 2) Only combine media "all", "screen" and the ones with no media
|
134 |
+
// Do not combine media='only screen and (max-width: 768px)' etc.
|
135 |
+
if (isset($linkAttributes['rel']) && $linkAttributes['rel'] === 'preload') {
|
136 |
+
$cssNotCombinable = true;
|
137 |
+
}
|
138 |
+
|
139 |
+
if (array_key_exists('media', $linkAttributes) && ! in_array($linkAttributes['media'], array('all', 'screen'))) {
|
140 |
+
$cssNotCombinable = true;
|
141 |
+
}
|
142 |
+
|
143 |
+
if ($cssNotCombinable) {
|
144 |
+
$hrefUriNotCombinableList[] = CombineCommon::getHrefRelPath( $href );
|
145 |
}
|
146 |
}
|
147 |
|
148 |
+
// Any rel="preload" or media="print" found? Remove the stylesheet from the combination
|
149 |
+
if (! empty($hrefUriNotCombinableList)) {
|
150 |
+
foreach ($hrefUriNotCombinableList as $hrefUriNotCombinable) {
|
151 |
+
if (in_array($hrefUriNotCombinable, $combinedUriPaths)) {
|
152 |
+
$linkHrefUriKey = array_search($hrefUriNotCombinable, $combinedUriPaths);
|
153 |
unset($combinedUriPaths[$linkHrefUriKey]);
|
154 |
|
155 |
foreach (array_keys($localAssetsPaths) as $localAssetPathKey) {
|
156 |
+
if (substr($localAssetPathKey, -strlen($hrefUriNotCombinable)) === $hrefUriNotCombinable) {
|
157 |
unset($localAssetsPaths[$localAssetPathKey]);
|
158 |
}
|
159 |
}
|
160 |
|
161 |
foreach ($linkHrefs as $linkHrefKey => $linkHref) {
|
162 |
+
if (substr($linkHref, -strlen($hrefUriNotCombinable)) === $hrefUriNotCombinable) {
|
163 |
unset($linkHrefs[$linkHrefKey]);
|
164 |
}
|
165 |
}
|
204 |
|
205 |
$htmlSource = preg_replace('#<head>#si', '<head>'."\n" . $finalCssTag . "\n", $htmlSource, 1);
|
206 |
|
|
|
207 |
$htmlSource = CombineCommon::stripJustCombinedFileTags($linkHrefs, $htmlSource, 'css'); // Strip the combined files to avoid duplicate code
|
208 |
|
209 |
// There should be at least two replacements made
|
classes/Update.php
CHANGED
@@ -192,20 +192,23 @@ HTML;
|
|
192 |
*/
|
193 |
public function savePost($postId, $post = array())
|
194 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
195 |
// This is triggered only if the "Asset CleanUp" meta box was loaded with the list of assets
|
196 |
// Otherwise, $_POST[WPACU_PLUGIN_ID] will be taken as empty which might be not if there are values in the database
|
197 |
if (! (isset($_POST['wpacu_unload_assets_area_loaded']) && $_POST['wpacu_unload_assets_area_loaded'])) {
|
198 |
return;
|
199 |
}
|
200 |
|
201 |
-
if (empty($post)) {
|
202 |
-
global $post;
|
203 |
-
}
|
204 |
-
|
205 |
-
if (! isset($post->ID) || ! isset($post->post_type)) {
|
206 |
-
return;
|
207 |
-
}
|
208 |
-
|
209 |
// Has to be a public post type
|
210 |
$obj = get_post_type_object($post->post_type);
|
211 |
|
@@ -405,6 +408,29 @@ HTML;
|
|
405 |
}
|
406 |
}
|
407 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
408 |
/**
|
409 |
* Triggers either "saveToEverywhereUnloads" or "removeEverywhereUnloads" methods
|
410 |
*/
|
192 |
*/
|
193 |
public function savePost($postId, $post = array())
|
194 |
{
|
195 |
+
if (empty($post)) {
|
196 |
+
global $post;
|
197 |
+
}
|
198 |
+
|
199 |
+
if (! isset($post->ID) || ! isset($post->post_type)) {
|
200 |
+
return;
|
201 |
+
}
|
202 |
+
|
203 |
+
// Any page options set? From the Side Meta Box "Asset CleanUp Options"
|
204 |
+
$this->updatePageOptions($post->ID);
|
205 |
+
|
206 |
// This is triggered only if the "Asset CleanUp" meta box was loaded with the list of assets
|
207 |
// Otherwise, $_POST[WPACU_PLUGIN_ID] will be taken as empty which might be not if there are values in the database
|
208 |
if (! (isset($_POST['wpacu_unload_assets_area_loaded']) && $_POST['wpacu_unload_assets_area_loaded'])) {
|
209 |
return;
|
210 |
}
|
211 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
212 |
// Has to be a public post type
|
213 |
$obj = get_post_type_object($post->post_type);
|
214 |
|
408 |
}
|
409 |
}
|
410 |
|
411 |
+
/*
|
412 |
+
* This method should ONLY be triggered when the "Asset CleanUp Options" area is visible
|
413 |
+
*/
|
414 |
+
public function updatePageOptions($postId)
|
415 |
+
{
|
416 |
+
$pageOptions = array_key_exists(WPACU_PLUGIN_ID.'_page_options', $_POST)
|
417 |
+
? $_POST[WPACU_PLUGIN_ID.'_page_options']
|
418 |
+
: array();
|
419 |
+
|
420 |
+
// No page options? Delete any entry from the database to free up space
|
421 |
+
// instead of updating it as an empty entry
|
422 |
+
if (empty($pageOptions)) {
|
423 |
+
delete_post_meta($postId, '_' . WPACU_PLUGIN_ID . '_page_options');
|
424 |
+
return;
|
425 |
+
}
|
426 |
+
|
427 |
+
$pageOptionsJson = json_encode($pageOptions);
|
428 |
+
|
429 |
+
if (! add_post_meta($postId, '_' . WPACU_PLUGIN_ID . '_page_options', $pageOptionsJson, true)) {
|
430 |
+
update_post_meta($postId, '_' . WPACU_PLUGIN_ID . '_page_options', $pageOptionsJson);
|
431 |
+
}
|
432 |
+
}
|
433 |
+
|
434 |
/**
|
435 |
* Triggers either "saveToEverywhereUnloads" or "removeEverywhereUnloads" methods
|
436 |
*/
|
readme.txt
CHANGED
@@ -4,7 +4,7 @@ Tags: pagespeed, page speed, dequeue, performance, gtmetrix
|
|
4 |
Donate link: https://gabelivan.com/items/wp-asset-cleanup-pro/?utm_source=wp_org_lite&utm_medium=donate
|
5 |
Requires at least: 4.4
|
6 |
Tested up to: 5.0.3
|
7 |
-
Stable tag: 1.2.9.
|
8 |
License: GPLv3
|
9 |
License URI: http://www.gnu.org/licenses/gpl.html
|
10 |
|
@@ -131,6 +131,12 @@ With the recently released "Test Mode" feature, you can safely unload assets on
|
|
131 |
4. Scripts (.JS) are selected for site-wide unload
|
132 |
|
133 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
134 |
= 1.2.9.6 =
|
135 |
* Bug Fix: After post/page update, a fatal error was showing on calling a method that doesn't exist
|
136 |
|
4 |
Donate link: https://gabelivan.com/items/wp-asset-cleanup-pro/?utm_source=wp_org_lite&utm_medium=donate
|
5 |
Requires at least: 4.4
|
6 |
Tested up to: 5.0.3
|
7 |
+
Stable tag: 1.2.9.7
|
8 |
License: GPLv3
|
9 |
License URI: http://www.gnu.org/licenses/gpl.html
|
10 |
|
131 |
4. Scripts (.JS) are selected for site-wide unload
|
132 |
|
133 |
== Changelog ==
|
134 |
+
= 1.2.9.7 =
|
135 |
+
* Bug Fix: Prevent fatal error from showing in PHP 5.4 when the plugin was updated
|
136 |
+
* Re-organised the plugin's links within the Dashboard to make it easier to navigate through
|
137 |
+
* "Combine CSS files into one" feature update - CSS files having media="print" or media="only screen and (max-width: 768px)" (and so on) are not combined
|
138 |
+
* "Combine JS files into fewer ones" feature update - jQuery and jQuery Migrate are combined as a single group (not together with any other files); if only jQuery is loaded (without jQuery Migrate), it will not be added to any group and load independently
|
139 |
+
|
140 |
= 1.2.9.6 =
|
141 |
* Bug Fix: After post/page update, a fatal error was showing on calling a method that doesn't exist
|
142 |
|
templates/admin-page-settings-plugin.php
CHANGED
@@ -239,7 +239,7 @@ do_action('wpacu_admin_notices');
|
|
239 |
|
240 |
<div id="wpacu-setting-test-mode" class="wpacu-settings-tab-content">
|
241 |
<h2><?php _e('Test Mode', WPACU_PLUGIN_TEXT_DOMAIN); ?></h2>
|
242 |
-
<p>Have your visitors load without any Asset CleanUp settings while you're going through the plugin setup and unloading the useless CSS & JavaScript!</p>
|
243 |
<table class="wpacu-form-table">
|
244 |
<tr valign="top">
|
245 |
<th scope="row" class="setting_title">
|
@@ -294,13 +294,13 @@ do_action('wpacu_admin_notices');
|
|
294 |
</tr>
|
295 |
<tr valign="top">
|
296 |
<th scope="row" class="setting_title">
|
297 |
-
<label>Combine loaded JS (JavaScript) into
|
298 |
<p class="wpacu_subtitle"><small><em>Helps reducing the number of HTTP Requests even further</em></small></p>
|
299 |
</th>
|
300 |
<td>
|
301 |
<?php echo $availableForPro; ?> <small>* if /wp-content/cache/ directory is not writable for some reason, this feature will not work; requires the DOMDocument XML DOM Parser to be enabled in PHP (which it is by default) for maximum performance</small>
|
302 |
|
303 |
-
<p>This scans the remaining JavaScript files (left after cleaning up the unnecessary ones) from the <code><head></code> and <code><body></code> and combines them into
|
304 |
<p style="margin-bottom: -7px;">For maximum performance and making sure that no functionality is broken the following JavaScript files:</p>
|
305 |
<ul style="list-style: disc; margin-left: 25px; margin-bottom: 0;">
|
306 |
<li>Any script tag having "defer" or "async" attributes</li>
|
239 |
|
240 |
<div id="wpacu-setting-test-mode" class="wpacu-settings-tab-content">
|
241 |
<h2><?php _e('Test Mode', WPACU_PLUGIN_TEXT_DOMAIN); ?></h2>
|
242 |
+
<p>Have your visitors load the website without any Asset CleanUp settings while you're going through the plugin setup and unloading the useless CSS & JavaScript!</p>
|
243 |
<table class="wpacu-form-table">
|
244 |
<tr valign="top">
|
245 |
<th scope="row" class="setting_title">
|
294 |
</tr>
|
295 |
<tr valign="top">
|
296 |
<th scope="row" class="setting_title">
|
297 |
+
<label>Combine loaded JS (JavaScript) into fewer files?</label>
|
298 |
<p class="wpacu_subtitle"><small><em>Helps reducing the number of HTTP Requests even further</em></small></p>
|
299 |
</th>
|
300 |
<td>
|
301 |
<?php echo $availableForPro; ?> <small>* if /wp-content/cache/ directory is not writable for some reason, this feature will not work; requires the DOMDocument XML DOM Parser to be enabled in PHP (which it is by default) for maximum performance</small>
|
302 |
|
303 |
+
<p>This scans the remaining JavaScript files (left after cleaning up the unnecessary ones) from the <code><head></code> and <code><body></code> and combines them into fewer files. The combination is made in such a way that it will not interefere with any inline JavaScript code associated with any of the files. To be 100% sure everything works fine after activation, consider using "Yes, for logged-in administrators" so only you can see the updated page. If all looks good, you can later switch it to "Yes (for everyone)".</p>
|
304 |
<p style="margin-bottom: -7px;">For maximum performance and making sure that no functionality is broken the following JavaScript files:</p>
|
305 |
<ul style="list-style: disc; margin-left: 25px; margin-bottom: 0;">
|
306 |
<li>Any script tag having "defer" or "async" attributes</li>
|
templates/meta-box-page-options.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* No direct access to this file
|
4 |
+
*/
|
5 |
+
if (! isset($data)) {
|
6 |
+
exit;
|
7 |
+
}
|
8 |
+
?>
|
9 |
+
<div id="wpacu_meta_box_page_options_content">
|
10 |
+
<ul>
|
11 |
+
<li>
|
12 |
+
<label for="wpacu_page_options_no_css_optimize">
|
13 |
+
<input type="checkbox" <?php if (isset($data['page_options']['no_css_optimize']) && $data['page_options']['no_css_optimize']) { echo 'checked="checked"'; } ?>
|
14 |
+
id="wpacu_page_options_no_css_optimize"
|
15 |
+
name="<?php echo WPACU_PLUGIN_ID; ?>_page_options[no_css_optimize]"
|
16 |
+
value="1" />Do not combine CSS on this page
|
17 |
+
</label>
|
18 |
+
</li>
|
19 |
+
<li>
|
20 |
+
<label for="wpacu_page_options_no_js_optimize" style="color: rgba(51,51,51,.4);">
|
21 |
+
<input disabled="disabled"
|
22 |
+
type="checkbox"
|
23 |
+
id="wpacu_page_options_no_js_optimize"
|
24 |
+
name="<?php echo WPACU_PLUGIN_ID; ?>_page_options[no_js_optimize]"
|
25 |
+
value="1" />Do not combine JavaScript on this page (Available in Pro version)
|
26 |
+
</label>
|
27 |
+
</li>
|
28 |
+
<li>
|
29 |
+
<label for="wpacu_page_options_no_css_js_file_settings">
|
30 |
+
<input type="checkbox" <?php if (isset($data['page_options']['no_assets_settings']) && $data['page_options']['no_assets_settings']) { echo 'checked="checked"'; } ?>
|
31 |
+
id="wpacu_page_options_no_css_js_file_settings"
|
32 |
+
name="<?php echo WPACU_PLUGIN_ID; ?>_page_options[no_assets_settings]"
|
33 |
+
value="1" />Do not apply any CSS & JavaScript settings (including async, defer, load & unload rules) on this page
|
34 |
+
</label>
|
35 |
+
</li>
|
36 |
+
</ul>
|
37 |
+
</div>
|
wpacu.php
CHANGED
@@ -2,13 +2,13 @@
|
|
2 |
/*
|
3 |
* Plugin Name: Asset CleanUp: Page Speed Booster
|
4 |
* Plugin URI: https://wordpress.org/plugins/wp-asset-clean-up/
|
5 |
-
* Version: 1.2.9.
|
6 |
* Description: Prevent Chosen Scripts & Styles from loading in Posts/Pages to reduce HTTP Requests and have the website load faster
|
7 |
* Author: Gabriel Livan
|
8 |
* Author URI: http://gabelivan.com/
|
9 |
*/
|
10 |
|
11 |
-
define('WPACU_PLUGIN_VERSION', '1.2.9.
|
12 |
|
13 |
// Exit if accessed directly
|
14 |
if (! defined('ABSPATH')) {
|
2 |
/*
|
3 |
* Plugin Name: Asset CleanUp: Page Speed Booster
|
4 |
* Plugin URI: https://wordpress.org/plugins/wp-asset-clean-up/
|
5 |
+
* Version: 1.2.9.7
|
6 |
* Description: Prevent Chosen Scripts & Styles from loading in Posts/Pages to reduce HTTP Requests and have the website load faster
|
7 |
* Author: Gabriel Livan
|
8 |
* Author URI: http://gabelivan.com/
|
9 |
*/
|
10 |
|
11 |
+
define('WPACU_PLUGIN_VERSION', '1.2.9.7');
|
12 |
|
13 |
// Exit if accessed directly
|
14 |
if (! defined('ABSPATH')) {
|