Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/litespee.../src
File: optimize.cls.php
[1000] Fix | Delete
if ($this->cfg_js_defer === 2) {
[1001] Fix | Delete
// Drop type attribute from $attrs
[1002] Fix | Delete
$attrs = Utility::remove_attr( $attrs, 'type' );
[1003] Fix | Delete
// Replace DOMContentLoaded
[1004] Fix | Delete
$con = str_replace('DOMContentLoaded', 'DOMContentLiteSpeedLoaded', $con);
[1005] Fix | Delete
return '<script' . $attrs . ' type="litespeed/javascript">' . $con . '</script>';
[1006] Fix | Delete
// return '<script' . $attrs . ' type="litespeed/javascript" src="data:text/javascript;base64,' . base64_encode( $con ) . '"></script>';
[1007] Fix | Delete
// return '<script' . $attrs . ' type="litespeed/javascript">' . $con . '</script>';
[1008] Fix | Delete
}
[1009] Fix | Delete
[1010] Fix | Delete
return '<script' . $attrs . ' src="data:text/javascript;base64,' . base64_encode($con) . '" defer></script>';
[1011] Fix | Delete
}
[1012] Fix | Delete
[1013] Fix | Delete
/**
[1014] Fix | Delete
* Replace ESI to JS inline var (mainly used to avoid nonce timeout)
[1015] Fix | Delete
*
[1016] Fix | Delete
* @since 3.5.1
[1017] Fix | Delete
*/
[1018] Fix | Delete
private function _preserve_esi( $con ) {
[1019] Fix | Delete
$esi_placeholder_list = $this->cls('ESI')->contain_preserve_esi($con);
[1020] Fix | Delete
if (!$esi_placeholder_list) {
[1021] Fix | Delete
return $con;
[1022] Fix | Delete
}
[1023] Fix | Delete
[1024] Fix | Delete
foreach ($esi_placeholder_list as $esi_placeholder) {
[1025] Fix | Delete
$js_var = '__litespeed_var_' . self::$_var_i++ . '__';
[1026] Fix | Delete
$con = str_replace($esi_placeholder, $js_var, $con);
[1027] Fix | Delete
$this->_var_preserve_js[] = $js_var . '=' . $esi_placeholder;
[1028] Fix | Delete
}
[1029] Fix | Delete
[1030] Fix | Delete
return $con;
[1031] Fix | Delete
}
[1032] Fix | Delete
[1033] Fix | Delete
/**
[1034] Fix | Delete
* Parse css src and remove to-be-removed css
[1035] Fix | Delete
*
[1036] Fix | Delete
* @since 1.2.2
[1037] Fix | Delete
* @access private
[1038] Fix | Delete
* @return array All the src & related raw html list
[1039] Fix | Delete
*/
[1040] Fix | Delete
private function _parse_css() {
[1041] Fix | Delete
$excludes = apply_filters('litespeed_optimize_css_excludes', $this->conf(self::O_OPTM_CSS_EXC));
[1042] Fix | Delete
$ucss_file_exc_inline = apply_filters('litespeed_optimize_ucss_file_exc_inline', $this->conf(self::O_OPTM_UCSS_FILE_EXC_INLINE));
[1043] Fix | Delete
[1044] Fix | Delete
// Append dummy css to exclude list
[1045] Fix | Delete
$excludes[] = 'litespeed-dummy.css';
[1046] Fix | Delete
[1047] Fix | Delete
$combine_ext_inl = $this->conf(self::O_OPTM_CSS_COMB_EXT_INL);
[1048] Fix | Delete
if (!apply_filters('litespeed_optm_css_comb_ext_inl', true)) {
[1049] Fix | Delete
self::debug2('css_comb_ext_inl bypassed via litespeed_optm_css_comb_ext_inl filter');
[1050] Fix | Delete
$combine_ext_inl = false;
[1051] Fix | Delete
}
[1052] Fix | Delete
[1053] Fix | Delete
$css_to_be_removed = apply_filters('litespeed_optm_css_to_be_removed', array());
[1054] Fix | Delete
[1055] Fix | Delete
$src_list = array();
[1056] Fix | Delete
$html_list = array();
[1057] Fix | Delete
[1058] Fix | Delete
// $dom = new \PHPHtmlParser\Dom;
[1059] Fix | Delete
// $dom->load( $content );return $val;
[1060] Fix | Delete
// $items = $dom->find( 'link' );
[1061] Fix | Delete
[1062] Fix | Delete
// V7 added: (?:\r\n?|\n?) to fix replacement leaving empty new line
[1063] Fix | Delete
$content = preg_replace(
[1064] Fix | Delete
array( '#<!--.*-->(?:\r\n?|\n?)#sU', '#<script([^>]*)>.*</script>(?:\r\n?|\n?)#isU', '#<noscript([^>]*)>.*</noscript>(?:\r\n?|\n?)#isU' ),
[1065] Fix | Delete
'',
[1066] Fix | Delete
$this->content
[1067] Fix | Delete
);
[1068] Fix | Delete
preg_match_all('#<link ([^>]+)/?>|<style([^>]*)>([^<]+)</style>(?:\r\n?|\n?)#isU', $content, $matches, PREG_SET_ORDER);
[1069] Fix | Delete
[1070] Fix | Delete
foreach ($matches as $match) {
[1071] Fix | Delete
// to avoid multiple replacement
[1072] Fix | Delete
if (in_array($match[0], $html_list)) {
[1073] Fix | Delete
continue;
[1074] Fix | Delete
}
[1075] Fix | Delete
[1076] Fix | Delete
if ($exclude = Utility::str_hit_array($match[0], $excludes)) {
[1077] Fix | Delete
self::debug2('_parse_css bypassed exclude ' . $exclude);
[1078] Fix | Delete
continue;
[1079] Fix | Delete
}
[1080] Fix | Delete
[1081] Fix | Delete
$this_src_arr = array();
[1082] Fix | Delete
if (strpos($match[0], '<link') === 0) {
[1083] Fix | Delete
$attrs = Utility::parse_attr($match[1]);
[1084] Fix | Delete
if (empty($attrs['rel']) || $attrs['rel'] !== 'stylesheet') {
[1085] Fix | Delete
continue;
[1086] Fix | Delete
}
[1087] Fix | Delete
if (empty($attrs['href'])) {
[1088] Fix | Delete
continue;
[1089] Fix | Delete
}
[1090] Fix | Delete
[1091] Fix | Delete
// Check if need to remove this css
[1092] Fix | Delete
if (Utility::str_hit_array($attrs['href'], $css_to_be_removed)) {
[1093] Fix | Delete
self::debug('rm css snippet ' . $attrs['href']);
[1094] Fix | Delete
// Delete this css snippet from orig html
[1095] Fix | Delete
$this->content = str_replace($match[0], '', $this->content);
[1096] Fix | Delete
[1097] Fix | Delete
continue;
[1098] Fix | Delete
}
[1099] Fix | Delete
[1100] Fix | Delete
// Check if need to inline this css file
[1101] Fix | Delete
if ($this->conf(self::O_OPTM_UCSS) && Utility::str_hit_array($attrs['href'], $ucss_file_exc_inline)) {
[1102] Fix | Delete
self::debug('ucss_file_exc_inline hit ' . $attrs['href']);
[1103] Fix | Delete
// Replace this css to inline from orig html
[1104] Fix | Delete
$inline_script = '<style>' . $this->__optimizer->load_file($attrs['href']) . '</style>';
[1105] Fix | Delete
$this->content = str_replace($match[0], $inline_script, $this->content);
[1106] Fix | Delete
[1107] Fix | Delete
continue;
[1108] Fix | Delete
}
[1109] Fix | Delete
[1110] Fix | Delete
// Check Google fonts hit
[1111] Fix | Delete
if (strpos($attrs['href'], 'fonts.googleapis.com') !== false) {
[1112] Fix | Delete
/**
[1113] Fix | Delete
* For async gg fonts, will add webfont into head, hence remove it from buffer and store the matches to use later
[1114] Fix | Delete
*
[1115] Fix | Delete
* @since 2.7.3
[1116] Fix | Delete
* @since 3.0 For font display optm, need to parse google fonts URL too
[1117] Fix | Delete
*/
[1118] Fix | Delete
if (!in_array($attrs['href'], $this->_ggfonts_urls)) {
[1119] Fix | Delete
$this->_ggfonts_urls[] = $attrs['href'];
[1120] Fix | Delete
}
[1121] Fix | Delete
[1122] Fix | Delete
if ($this->cfg_ggfonts_rm || $this->cfg_ggfonts_async) {
[1123] Fix | Delete
self::debug('rm css snippet [Google fonts] ' . $attrs['href']);
[1124] Fix | Delete
$this->content = str_replace($match[0], '', $this->content);
[1125] Fix | Delete
[1126] Fix | Delete
continue;
[1127] Fix | Delete
}
[1128] Fix | Delete
}
[1129] Fix | Delete
[1130] Fix | Delete
if (isset($attrs['data-optimized'])) {
[1131] Fix | Delete
// $this_src_arr[ 'exc' ] = true;
[1132] Fix | Delete
continue;
[1133] Fix | Delete
} elseif (!empty($attrs['data-no-optimize'])) {
[1134] Fix | Delete
// $this_src_arr[ 'exc' ] = true;
[1135] Fix | Delete
continue;
[1136] Fix | Delete
}
[1137] Fix | Delete
[1138] Fix | Delete
$is_internal = Utility::is_internal_file($attrs['href']);
[1139] Fix | Delete
$ext_excluded = !$combine_ext_inl && !$is_internal;
[1140] Fix | Delete
if ($ext_excluded) {
[1141] Fix | Delete
self::debug2('Bypassed due to external link');
[1142] Fix | Delete
// Maybe defer
[1143] Fix | Delete
if ($this->cfg_css_async) {
[1144] Fix | Delete
$snippet = $this->_async_css($match[0]);
[1145] Fix | Delete
if ($snippet != $match[0]) {
[1146] Fix | Delete
$this->content = str_replace($match[0], $snippet, $this->content);
[1147] Fix | Delete
}
[1148] Fix | Delete
}
[1149] Fix | Delete
[1150] Fix | Delete
continue;
[1151] Fix | Delete
}
[1152] Fix | Delete
[1153] Fix | Delete
if (!empty($attrs['media']) && $attrs['media'] !== 'all') {
[1154] Fix | Delete
$this_src_arr['media'] = $attrs['media'];
[1155] Fix | Delete
}
[1156] Fix | Delete
[1157] Fix | Delete
$this_src_arr['src'] = $attrs['href'];
[1158] Fix | Delete
} else {
[1159] Fix | Delete
// Inline style
[1160] Fix | Delete
if (!$combine_ext_inl) {
[1161] Fix | Delete
self::debug2('Bypassed due to inline');
[1162] Fix | Delete
continue;
[1163] Fix | Delete
}
[1164] Fix | Delete
[1165] Fix | Delete
$attrs = Utility::parse_attr($match[2]);
[1166] Fix | Delete
[1167] Fix | Delete
if (!empty($attrs['data-no-optimize'])) {
[1168] Fix | Delete
continue;
[1169] Fix | Delete
}
[1170] Fix | Delete
[1171] Fix | Delete
if (!empty($attrs['media']) && $attrs['media'] !== 'all') {
[1172] Fix | Delete
$this_src_arr['media'] = $attrs['media'];
[1173] Fix | Delete
}
[1174] Fix | Delete
[1175] Fix | Delete
$this_src_arr['inl'] = true;
[1176] Fix | Delete
$this_src_arr['src'] = $match[3];
[1177] Fix | Delete
}
[1178] Fix | Delete
[1179] Fix | Delete
$src_list[] = $this_src_arr;
[1180] Fix | Delete
[1181] Fix | Delete
$html_list[] = $match[0];
[1182] Fix | Delete
}
[1183] Fix | Delete
[1184] Fix | Delete
return array( $src_list, $html_list );
[1185] Fix | Delete
}
[1186] Fix | Delete
[1187] Fix | Delete
/**
[1188] Fix | Delete
* Replace css to async loaded css
[1189] Fix | Delete
*
[1190] Fix | Delete
* @since 1.3
[1191] Fix | Delete
* @access private
[1192] Fix | Delete
*/
[1193] Fix | Delete
private function _async_css_list( $html_list, $src_list ) {
[1194] Fix | Delete
foreach ($html_list as $k => $ori) {
[1195] Fix | Delete
if (!empty($src_list[$k]['inl'])) {
[1196] Fix | Delete
continue;
[1197] Fix | Delete
}
[1198] Fix | Delete
[1199] Fix | Delete
$html_list[$k] = $this->_async_css($ori);
[1200] Fix | Delete
}
[1201] Fix | Delete
return $html_list;
[1202] Fix | Delete
}
[1203] Fix | Delete
[1204] Fix | Delete
/**
[1205] Fix | Delete
* Async CSS snippet
[1206] Fix | Delete
*
[1207] Fix | Delete
* @since 3.5
[1208] Fix | Delete
*/
[1209] Fix | Delete
private function _async_css( $ori ) {
[1210] Fix | Delete
if (strpos($ori, 'data-asynced') !== false) {
[1211] Fix | Delete
self::debug2('bypass: attr data-asynced exist');
[1212] Fix | Delete
return $ori;
[1213] Fix | Delete
}
[1214] Fix | Delete
[1215] Fix | Delete
if (strpos($ori, 'data-no-async') !== false) {
[1216] Fix | Delete
self::debug2('bypass: attr api data-no-async');
[1217] Fix | Delete
return $ori;
[1218] Fix | Delete
}
[1219] Fix | Delete
[1220] Fix | Delete
// async replacement
[1221] Fix | Delete
$v = str_replace('stylesheet', 'preload', $ori);
[1222] Fix | Delete
$v = str_replace('<link', '<link data-asynced="1" as="style" onload="this.onload=null;this.rel=\'stylesheet\'" ', $v);
[1223] Fix | Delete
// Append to noscript content
[1224] Fix | Delete
if (!defined('LITESPEED_GUEST_OPTM') && !$this->conf(self::O_OPTM_NOSCRIPT_RM)) {
[1225] Fix | Delete
$v .= '<noscript>' . preg_replace('/ id=\'[\w-]+\' /U', ' ', $ori) . '</noscript>';
[1226] Fix | Delete
}
[1227] Fix | Delete
[1228] Fix | Delete
return $v;
[1229] Fix | Delete
}
[1230] Fix | Delete
[1231] Fix | Delete
/**
[1232] Fix | Delete
* Defer JS snippet
[1233] Fix | Delete
*
[1234] Fix | Delete
* @since 3.5
[1235] Fix | Delete
*/
[1236] Fix | Delete
private function _js_defer( $ori, $src ) {
[1237] Fix | Delete
$ori = Utility::remove_attr( $ori, 'async' );
[1238] Fix | Delete
[1239] Fix | Delete
if (strpos($ori, 'defer') !== false) {
[1240] Fix | Delete
return false;
[1241] Fix | Delete
}
[1242] Fix | Delete
if (strpos($ori, 'data-deferred') !== false) {
[1243] Fix | Delete
self::debug2('bypass: attr data-deferred exist');
[1244] Fix | Delete
return false;
[1245] Fix | Delete
}
[1246] Fix | Delete
if (strpos($ori, 'data-no-defer') !== false) {
[1247] Fix | Delete
self::debug2('bypass: attr api data-no-defer');
[1248] Fix | Delete
return false;
[1249] Fix | Delete
}
[1250] Fix | Delete
[1251] Fix | Delete
/**
[1252] Fix | Delete
* Exclude JS from setting
[1253] Fix | Delete
*
[1254] Fix | Delete
* @since 1.5
[1255] Fix | Delete
*/
[1256] Fix | Delete
if (Utility::str_hit_array($src, $this->cfg_js_defer_exc)) {
[1257] Fix | Delete
self::debug('js defer exclude ' . $src);
[1258] Fix | Delete
return false;
[1259] Fix | Delete
}
[1260] Fix | Delete
[1261] Fix | Delete
if ($this->cfg_js_defer === 2 || Utility::str_hit_array($src, $this->cfg_js_delay_inc)) {
[1262] Fix | Delete
$ori = Utility::remove_attr( $ori, 'type' );
[1263] Fix | Delete
return str_replace(' src=', ' type="litespeed/javascript" data-src=', $ori);
[1264] Fix | Delete
}
[1265] Fix | Delete
[1266] Fix | Delete
return str_replace('></script>', ' defer data-deferred="1"></script>', $ori);
[1267] Fix | Delete
}
[1268] Fix | Delete
[1269] Fix | Delete
/**
[1270] Fix | Delete
* Delay JS for included setting
[1271] Fix | Delete
*
[1272] Fix | Delete
* @since 5.6
[1273] Fix | Delete
*/
[1274] Fix | Delete
private function _js_delay( $ori, $src ) {
[1275] Fix | Delete
$ori = Utility::remove_attr( $ori, 'async' );
[1276] Fix | Delete
[1277] Fix | Delete
if (strpos($ori, 'defer') !== false) {
[1278] Fix | Delete
return false;
[1279] Fix | Delete
}
[1280] Fix | Delete
if (strpos($ori, 'data-deferred') !== false) {
[1281] Fix | Delete
self::debug2('bypass: attr data-deferred exist');
[1282] Fix | Delete
return false;
[1283] Fix | Delete
}
[1284] Fix | Delete
if (strpos($ori, 'data-no-defer') !== false) {
[1285] Fix | Delete
self::debug2('bypass: attr api data-no-defer');
[1286] Fix | Delete
return false;
[1287] Fix | Delete
}
[1288] Fix | Delete
[1289] Fix | Delete
if (!Utility::str_hit_array($src, $this->cfg_js_delay_inc)) {
[1290] Fix | Delete
return;
[1291] Fix | Delete
}
[1292] Fix | Delete
[1293] Fix | Delete
$ori = Utility::remove_attr( $ori, 'type' );
[1294] Fix | Delete
return str_replace(' src=', ' type="litespeed/javascript" data-src=', $ori);
[1295] Fix | Delete
}
[1296] Fix | Delete
}
[1297] Fix | Delete
[1298] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function