PluginProbe
Autoptimize / 3.1.16
Autoptimize v3.1.16
3.1.16 2.2.2 2.3.0 2.3.1 2.3.2 2.3.3 2.3.4 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 All 108 releases
← All changes | classes/autoptimizeBase.php +46 -39 2.4.0 → 3.1.16 View file →
@@ -22,8 +22,15 @@
22 22 * @var bool
23 23 */
24 24 public $debug_log = false;
25 25
26 + /**
27 + * Initiated $cdn_url.
28 + *
29 + * @var string
30 + */
31 + public $cdn_url = '';
32 +
26 33 public function __construct( $content )
27 34 {
28 35 $this->content = $content;
29 36 }
@@ -69,8 +76,12 @@
69 76 public function getpath( $url )
70 77 {
71 78 $url = apply_filters( 'autoptimize_filter_cssjs_alter_url', $url );
72 79
80 + if ( is_null( $url ) ) {
81 + return false;
82 + }
83 +
73 84 if ( false !== strpos( $url, '%' ) ) {
74 85 $url = urldecode( $url );
75 86 }
76 87
@@ -87,8 +98,10 @@
87 98 }
88 99 } elseif ( ( false === $double_slash_position ) && ( false === strpos( $url, $site_host ) ) ) {
89 100 if ( AUTOPTIMIZE_WP_SITE_URL === $site_host ) {
90 101 $url = AUTOPTIMIZE_WP_SITE_URL . $url;
102 + } elseif ( 0 === strpos( $url, '/' ) ) {
103 + $url = '//' . $site_host . autoptimizeUtils::path_canonicalize( $url );
91 104 } else {
92 105 $url = AUTOPTIMIZE_WP_SITE_URL . autoptimizeUtils::path_canonicalize( $url );
93 106 }
94 107 }
@@ -137,8 +150,16 @@
137 150 // As we replaced the content-domain with the site-domain, we should match against that.
138 151 $tmp_ao_root = preg_replace( '/https?:/', '', AUTOPTIMIZE_WP_SITE_URL );
139 152 }
140 153
154 + if ( is_multisite() && ! is_main_site() && ! empty( $this->cdn_url ) && apply_filters( 'autoptimize_filter_base_getpage_multisite_cdn_juggling', true ) ) {
155 + // multisite child sites with CDN need the network_site_url as tmp_ao_root but only if directory-based multisite.
156 + $_network_site_url = network_site_url();
157 + if ( strpos( AUTOPTIMIZE_WP_SITE_URL, $_network_site_url ) !== false ) {
158 + $tmp_ao_root = preg_replace( '/https?:/', '', $_network_site_url );
159 + }
160 + }
161 +
141 162 $tmp_url = preg_replace( '/https?:/', '', $url );
142 163 $path = str_replace( $tmp_ao_root, '', $tmp_url );
143 164
144 165 // If path starts with :// or //, this is not a URL in the WP context and
@@ -148,10 +169,14 @@
148 169 return false;
149 170 }
150 171
151 172 // Prepend with WP_ROOT_DIR to have full path to file.
152 - $path = str_replace( '//', '/', WP_ROOT_DIR . $path );
173 + $path = str_replace( '//', '/', trailingslashit( WP_ROOT_DIR ) . $path );
153 174
175 + // Allow path to be altered, e.g. in the case of bedrock-like setups where
176 + // core, theme & plugins might be in different locations on the filesystem.
177 + $path = apply_filters( 'autoptimize_filter_base_getpath_path', $path, $url );
178 +
154 179 // Final check: does file exist and is it readable?
155 180 if ( file_exists( $path ) && is_file( $path ) && is_readable( $path ) ) {
156 181 return $path;
157 182 } else {
@@ -293,15 +318,14 @@
293 318 $cdn_url = autoptimizeUtils::tweak_cdn_url_if_needed( $this->cdn_url );
294 319
295 320 // Allows API/filter to further tweak the cdn url...
296 321 $cdn_url = apply_filters( 'autoptimize_filter_base_cdnurl', $cdn_url );
297 - if ( ! empty( $cdn_url ) ) {
298 - $this->debug_log( 'before=' . $url );
322 + if ( ! empty( $cdn_url ) && false === strpos( $url, $cdn_url ) && false !== apply_filters( 'autoptimize_filter_base_apply_cdn', true, $url ) ) {
299 323
300 324 // Simple str_replace-based approach fails when $url is protocol-or-host-relative.
301 325 $is_protocol_relative = autoptimizeUtils::is_protocol_relative( $url );
302 - $is_host_relative = ( ! $is_protocol_relative && ( '/' === $url{0} ) );
303 - $cdn_url = rtrim( $cdn_url, '/' );
326 + $is_host_relative = ( ! $is_protocol_relative && ( '/' === $url[0] ) );
327 + $cdn_url = esc_url( rtrim( $cdn_url, '/' ) );
304 328
305 329 if ( $is_host_relative ) {
306 330 // Prepending host-relative urls with the cdn url.
307 331 $url = $cdn_url . $url;
@@ -313,13 +337,10 @@
313 337 $site_url = str_replace( array( 'http:', 'https:' ), '', AUTOPTIMIZE_WP_SITE_URL );
314 338 } else {
315 339 $site_url = AUTOPTIMIZE_WP_SITE_URL;
316 340 }
317 - $this->debug_log( '`' . $site_url . '` -> `' . $cdn_url . '` in `' . $url . '`' );
318 341 $url = str_replace( $site_url, $cdn_url, $url );
319 342 }
320 -
321 - $this->debug_log( 'after=' . $url );
322 343 }
323 344
324 345 // Allow API filter to take further care of CDN replacement.
325 346 $url = apply_filters( 'autoptimize_filter_base_replace_cdn', $url );
@@ -416,11 +437,11 @@
416 437 $filepath = null;
417 438 $filehash = null;
418 439
419 440 // Grab the parts we need.
420 - $parts = explode( $matches[1], '|' );
441 + $parts = explode( '|', $matches[1] );
421 442 if ( ! empty( $parts ) ) {
422 - $filepath = isset( $parts[0] ) ? $parts[0] : null;
443 + $filepath = isset( $parts[0] ) ? base64_decode( $parts[0] ) : null;
423 444 $filehash = isset( $parts[1] ) ? $parts[1] : null;
424 445 }
425 446
426 447 // Bail early if something's not right...
@@ -484,9 +505,8 @@
484 505 */
485 506 protected function inject_minified( $in )
486 507 {
487 508 $out = $in;
488 -
489 509 if ( false !== strpos( $in, '%%INJECTLATER%%' ) ) {
490 510 $out = preg_replace_callback(
491 511 '#\/\*\!%%INJECTLATER' . AUTOPTIMIZE_HASH . '%%(.*?)%%INJECTLATER%%\*\/#is',
492 512 array( $this, 'inject_minified_callback' ),
@@ -559,9 +579,9 @@
559 579 * @param string $content Content to work on.
560 580 *
561 581 * @return string
562 582 */
563 - protected function replace_contents_with_marker_if_exists( $marker, $search, $re_replace_pattern, $content )
583 + public static function replace_contents_with_marker_if_exists( $marker, $search, $re_replace_pattern, $content )
564 584 {
565 585 $found = false;
566 586
567 587 $is_regex = autoptimizeUtils::str_is_valid_regex( $search );
@@ -578,8 +598,17 @@
578 598 return autoptimizeBase::build_marker( $marker, $matches[0] );
579 599 },
580 600 $content
581 601 );
602 +
603 + // Check for error (for example, an error can occur if $content is very large).
604 + if ( null === $content ) {
605 + $error_message = 'Autoptimize: preg_replace_callback() failed';
606 + if ( function_exists( 'preg_last_error_msg' ) ) {
607 + $error_message .= ': ' . preg_last_error_msg();
608 + }
609 + error_log( $error_message );
610 + }
582 611 }
583 612
584 613 return $content;
585 614 }
@@ -591,9 +620,9 @@
591 620 * @param string $content Markup.
592 621 *
593 622 * @return string
594 623 */
595 - protected function restore_marked_content( $marker, $content )
624 + public static function restore_marked_content( $marker, $content )
596 625 {
597 626 if ( false !== strpos( $content, $marker ) ) {
598 627 $content = preg_replace_callback(
599 628 '#%%' . $marker . AUTOPTIMIZE_HASH . '%%(.*?)%%' . $marker . '%%#is',
@@ -636,25 +665,23 @@
636 665 */
637 666 protected function prepare_minify_single( $filepath )
638 667 {
639 668 // Decide what we're dealing with, return false if we don't know.
640 - if ( $this->str_ends_in( $filepath, '.js' ) ) {
669 + if ( autoptimizeUtils::str_ends_in( $filepath, '.js' ) ) {
641 670 $type = 'js';
642 - } elseif ( $this->str_ends_in( $filepath, '.css' ) ) {
671 + } elseif ( autoptimizeUtils::str_ends_in( $filepath, '.css' ) ) {
643 672 $type = 'css';
644 673 } else {
645 674 return false;
646 675 }
647 676
648 - // Bail if it looks like its already minifed (by having -min or .min
649 - // in filename) or if it looks like WP jquery.js (which is minified).
677 + // Bail if it looks like its already minifed (by having -min or .min in filename).
650 678 $minified_variants = array(
651 679 '-min.' . $type,
652 680 '.min.' . $type,
653 - 'js/jquery/jquery.js',
654 681 );
655 682 foreach ( $minified_variants as $ending ) {
656 - if ( $this->str_ends_in( $filepath, $ending ) ) {
683 + if ( autoptimizeUtils::str_ends_in( $filepath, $ending ) && true === apply_filters( 'autoptimize_filter_base_prepare_exclude_minified', true ) ) {
657 684 return false;
658 685 }
659 686 }
660 687
@@ -679,26 +706,6 @@
679 706 // CDN-replace the resulting URL if needed...
680 707 $url = $this->url_replace_cdn( $url );
681 708
682 709 return $url;
683 - }
684 -
685 - /**
686 - * Returns true if given $str ends with given $test.
687 - *
688 - * @param string $str String to check.
689 - * @param string $test Ending to match.
690 - *
691 - * @return bool
692 - */
693 - protected function str_ends_in( $str, $test )
694 - {
695 - // @codingStandardsIgnoreStart
696 - // substr_compare() is bugged on 5.5.11: https://3v4l.org/qGYBH
697 - // return ( 0 === substr_compare( $str, $test, -strlen( $test ) ) );
698 - // @codingStandardsIgnoreEnd
699 -
700 - $length = strlen( $test );
701 -
702 - return ( substr( $str, -$length, $length ) === $test );
703 710 }
704 711 }