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/autoptimizeMain.php +210 -36 2.7.3 → 3.1.16 View file →
@@ -27,8 +27,15 @@
27 27 */
28 28 protected $filepath = null;
29 29
30 30 /**
31 + * Critical CSS base object
32 + *
33 + * @var object
34 + */
35 + protected $_criticalcss = null;
36 +
37 + /**
31 38 * Constructor.
32 39 *
33 40 * @param string $version Version.
34 41 * @param string $filepath Filepath. Needed for activation/deactivation/uninstall hooks.
@@ -58,15 +65,15 @@
58 65 add_action( AUTOPTIMIZE_SETUP_INITHOOK, array( $this, 'hook_page_cache_purge' ) );
59 66
60 67 add_action( 'autoptimize_setup_done', array( $this, 'version_upgrades_check' ) );
61 68 add_action( 'autoptimize_setup_done', array( $this, 'check_cache_and_run' ) );
69 + add_action( 'autoptimize_setup_done', array( $this, 'maybe_run_ao_compat' ), 10 );
62 70 add_action( 'autoptimize_setup_done', array( $this, 'maybe_run_ao_extra' ), 15 );
63 - add_action( 'autoptimize_setup_done', array( $this, 'maybe_run_partners_tab' ), 20 );
71 + add_action( 'autoptimize_setup_done', array( $this, 'maybe_run_admin_only_trinkets' ), 20 );
64 72 add_action( 'autoptimize_setup_done', array( $this, 'maybe_run_criticalcss' ), 11 );
65 73 add_action( 'autoptimize_setup_done', array( $this, 'maybe_run_notfound_fallback' ), 10 );
66 74
67 75 add_action( 'init', array( $this, 'load_textdomain' ) );
68 - add_action( 'admin_init', array( 'PAnD', 'init' ) );
69 76
70 77 if ( is_multisite() && is_admin() ) {
71 78 // Only if multisite and if in admin we want to check if we need to save options on network level.
72 79 add_action( 'init', 'autoptimizeOptionWrapper::check_multisite_on_saving_options' );
@@ -183,11 +190,19 @@
183 190 }
184 191 }
185 192
186 193 // And disable Jetpack's site accelerator if JS or CSS opt. are active.
187 - if ( class_exists( 'Jetpack' ) && apply_filters( 'autoptimize_filter_main_disable_jetpack_cdn', true ) && ( $conf->get( 'autoptimize_js' ) || $conf->get( 'autoptimize_css' ) ) ) {
188 - add_filter( 'jetpack_force_disable_site_accelerator', '__return_true' );
194 + if ( class_exists( 'Jetpack' ) && apply_filters( 'autoptimize_filter_main_disable_jetpack_cdn', true ) && ( $conf->get( 'autoptimize_js' ) || $conf->get( 'autoptimize_css' ) || autoptimizeImages::imgopt_active() ) ) {
195 + add_filter( 'jetpack_force_disable_site_accelerator', '__return_true' ); // this does not seemt to work any more?
196 + if ( true === autoptimizeImages::imgopt_active() ) {
197 + // only disable photon if AO is optimizing images.
198 + add_filter( 'jetpack_photon_skip_for_url', '__return_true' );
199 + }
189 200 }
201 +
202 + // Add "no cache found" notice.
203 + add_action( 'admin_notices', 'autoptimizeMain::notice_nopagecache', 99 );
204 + add_action( 'admin_notices', 'autoptimizeMain::notice_potential_conflict', 99 );
190 205 }
191 206 } else {
192 207 add_action( 'admin_notices', 'autoptimizeMain::notice_cache_unavailable' );
193 208 }
@@ -202,24 +217,38 @@
202 217 $ao_extra->run();
203 218
204 219 // And show the imgopt notice.
205 220 add_action( 'admin_notices', 'autoptimizeMain::notice_plug_imgopt' );
221 + add_action( 'admin_notices', 'autoptimizeMain::notice_imgopt_issue' );
206 222 }
207 223 }
208 224
209 - public function maybe_run_partners_tab()
225 + public function maybe_run_admin_only_trinkets()
210 226 {
211 - // Loads partners tab code if in admin (and not in admin-ajax.php)!
227 + // Loads partners tab and exit survey code if in admin (and not in admin-ajax.php)!
212 228 if ( autoptimizeConfig::is_admin_and_not_ajax() ) {
213 229 new autoptimizePartners();
230 + new autoptimizeExitSurvey();
231 + new autoptimizeProTab();
214 232 }
215 233 }
216 234
235 + public function criticalcss()
236 + {
237 + if ( apply_filters( 'autoptimize_filter_criticalcss_active', true ) && ! autoptimizeUtils::is_plugin_active( 'autoptimize-criticalcss/ao_criticss_aas.php' ) ) {
238 + return $this->_criticalcss;
239 + } else {
240 + return false;
241 + }
242 + }
243 +
217 244 public function maybe_run_criticalcss()
218 245 {
219 - // Loads criticalcss if the power-up is not active and if the filter returns true.
246 + // Loads criticalcss if the filter returns true & old power-up is not active.
220 247 if ( apply_filters( 'autoptimize_filter_criticalcss_active', true ) && ! autoptimizeUtils::is_plugin_active( 'autoptimize-criticalcss/ao_criticss_aas.php' ) ) {
221 - new autoptimizeCriticalCSSBase();
248 + $this->_criticalcss = new autoptimizeCriticalCSSBase();
249 + $this->_criticalcss->setup();
250 + $this->_criticalcss->load_requires();
222 251 }
223 252 }
224 253
225 254 public function maybe_run_notfound_fallback()
@@ -228,8 +257,27 @@
228 257 add_action( 'template_redirect', array( 'autoptimizeCache', 'wordpress_notfound_fallback' ) );
229 258 }
230 259 }
231 260
261 + public function maybe_run_ao_compat()
262 + {
263 + $conf = autoptimizeConfig::instance();
264 +
265 + // Condtionally loads the compatibility-class to ensure more out-of-the-box compatibility with big players.
266 + $_run_compat = true;
267 +
268 + if ( 'on' === $conf->get( 'autoptimize_installed_before_compatibility' ) ) {
269 + // If AO was already running before Compatibility logic was added, don't run compat by default
270 + // because it can be assumed everything works and we want to avoid (perf) regressions that
271 + // could occur due to compatibility code.
272 + $_run_compat = false;
273 + }
274 +
275 + if ( apply_filters( 'autoptimize_filter_init_compatibility', $_run_compat ) ) {
276 + new autoptimizeCompatibility();
277 + }
278 + }
279 +
232 280 public function hook_page_cache_purge()
233 281 {
234 282 // hook into a collection of page cache purge actions if filter allows.
235 283 if ( apply_filters( 'autoptimize_filter_main_hookpagecachepurge', true ) ) {
@@ -349,13 +397,20 @@
349 397 }
350 398 }
351 399 }
352 400
353 - // And make sure pagebuilder previews don't get optimized HTML/ JS/ CSS/ ...
401 + // Misc. querystring paramaters that will stop AO from doing optimizations (pagebuilders +
402 + // 2 generic parameters that could/ should become standard between optimization plugins?).
354 403 if ( false === $ao_noptimize ) {
355 - $_qs_pagebuilders = array( 'tve', 'elementor-preview', 'fl_builder', 'vc_action', 'et_fb', 'bt-beaverbuildertheme', 'ct_builder', 'fb-edit', 'siteorigin_panels_live_editor' );
356 - foreach ( $_qs_pagebuilders as $_pagebuilder ) {
357 - if ( array_key_exists( $_pagebuilder, $_GET ) ) {
404 + $_qs_showstoppers = array( 'no_cache', 'no_optimize', 'tve', 'elementor-preview', 'fl_builder', 'vc_action', 'et_fb', 'bt-beaverbuildertheme', 'ct_builder', 'fb-edit', 'siteorigin_panels_live_editor', 'preview', 'td_action' );
405 +
406 + // doing Jonathan a quick favor to allow correct unused CSS generation ;-) .
407 + if ( apply_filters( 'autoptimize_filter_main_showstoppers_do_wp_rocket_a_favor', true ) ) {
408 + $_qs_showstoppers[] = 'nowprocket';
409 + }
410 +
411 + foreach ( $_qs_showstoppers as $_showstopper ) {
412 + if ( array_key_exists( $_showstopper, $_GET ) ) {
358 413 $ao_noptimize = true;
359 414 break;
360 415 }
361 416 }
@@ -366,8 +421,13 @@
366 421 if ( false === $ao_noptimize && array_key_exists( 'PageSpeed', $_GET ) && 'off' === $_GET['PageSpeed'] ) {
367 422 $ao_noptimize = true;
368 423 }
369 424
425 + // If page/ post check post_meta to see if optimize is off.
426 + if ( false === autoptimizeConfig::get_post_meta_ao_settings( 'ao_post_optimize' ) ) {
427 + $ao_noptimize = true;
428 + }
429 +
370 430 // And finally allows blocking of autoptimization on your own terms regardless of above decisions.
371 431 $ao_noptimize = (bool) apply_filters( 'autoptimize_filter_noptimize', $ao_noptimize );
372 432
373 433 // Check for site being previewed in the Customizer (available since WP 4.0).
@@ -374,8 +434,14 @@
374 434 $is_customize_preview = false;
375 435 if ( function_exists( 'is_customize_preview' ) && is_customize_preview() ) {
376 436 $is_customize_preview = is_customize_preview();
377 437 }
438 +
439 + // explicitly disable when is_login exists and is true but don't use it direclty because older versions of WordPress don't have that yet.
440 + $is_login = false;
441 + if ( function_exists( 'is_login' ) && true === is_login() ) {
442 + $is_login = true;
443 + }
378 444
379 445 /**
380 446 * We only buffer the frontend requests (and then only if not a feed
381 447 * and not turned off explicitly and not when being previewed in Customizer)!
@@ -382,9 +448,9 @@
382 448 * NOTE: Tests throw a notice here due to is_feed() being called
383 449 * while the main query hasn't been ran yet. Thats why we use
384 450 * AUTOPTIMIZE_INIT_EARLIER in tests.
385 451 */
386 - $do_buffering = ( ! is_admin() && ! is_feed() && ! is_embed() && ! $ao_noptimize && ! $is_customize_preview );
452 + $do_buffering = ( ! is_admin() && ! is_feed() && ! is_embed() && ! $is_login && ! $is_customize_preview && ! $ao_noptimize );
387 453 }
388 454
389 455 return $do_buffering;
390 456 }
@@ -430,16 +496,31 @@
430 496 * @return bool
431 497 */
432 498 public static function is_amp_markup( $content )
433 499 {
434 - // Short-circuit when a function is available to determine whether the response is (or will be) an AMP page.
435 - if ( function_exists( 'is_amp_endpoint' ) ) {
436 - return is_amp_endpoint();
500 + // Short-circuit if the page is already AMP from the start.
501 + if (
502 + preg_match(
503 + sprintf(
504 + '#^(?:<!.*?>|\s+)*+<html(?=\s)[^>]*?\s(%1$s|%2$s|%3$s)(\s|=|>)#is',
505 + 'amp',
506 + "\xE2\x9A\xA1", // From \AmpProject\Attribute::AMP_EMOJI.
507 + "\xE2\x9A\xA1\xEF\xB8\x8F" // From \AmpProject\Attribute::AMP_EMOJI_ALT, per https://github.com/ampproject/amphtml/issues/25990.
508 + ),
509 + $content
510 + )
511 + ) {
512 + return true;
437 513 }
438 514
439 - $is_amp_markup = preg_match( '/<html[^>]*(?:amp|âš¡)/i', $content );
515 + // Or else short-circuit if the AMP plugin will be processing the output to be an AMP page.
516 + if ( function_exists( 'amp_is_request' ) ) {
517 + return amp_is_request(); // For AMP plugin v2.0+.
518 + } elseif ( function_exists( 'is_amp_endpoint' ) ) {
519 + return is_amp_endpoint(); // For older/other AMP plugins (still supported in 2.0 as an alias).
520 + }
440 521
441 - return (bool) $is_amp_markup;
522 + return false;
442 523 }
443 524
444 525 /**
445 526 * Processes/optimizes the output-buffered content and returns it.
@@ -471,16 +552,18 @@
471 552 }
472 553
473 554 $classoptions = array(
474 555 'autoptimizeScripts' => array(
475 - 'aggregate' => $conf->get( 'autoptimize_js_aggregate' ),
476 - 'justhead' => $conf->get( 'autoptimize_js_justhead' ),
477 - 'forcehead' => $conf->get( 'autoptimize_js_forcehead' ),
478 - 'trycatch' => $conf->get( 'autoptimize_js_trycatch' ),
479 - 'js_exclude' => $conf->get( 'autoptimize_js_exclude' ),
480 - 'cdn_url' => $conf->get( 'autoptimize_cdn_url' ),
481 - 'include_inline' => $conf->get( 'autoptimize_js_include_inline' ),
482 - 'minify_excluded' => $conf->get( 'autoptimize_minify_excluded' ),
556 + 'aggregate' => $conf->get( 'autoptimize_js_aggregate' ),
557 + 'defer_not_aggregate' => $conf->get( 'autoptimize_js_defer_not_aggregate' ),
558 + 'defer_inline' => $conf->get( 'autoptimize_js_defer_inline' ),
559 + 'justhead' => $conf->get( 'autoptimize_js_justhead' ),
560 + 'forcehead' => $conf->get( 'autoptimize_js_forcehead' ),
561 + 'trycatch' => $conf->get( 'autoptimize_js_trycatch' ),
562 + 'js_exclude' => $conf->get( 'autoptimize_js_exclude' ),
563 + 'cdn_url' => $conf->get( 'autoptimize_cdn_url' ),
564 + 'include_inline' => $conf->get( 'autoptimize_js_include_inline' ),
565 + 'minify_excluded' => $conf->get( 'autoptimize_minify_excluded' ),
483 566 ),
484 567 'autoptimizeStyles' => array(
485 568 'aggregate' => $conf->get( 'autoptimize_css_aggregate' ),
486 569 'justhead' => $conf->get( 'autoptimize_css_justhead' ),
@@ -494,9 +577,10 @@
494 577 'nogooglefont' => $conf->get( 'autoptimize_css_nogooglefont' ),
495 578 'minify_excluded' => $conf->get( 'autoptimize_minify_excluded' ),
496 579 ),
497 580 'autoptimizeHTML' => array(
498 - 'keepcomments' => $conf->get( 'autoptimize_html_keepcomments' ),
581 + 'keepcomments' => $conf->get( 'autoptimize_html_keepcomments' ),
582 + 'minify_inline' => $conf->get( 'autoptimize_html_minify_inline' ),
499 583 ),
500 584 );
501 585
502 586 $content = apply_filters( 'autoptimize_filter_html_before_minify', $content );
@@ -532,10 +616,17 @@
532 616 }
533 617
534 618 public static function on_uninstall()
535 619 {
620 + // clear the cache.
536 621 autoptimizeCache::clearall();
537 622
623 + // remove postmeta if active.
624 + if ( autoptimizeConfig::is_ao_meta_settings_active() ) {
625 + delete_post_meta_by_key( 'ao_post_optimize' );
626 + }
627 +
628 + // remove all options.
538 629 $delete_options = array(
539 630 'autoptimize_cache_clean',
540 631 'autoptimize_cache_nogzip',
541 632 'autoptimize_css',
@@ -547,11 +638,15 @@
547 638 'autoptimize_css_inline',
548 639 'autoptimize_css_exclude',
549 640 'autoptimize_html',
550 641 'autoptimize_html_keepcomments',
642 + 'autoptimize_html_minify_inline',
551 643 'autoptimize_enable_site_config',
644 + 'autoptimize_enable_meta_ao_settings',
552 645 'autoptimize_js',
553 646 'autoptimize_js_aggregate',
647 + 'autoptimize_js_defer_not_aggregate',
648 + 'autoptimize_js_defer_inline',
554 649 'autoptimize_js_exclude',
555 650 'autoptimize_js_forcehead',
556 651 'autoptimize_js_justhead',
557 652 'autoptimize_js_trycatch',
@@ -575,8 +670,9 @@
575 670 'autoptimize_ccss_queue',
576 671 'autoptimize_ccss_viewport',
577 672 'autoptimize_ccss_finclude',
578 673 'autoptimize_ccss_rlimit',
674 + 'autoptimize_ccss_rtimelimit',
579 675 'autoptimize_ccss_noptimize',
580 676 'autoptimize_ccss_debug',
581 677 'autoptimize_ccss_key',
582 678 'autoptimize_ccss_keyst',
@@ -584,8 +680,10 @@
584 680 'autoptimize_ccss_loggedin',
585 681 'autoptimize_ccss_forcepath',
586 682 'autoptimize_ccss_deferjquery',
587 683 'autoptimize_ccss_domain',
684 + 'autoptimize_ccss_unloadccss',
685 + 'autoptimize_installed_before_compatibility',
588 686 );
589 687
590 688 if ( ! is_multisite() ) {
591 689 foreach ( $delete_options as $del_opt ) {
@@ -607,13 +705,20 @@
607 705 }
608 706
609 707 // Remove AO CCSS cached files and directory.
610 708 $ao_ccss_dir = WP_CONTENT_DIR . '/uploads/ao_ccss/';
611 - if ( file_exists( $ao_ccss_dir ) && is_dir( $ao_ccss_dir ) ) {
709 + if ( file_exists( $ao_ccss_dir ) && is_dir( $ao_ccss_dir ) && defined( 'GLOB_BRACE' ) ) {
612 710 // fixme: should check for subdirs when in multisite and remove contents of those as well.
613 - array_map( 'unlink', glob( AO_CCSS_DIR . '*.{css,html,json,log,zip,lock}', GLOB_BRACE ) );
614 - rmdir( AO_CCSS_DIR );
711 + // fixme: if GLOB_BRACE is not avaible we need to remove AO_CCSS_DIR differently?
712 + array_map( 'unlink', glob( $ao_ccss_dir . '*.{css,html,json,log,zip,lock}', GLOB_BRACE ) );
713 + rmdir( $ao_ccss_dir );
615 714 }
715 +
716 + // Remove 404-handler (although that should have been removed in clearall already).
717 + $_fallback_php = trailingslashit( WP_CONTENT_DIR ) . 'autoptimize_404_handler.php';
718 + if ( file_exists( $_fallback_php ) ) {
719 + unlink( $_fallback_php );
720 + }
616 721 }
617 722
618 723 public static function on_deactivation()
619 724 {
@@ -633,9 +738,9 @@
633 738 }
634 739
635 740 public static function remove_cronjobs() {
636 741 // Remove scheduled events.
637 - foreach ( array( 'ao_cachechecker', 'ao_ccss_queue', 'ao_ccss_maintenance' ) as $_event ) {
742 + foreach ( array( 'ao_cachechecker', 'ao_ccss_queue', 'ao_ccss_maintenance', 'ao_ccss_keychecker' ) as $_event ) {
638 743 if ( wp_get_schedule( $_event ) ) {
639 744 wp_clear_scheduled_hook( $_event );
640 745 }
641 746 }
@@ -644,9 +749,9 @@
644 749 public static function notice_cache_unavailable()
645 750 {
646 751 echo '<div class="error"><p>';
647 752 // Translators: %s is the cache directory location.
648 - printf( __( 'Autoptimize cannot write to the cache directory (%s), please fix to enable CSS/ JS optimization!', 'autoptimize' ), AUTOPTIMIZE_CACHE_DIR );
753 + printf( esc_html__( 'Autoptimize cannot write to the cache directory (%s), please fix to enable CSS/ JS optimization!', 'autoptimize' ), AUTOPTIMIZE_CACHE_DIR );
649 754 echo '</p></div>';
650 755 }
651 756
652 757 public static function notice_installed()
@@ -651,9 +756,10 @@
651 756
652 757 public static function notice_installed()
653 758 {
654 759 echo '<div class="updated"><p>';
655 - _e( 'Thank you for installing and activating Autoptimize. Please configure it under "Settings" -> "Autoptimize" to start improving your site\'s performance.', 'autoptimize' );
760 + // translators: the variables contain opening and closing <a> tags to link to the settings page.
761 + printf( esc_html__( 'Thank you for installing and activating Autoptimize. Your site is being optimized immediately, please test the frontend to ensure everything still works as expected. If needed you can change JavaScript or CSS optimization settings under %1$sSettings -> Autoptimize%2$s .', 'autoptimize' ), '<a href="options-general.php?page=autoptimize">', '</a>' );
656 762 echo '</p></div>';
657 763 }
658 764
659 765 public static function notice_updated()
@@ -658,9 +764,9 @@
658 764
659 765 public static function notice_updated()
660 766 {
661 767 echo '<div class="updated"><p>';
662 - _e( 'Autoptimize has just been updated. Please <strong>test your site now</strong> and adapt Autoptimize config if needed.', 'autoptimize' );
768 + printf( esc_html__( 'Autoptimize has just been updated. Please %1$stest your site now%2$s and adapt Autoptimize config if needed.', 'autoptimize' ), '<strong>', '</strong>' );
663 769 echo '</p></div>';
664 770 }
665 771
666 772 public static function notice_plug_imgopt()
@@ -665,17 +771,85 @@
665 771
666 772 public static function notice_plug_imgopt()
667 773 {
668 774 // Translators: the URL added points to the Autopmize Extra settings.
669 - $_ao_imgopt_plug_notice = sprintf( __( 'Did you know Autoptimize includes on-the-fly image optimization (with support for WebP) and CDN via ShortPixel? Check out the %1$sAutoptimize Image settings%2$s to activate this option.', 'autoptimize' ), '<a href="options-general.php?page=autoptimize_imgopt">', '</a>' );
775 + $_ao_imgopt_plug_notice = sprintf( esc_html__( 'Did you know that Autoptimize offers on-the-fly image optimization (with support for WebP and AVIF) and CDN via ShortPixel? Check out the %1$sAutoptimize Image settings%2$s to enable this option.', 'autoptimize' ), '<a href="options-general.php?page=autoptimize_imgopt">', '</a>' );
670 776 $_ao_imgopt_plug_notice = apply_filters( 'autoptimize_filter_main_imgopt_plug_notice', $_ao_imgopt_plug_notice );
671 777 $_ao_imgopt_launch_ok = autoptimizeImages::launch_ok_wrapper();
672 778 $_ao_imgopt_plug_dismissible = 'ao-img-opt-plug-123';
673 779 $_ao_imgopt_active = autoptimizeImages::imgopt_active();
780 + $_is_ao_settings_page = autoptimizeUtils::is_ao_settings();
674 781
675 - if ( current_user_can( 'manage_options' ) && '' !== $_ao_imgopt_plug_notice && ! $_ao_imgopt_active && $_ao_imgopt_launch_ok && PAnD::is_admin_notice_active( $_ao_imgopt_plug_dismissible ) ) {
782 + if ( current_user_can( 'manage_options' ) && ! defined( 'AO_PRO_VERSION' ) && $_is_ao_settings_page && '' !== $_ao_imgopt_plug_notice && ! $_ao_imgopt_active && $_ao_imgopt_launch_ok && PAnD::is_admin_notice_active( $_ao_imgopt_plug_dismissible ) ) {
676 783 echo '<div class="notice notice-info is-dismissible" data-dismissible="' . $_ao_imgopt_plug_dismissible . '"><p>';
677 784 echo $_ao_imgopt_plug_notice;
678 785 echo '</p></div>';
786 + }
787 + }
788 +
789 + public static function notice_imgopt_issue()
790 + {
791 + // Translators: the URL added points to the Autopmize Extra settings.
792 + $_ao_imgopt_issue_notice = sprintf( esc_html__( 'Shortpixel reports it cannot always reach your site, which might mean some images are not optimized. You can %1$sread more about why this happens and how you can fix that problem here%2$s.', 'autoptimize' ), '<a href="https://shortpixel.com/knowledge-base/article/469-i-received-an-e-mail-that-says-some-of-my-images-are-not-accessible-what-should-i-do#fullarticle" target="_blank">', '</a>' );
793 + $_ao_imgopt_issue_notice = apply_filters( 'autoptimize_filter_main_imgopt_issue_notice', $_ao_imgopt_issue_notice );
794 + $_ao_imgopt_issue_dismissible = 'ao-img-opt-issue-14';
795 + $_ao_imgopt_active = autoptimizeImages::imgopt_active();
796 + $_ao_imgopt_status = autoptimizeOptionWrapper::get_option( 'autoptimize_imgopt_provider_stat', '' );
797 +
798 + if ( is_array( $_ao_imgopt_status ) && array_key_exists( 'TemporaryRedirectOrigin', $_ao_imgopt_status ) && ( $_ao_imgopt_status['TemporaryRedirectOrigin'] === "true" || $_ao_imgopt_status['TemporaryRedirectOrigin'] === true ) ) {
799 + $_ao_imgopt_status_redirect_warning = true;
800 + } else {
801 + $_ao_imgopt_status_redirect_warning = false;
802 + }
803 +
804 + if ( current_user_can( 'manage_options' ) && $_ao_imgopt_active && $_ao_imgopt_status_redirect_warning && '' !== $_ao_imgopt_issue_notice && PAnD::is_admin_notice_active( $_ao_imgopt_issue_dismissible ) ) {
805 + echo '<div class="notice notice-info is-dismissible" data-dismissible="' . $_ao_imgopt_issue_dismissible . '"><p>';
806 + echo $_ao_imgopt_issue_notice;
807 + echo '</p></div>';
808 + }
809 + }
810 +
811 +
812 + public static function notice_nopagecache()
813 + {
814 + /*
815 + * Autoptimize does not do page caching (yet) but not everyone knows, so below logic tries to find out if page caching is available and if not show a notice on the AO Settings pages.
816 + *
817 + * uses helper function in autoptimizeUtils.php
818 + */
819 + // translators: strong tags and a break.
820 + $_ao_nopagecache_notice = sprintf( esc_html__( 'It looks like your site might not have %1$spage caching%2$s which is a %1$smust-have for performance%2$s. If you are sure you have a page cache, you can close this notice.%3$sWhen in doubt check with your host if they offer this or install a free page caching plugin like for example KeyCDN Cache Enabler', 'autoptimize' ), '<strong>', '</strong>', '<br />' );
821 + // translators: strong tags.
822 + $_ao_nopagecache_notice .= ' ' . esc_html__('or consider ', 'autoptimize') . '<strong><a href="https://autoptimize.com/pro/">Autoptimize Pro</a></strong>' . sprintf( esc_html__( ' which not only has page caching but also image optimization, critical CSS and advanced booster options %1$sto make your site significantly faster%2$s!', 'autoptimize' ), '<strong>', '</strong>' );
823 + $_ao_nopagecache_dismissible = 'ao-nopagecache-forever'; // the notice is only shown once and will not re-appear when dismissed.
824 + $_is_ao_settings_page = autoptimizeUtils::is_ao_settings();
825 +
826 + if ( current_user_can( 'manage_options' ) && $_is_ao_settings_page && PAnD::is_admin_notice_active( $_ao_nopagecache_dismissible ) && true === apply_filters( 'autoptimize_filter_main_show_pagecache_notice', true ) ) {
827 + if ( false === autoptimizeUtils::find_pagecache() ) {
828 + echo '<div class="notice notice-info is-dismissible" data-dismissible="' . $_ao_nopagecache_dismissible . '"><p>';
829 + echo $_ao_nopagecache_notice;
830 + echo '</p></div>';
831 + }
832 + }
833 + }
834 +
835 + public static function notice_potential_conflict()
836 + {
837 + /*
838 + * Using other plugins to do CSS/ JS optimization can cause unexpected and hard to troubleshoot issues, warn users who seem to be in that situation.
839 + */
840 + // Translators: some strong tags + the sentence will be finished with the name of the offending plugin and a final stop.
841 + $_ao_potential_conflict_notice = sprintf( esc_html__( 'It looks like you have %1$sanother plugin also doing CSS and/ or JS optimization%2$s, which can result in hard to troubleshoot %1$sconflicts%2$s. For this reason it is recommended to disable this functionality in', 'autoptimize' ), '<strong>', '</strong>' ) . ' ';
842 + $_ao_potential_conflict_dismissible = 'ao-potential-conflict-forever'; // the notice is only shown once and will not re-appear when dismissed.
843 + $_is_ao_settings_page = autoptimizeUtils::is_ao_settings();
844 +
845 + if ( current_user_can( 'manage_options' ) && $_is_ao_settings_page && PAnD::is_admin_notice_active( $_ao_potential_conflict_dismissible ) && true === apply_filters( 'autoptimize_filter_main_show_potential_conclict_notice', true ) ) {
846 + $_potential_conflicts = autoptimizeUtils::find_potential_conflicts();
847 + if ( false !== $_potential_conflicts ) {
848 + $_ao_potential_conflict_notice .= '<strong>' . $_potential_conflicts . '</strong>.';
849 + echo '<div class="notice notice-info is-dismissible" data-dismissible="' . $_ao_potential_conflict_dismissible . '"><p>';
850 + echo $_ao_potential_conflict_notice;
851 + echo '</p></div>';
852 + }
679 853 }
680 854 }
681 855 }