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 +224 -44 2.7.1 → 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 ) ) {
@@ -333,19 +381,8 @@
333 381 }
334 382 }
335 383 }
336 384
337 - // also honor PageSpeed=off parameter as used by mod_pagespeed, in use by some pagebuilders,
338 - // see https://www.modpagespeed.com/doc/experiment#ModPagespeed for info on that.
339 - if ( false === $ao_noptimize && array_key_exists( 'PageSpeed', $_GET ) && 'off' === $_GET['PageSpeed'] ) {
340 - $ao_noptimize = true;
341 - }
342 -
343 - // and make sure Thrive editor doesn't get optimized HTML.
344 - if ( false === $ao_noptimize && array_key_exists( 'tve', $_GET ) && 'true' === $_GET['tve'] ) {
345 - $ao_noptimize = true;
346 - }
347 -
348 385 // If setting says not to optimize logged in user and user is logged in...
349 386 if ( false === $ao_noptimize && 'on' !== autoptimizeOptionWrapper::get_option( 'autoptimize_optimize_logged', 'on' ) && is_user_logged_in() && current_user_can( 'edit_posts' ) ) {
350 387 $ao_noptimize = true;
351 388 }
@@ -360,9 +397,38 @@
360 397 }
361 398 }
362 399 }
363 400
364 - // Allows blocking of autoptimization on your own terms regardless of above decisions.
401 + // Misc. querystring paramaters that will stop AO from doing optimizations (pagebuilders +
402 + // 2 generic parameters that could/ should become standard between optimization plugins?).
403 + if ( false === $ao_noptimize ) {
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 ) ) {
413 + $ao_noptimize = true;
414 + break;
415 + }
416 + }
417 + }
418 +
419 + // Also honor PageSpeed=off parameter as used by mod_pagespeed, in use by some pagebuilders,
420 + // see https://www.modpagespeed.com/doc/experiment#ModPagespeed for info on that.
421 + if ( false === $ao_noptimize && array_key_exists( 'PageSpeed', $_GET ) && 'off' === $_GET['PageSpeed'] ) {
422 + $ao_noptimize = true;
423 + }
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 +
430 + // And finally allows blocking of autoptimization on your own terms regardless of above decisions.
365 431 $ao_noptimize = (bool) apply_filters( 'autoptimize_filter_noptimize', $ao_noptimize );
366 432
367 433 // Check for site being previewed in the Customizer (available since WP 4.0).
368 434 $is_customize_preview = false;
@@ -368,8 +434,14 @@
368 434 $is_customize_preview = false;
369 435 if ( function_exists( 'is_customize_preview' ) && is_customize_preview() ) {
370 436 $is_customize_preview = is_customize_preview();
371 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 + }
372 444
373 445 /**
374 446 * We only buffer the frontend requests (and then only if not a feed
375 447 * and not turned off explicitly and not when being previewed in Customizer)!
@@ -376,9 +448,9 @@
376 448 * NOTE: Tests throw a notice here due to is_feed() being called
377 449 * while the main query hasn't been ran yet. Thats why we use
378 450 * AUTOPTIMIZE_INIT_EARLIER in tests.
379 451 */
380 - $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 );
381 453 }
382 454
383 455 return $do_buffering;
384 456 }
@@ -424,16 +496,31 @@
424 496 * @return bool
425 497 */
426 498 public static function is_amp_markup( $content )
427 499 {
428 - // Short-circuit when a function is available to determine whether the response is (or will be) an AMP page.
429 - if ( function_exists( 'is_amp_endpoint' ) ) {
430 - 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;
431 513 }
432 514
433 - $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 + }
434 521
435 - return (bool) $is_amp_markup;
522 + return false;
436 523 }
437 524
438 525 /**
439 526 * Processes/optimizes the output-buffered content and returns it.
@@ -465,16 +552,18 @@
465 552 }
466 553
467 554 $classoptions = array(
468 555 'autoptimizeScripts' => array(
469 - 'aggregate' => $conf->get( 'autoptimize_js_aggregate' ),
470 - 'justhead' => $conf->get( 'autoptimize_js_justhead' ),
471 - 'forcehead' => $conf->get( 'autoptimize_js_forcehead' ),
472 - 'trycatch' => $conf->get( 'autoptimize_js_trycatch' ),
473 - 'js_exclude' => $conf->get( 'autoptimize_js_exclude' ),
474 - 'cdn_url' => $conf->get( 'autoptimize_cdn_url' ),
475 - 'include_inline' => $conf->get( 'autoptimize_js_include_inline' ),
476 - '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' ),
477 566 ),
478 567 'autoptimizeStyles' => array(
479 568 'aggregate' => $conf->get( 'autoptimize_css_aggregate' ),
480 569 'justhead' => $conf->get( 'autoptimize_css_justhead' ),
@@ -488,9 +577,10 @@
488 577 'nogooglefont' => $conf->get( 'autoptimize_css_nogooglefont' ),
489 578 'minify_excluded' => $conf->get( 'autoptimize_minify_excluded' ),
490 579 ),
491 580 'autoptimizeHTML' => array(
492 - 'keepcomments' => $conf->get( 'autoptimize_html_keepcomments' ),
581 + 'keepcomments' => $conf->get( 'autoptimize_html_keepcomments' ),
582 + 'minify_inline' => $conf->get( 'autoptimize_html_minify_inline' ),
493 583 ),
494 584 );
495 585
496 586 $content = apply_filters( 'autoptimize_filter_html_before_minify', $content );
@@ -526,10 +616,17 @@
526 616 }
527 617
528 618 public static function on_uninstall()
529 619 {
620 + // clear the cache.
530 621 autoptimizeCache::clearall();
531 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.
532 629 $delete_options = array(
533 630 'autoptimize_cache_clean',
534 631 'autoptimize_cache_nogzip',
535 632 'autoptimize_css',
@@ -541,11 +638,15 @@
541 638 'autoptimize_css_inline',
542 639 'autoptimize_css_exclude',
543 640 'autoptimize_html',
544 641 'autoptimize_html_keepcomments',
642 + 'autoptimize_html_minify_inline',
545 643 'autoptimize_enable_site_config',
644 + 'autoptimize_enable_meta_ao_settings',
546 645 'autoptimize_js',
547 646 'autoptimize_js_aggregate',
647 + 'autoptimize_js_defer_not_aggregate',
648 + 'autoptimize_js_defer_inline',
548 649 'autoptimize_js_exclude',
549 650 'autoptimize_js_forcehead',
550 651 'autoptimize_js_justhead',
551 652 'autoptimize_js_trycatch',
@@ -569,8 +670,9 @@
569 670 'autoptimize_ccss_queue',
570 671 'autoptimize_ccss_viewport',
571 672 'autoptimize_ccss_finclude',
572 673 'autoptimize_ccss_rlimit',
674 + 'autoptimize_ccss_rtimelimit',
573 675 'autoptimize_ccss_noptimize',
574 676 'autoptimize_ccss_debug',
575 677 'autoptimize_ccss_key',
576 678 'autoptimize_ccss_keyst',
@@ -578,8 +680,10 @@
578 680 'autoptimize_ccss_loggedin',
579 681 'autoptimize_ccss_forcepath',
580 682 'autoptimize_ccss_deferjquery',
581 683 'autoptimize_ccss_domain',
684 + 'autoptimize_ccss_unloadccss',
685 + 'autoptimize_installed_before_compatibility',
582 686 );
583 687
584 688 if ( ! is_multisite() ) {
585 689 foreach ( $delete_options as $del_opt ) {
@@ -601,13 +705,20 @@
601 705 }
602 706
603 707 // Remove AO CCSS cached files and directory.
604 708 $ao_ccss_dir = WP_CONTENT_DIR . '/uploads/ao_ccss/';
605 - 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' ) ) {
606 710 // fixme: should check for subdirs when in multisite and remove contents of those as well.
607 - array_map( 'unlink', glob( AO_CCSS_DIR . '*.{css,html,json,log,zip,lock}', GLOB_BRACE ) );
608 - 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 );
609 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 + }
610 721 }
611 722
612 723 public static function on_deactivation()
613 724 {
@@ -627,9 +738,9 @@
627 738 }
628 739
629 740 public static function remove_cronjobs() {
630 741 // Remove scheduled events.
631 - 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 ) {
632 743 if ( wp_get_schedule( $_event ) ) {
633 744 wp_clear_scheduled_hook( $_event );
634 745 }
635 746 }
@@ -638,9 +749,9 @@
638 749 public static function notice_cache_unavailable()
639 750 {
640 751 echo '<div class="error"><p>';
641 752 // Translators: %s is the cache directory location.
642 - 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 );
643 754 echo '</p></div>';
644 755 }
645 756
646 757 public static function notice_installed()
@@ -645,9 +756,10 @@
645 756
646 757 public static function notice_installed()
647 758 {
648 759 echo '<div class="updated"><p>';
649 - _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>' );
650 762 echo '</p></div>';
651 763 }
652 764
653 765 public static function notice_updated()
@@ -652,9 +764,9 @@
652 764
653 765 public static function notice_updated()
654 766 {
655 767 echo '<div class="updated"><p>';
656 - _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>' );
657 769 echo '</p></div>';
658 770 }
659 771
660 772 public static function notice_plug_imgopt()
@@ -659,17 +771,85 @@
659 771
660 772 public static function notice_plug_imgopt()
661 773 {
662 774 // Translators: the URL added points to the Autopmize Extra settings.
663 - $_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>' );
664 776 $_ao_imgopt_plug_notice = apply_filters( 'autoptimize_filter_main_imgopt_plug_notice', $_ao_imgopt_plug_notice );
665 777 $_ao_imgopt_launch_ok = autoptimizeImages::launch_ok_wrapper();
666 778 $_ao_imgopt_plug_dismissible = 'ao-img-opt-plug-123';
667 779 $_ao_imgopt_active = autoptimizeImages::imgopt_active();
780 + $_is_ao_settings_page = autoptimizeUtils::is_ao_settings();
668 781
669 - 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 ) ) {
670 783 echo '<div class="notice notice-info is-dismissible" data-dismissible="' . $_ao_imgopt_plug_dismissible . '"><p>';
671 784 echo $_ao_imgopt_plug_notice;
672 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 + }
673 853 }
674 854 }
675 855 }