PluginProbe
Autoptimize / trunk
Autoptimize vtrunk
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 +209 -36 2.7.6 → trunk 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',
@@ -585,8 +681,9 @@
585 681 'autoptimize_ccss_forcepath',
586 682 'autoptimize_ccss_deferjquery',
587 683 'autoptimize_ccss_domain',
588 684 'autoptimize_ccss_unloadccss',
685 + 'autoptimize_installed_before_compatibility',
589 686 );
590 687
591 688 if ( ! is_multisite() ) {
592 689 foreach ( $delete_options as $del_opt ) {
@@ -608,13 +705,20 @@
608 705 }
609 706
610 707 // Remove AO CCSS cached files and directory.
611 708 $ao_ccss_dir = WP_CONTENT_DIR . '/uploads/ao_ccss/';
612 - 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' ) ) {
613 710 // fixme: should check for subdirs when in multisite and remove contents of those as well.
614 - array_map( 'unlink', glob( AO_CCSS_DIR . '*.{css,html,json,log,zip,lock}', GLOB_BRACE ) );
615 - 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 );
616 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 + }
617 721 }
618 722
619 723 public static function on_deactivation()
620 724 {
@@ -634,9 +738,9 @@
634 738 }
635 739
636 740 public static function remove_cronjobs() {
637 741 // Remove scheduled events.
638 - 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 ) {
639 743 if ( wp_get_schedule( $_event ) ) {
640 744 wp_clear_scheduled_hook( $_event );
641 745 }
642 746 }
@@ -645,9 +749,9 @@
645 749 public static function notice_cache_unavailable()
646 750 {
647 751 echo '<div class="error"><p>';
648 752 // Translators: %s is the cache directory location.
649 - 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 );
650 754 echo '</p></div>';
651 755 }
652 756
653 757 public static function notice_installed()
@@ -652,9 +756,10 @@
652 756
653 757 public static function notice_installed()
654 758 {
655 759 echo '<div class="updated"><p>';
656 - _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>' );
657 762 echo '</p></div>';
658 763 }
659 764
660 765 public static function notice_updated()
@@ -659,9 +764,9 @@
659 764
660 765 public static function notice_updated()
661 766 {
662 767 echo '<div class="updated"><p>';
663 - _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>' );
664 769 echo '</p></div>';
665 770 }
666 771
667 772 public static function notice_plug_imgopt()
@@ -666,17 +771,85 @@
666 771
667 772 public static function notice_plug_imgopt()
668 773 {
669 774 // Translators: the URL added points to the Autopmize Extra settings.
670 - $_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>' );
671 776 $_ao_imgopt_plug_notice = apply_filters( 'autoptimize_filter_main_imgopt_plug_notice', $_ao_imgopt_plug_notice );
672 777 $_ao_imgopt_launch_ok = autoptimizeImages::launch_ok_wrapper();
673 778 $_ao_imgopt_plug_dismissible = 'ao-img-opt-plug-123';
674 779 $_ao_imgopt_active = autoptimizeImages::imgopt_active();
780 + $_is_ao_settings_page = autoptimizeUtils::is_ao_settings();
675 781
676 - 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 ) ) {
677 783 echo '<div class="notice notice-info is-dismissible" data-dismissible="' . $_ao_imgopt_plug_dismissible . '"><p>';
678 784 echo $_ao_imgopt_plug_notice;
679 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 + }
680 853 }
681 854 }
682 855 }