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 +285 -52 2.6.0 → 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,14 +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' ) );
62 - add_action( 'autoptimize_setup_done', array( $this, 'maybe_run_ao_extra' ) );
63 - add_action( 'autoptimize_setup_done', array( $this, 'maybe_run_partners_tab' ) );
64 - add_action( 'autoptimize_setup_done', array( $this, 'maybe_run_criticalcss_tab' ) );
69 + add_action( 'autoptimize_setup_done', array( $this, 'maybe_run_ao_compat' ), 10 );
70 + add_action( 'autoptimize_setup_done', array( $this, 'maybe_run_ao_extra' ), 15 );
71 + add_action( 'autoptimize_setup_done', array( $this, 'maybe_run_admin_only_trinkets' ), 20 );
72 + add_action( 'autoptimize_setup_done', array( $this, 'maybe_run_criticalcss' ), 11 );
73 + add_action( 'autoptimize_setup_done', array( $this, 'maybe_run_notfound_fallback' ), 10 );
65 74
66 75 add_action( 'init', array( $this, 'load_textdomain' ) );
67 - add_action( 'admin_init', array( 'PAnD', 'init' ) );
68 76
69 77 if ( is_multisite() && is_admin() ) {
70 78 // Only if multisite and if in admin we want to check if we need to save options on network level.
71 79 add_action( 'init', 'autoptimizeOptionWrapper::check_multisite_on_saving_options' );
@@ -70,14 +78,11 @@
70 78 // Only if multisite and if in admin we want to check if we need to save options on network level.
71 79 add_action( 'init', 'autoptimizeOptionWrapper::check_multisite_on_saving_options' );
72 80 }
73 81
74 - register_activation_hook( $this->filepath, array( $this, 'on_activate' ) );
75 - }
76 -
77 - public function on_activate()
78 - {
82 + // register uninstall & deactivation hooks.
79 83 register_uninstall_hook( $this->filepath, 'autoptimizeMain::on_uninstall' );
84 + register_deactivation_hook( $this->filepath, 'autoptimizeMain::on_deactivation' );
80 85 }
81 86
82 87 public function load_textdomain()
83 88 {
@@ -185,11 +190,19 @@
185 190 }
186 191 }
187 192
188 193 // And disable Jetpack's site accelerator if JS or CSS opt. are active.
189 - if ( class_exists( 'Jetpack' ) && apply_filters( 'autoptimize_filter_main_disable_jetpack_cdn', true ) && ( $conf->get( 'autoptimize_js' ) || $conf->get( 'autoptimize_css' ) ) ) {
190 - 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 + }
191 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 );
192 205 }
193 206 } else {
194 207 add_action( 'admin_notices', 'autoptimizeMain::notice_cache_unavailable' );
195 208 }
@@ -204,27 +217,67 @@
204 217 $ao_extra->run();
205 218
206 219 // And show the imgopt notice.
207 220 add_action( 'admin_notices', 'autoptimizeMain::notice_plug_imgopt' );
221 + add_action( 'admin_notices', 'autoptimizeMain::notice_imgopt_issue' );
208 222 }
209 223 }
210 224
211 - public function maybe_run_partners_tab()
225 + public function maybe_run_admin_only_trinkets()
212 226 {
213 - // 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)!
214 228 if ( autoptimizeConfig::is_admin_and_not_ajax() ) {
215 229 new autoptimizePartners();
230 + new autoptimizeExitSurvey();
231 + new autoptimizeProTab();
216 232 }
217 233 }
218 234
219 - public function maybe_run_criticalcss_tab()
235 + public function criticalcss()
220 236 {
221 - // Loads criticalcss tab code if in admin (and not in admin-ajax.php)!
222 - if ( autoptimizeConfig::is_admin_and_not_ajax() && ! autoptimizeUtils::is_plugin_active( 'autoptimize-criticalcss/ao_criticss_aas.php' ) ) {
223 - new autoptimizeCriticalCSSSettings();
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;
224 241 }
225 242 }
226 243
244 + public function maybe_run_criticalcss()
245 + {
246 + // Loads criticalcss if the filter returns true & old power-up is not active.
247 + if ( apply_filters( 'autoptimize_filter_criticalcss_active', true ) && ! autoptimizeUtils::is_plugin_active( 'autoptimize-criticalcss/ao_criticss_aas.php' ) ) {
248 + $this->_criticalcss = new autoptimizeCriticalCSSBase();
249 + $this->_criticalcss->setup();
250 + $this->_criticalcss->load_requires();
251 + }
252 + }
253 +
254 + public function maybe_run_notfound_fallback()
255 + {
256 + if ( autoptimizeCache::do_fallback() ) {
257 + add_action( 'template_redirect', array( 'autoptimizeCache', 'wordpress_notfound_fallback' ) );
258 + }
259 + }
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 +
227 280 public function hook_page_cache_purge()
228 281 {
229 282 // hook into a collection of page cache purge actions if filter allows.
230 283 if ( apply_filters( 'autoptimize_filter_main_hookpagecachepurge', true ) ) {
@@ -328,19 +381,8 @@
328 381 }
329 382 }
330 383 }
331 384
332 - // also honor PageSpeed=off parameter as used by mod_pagespeed, in use by some pagebuilders,
333 - // see https://www.modpagespeed.com/doc/experiment#ModPagespeed for info on that.
334 - if ( false === $ao_noptimize && array_key_exists( 'PageSpeed', $_GET ) && 'off' === $_GET['PageSpeed'] ) {
335 - $ao_noptimize = true;
336 - }
337 -
338 - // and make sure Thrive editor doesn't get optimized HTML.
339 - if ( false === $ao_noptimize && array_key_exists( 'tve', $_GET ) && 'true' === $_GET['tve'] ) {
340 - $ao_noptimize = true;
341 - }
342 -
343 385 // If setting says not to optimize logged in user and user is logged in...
344 386 if ( false === $ao_noptimize && 'on' !== autoptimizeOptionWrapper::get_option( 'autoptimize_optimize_logged', 'on' ) && is_user_logged_in() && current_user_can( 'edit_posts' ) ) {
345 387 $ao_noptimize = true;
346 388 }
@@ -347,9 +389,9 @@
347 389
348 390 // If setting says not to optimize cart/checkout.
349 391 if ( false === $ao_noptimize && 'on' !== autoptimizeOptionWrapper::get_option( 'autoptimize_optimize_checkout', 'off' ) ) {
350 392 // Checking for woocommerce, easy digital downloads and wp ecommerce...
351 - foreach ( array( 'is_checkout', 'is_cart', 'edd_is_checkout', 'wpsc_is_cart', 'wpsc_is_checkout' ) as $func ) {
393 + foreach ( array( 'is_checkout', 'is_cart', 'is_account_page', 'edd_is_checkout', 'wpsc_is_cart', 'wpsc_is_checkout' ) as $func ) {
352 394 if ( function_exists( $func ) && $func() ) {
353 395 $ao_noptimize = true;
354 396 break;
355 397 }
@@ -355,9 +397,38 @@
355 397 }
356 398 }
357 399 }
358 400
359 - // 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.
360 431 $ao_noptimize = (bool) apply_filters( 'autoptimize_filter_noptimize', $ao_noptimize );
361 432
362 433 // Check for site being previewed in the Customizer (available since WP 4.0).
363 434 $is_customize_preview = false;
@@ -363,8 +434,14 @@
363 434 $is_customize_preview = false;
364 435 if ( function_exists( 'is_customize_preview' ) && is_customize_preview() ) {
365 436 $is_customize_preview = is_customize_preview();
366 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 + }
367 444
368 445 /**
369 446 * We only buffer the frontend requests (and then only if not a feed
370 447 * and not turned off explicitly and not when being previewed in Customizer)!
@@ -371,9 +448,9 @@
371 448 * NOTE: Tests throw a notice here due to is_feed() being called
372 449 * while the main query hasn't been ran yet. Thats why we use
373 450 * AUTOPTIMIZE_INIT_EARLIER in tests.
374 451 */
375 - $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 );
376 453 }
377 454
378 455 return $do_buffering;
379 456 }
@@ -419,16 +496,31 @@
419 496 * @return bool
420 497 */
421 498 public static function is_amp_markup( $content )
422 499 {
423 - // Short-circuit when a function is available to determine whether the response is (or will be) an AMP page.
424 - if ( function_exists( 'is_amp_endpoint' ) ) {
425 - 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;
426 513 }
427 514
428 - $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 + }
429 521
430 - return (bool) $is_amp_markup;
522 + return false;
431 523 }
432 524
433 525 /**
434 526 * Processes/optimizes the output-buffered content and returns it.
@@ -460,16 +552,18 @@
460 552 }
461 553
462 554 $classoptions = array(
463 555 'autoptimizeScripts' => array(
464 - 'aggregate' => $conf->get( 'autoptimize_js_aggregate' ),
465 - 'justhead' => $conf->get( 'autoptimize_js_justhead' ),
466 - 'forcehead' => $conf->get( 'autoptimize_js_forcehead' ),
467 - 'trycatch' => $conf->get( 'autoptimize_js_trycatch' ),
468 - 'js_exclude' => $conf->get( 'autoptimize_js_exclude' ),
469 - 'cdn_url' => $conf->get( 'autoptimize_cdn_url' ),
470 - 'include_inline' => $conf->get( 'autoptimize_js_include_inline' ),
471 - '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' ),
472 566 ),
473 567 'autoptimizeStyles' => array(
474 568 'aggregate' => $conf->get( 'autoptimize_css_aggregate' ),
475 569 'justhead' => $conf->get( 'autoptimize_css_justhead' ),
@@ -483,9 +577,10 @@
483 577 'nogooglefont' => $conf->get( 'autoptimize_css_nogooglefont' ),
484 578 'minify_excluded' => $conf->get( 'autoptimize_minify_excluded' ),
485 579 ),
486 580 'autoptimizeHTML' => array(
487 - 'keepcomments' => $conf->get( 'autoptimize_html_keepcomments' ),
581 + 'keepcomments' => $conf->get( 'autoptimize_html_keepcomments' ),
582 + 'minify_inline' => $conf->get( 'autoptimize_html_minify_inline' ),
488 583 ),
489 584 );
490 585
491 586 $content = apply_filters( 'autoptimize_filter_html_before_minify', $content );
@@ -521,10 +616,17 @@
521 616 }
522 617
523 618 public static function on_uninstall()
524 619 {
620 + // clear the cache.
525 621 autoptimizeCache::clearall();
526 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.
527 629 $delete_options = array(
528 630 'autoptimize_cache_clean',
529 631 'autoptimize_cache_nogzip',
530 632 'autoptimize_css',
@@ -536,11 +638,15 @@
536 638 'autoptimize_css_inline',
537 639 'autoptimize_css_exclude',
538 640 'autoptimize_html',
539 641 'autoptimize_html_keepcomments',
642 + 'autoptimize_html_minify_inline',
540 643 'autoptimize_enable_site_config',
644 + 'autoptimize_enable_meta_ao_settings',
541 645 'autoptimize_js',
542 646 'autoptimize_js_aggregate',
647 + 'autoptimize_js_defer_not_aggregate',
648 + 'autoptimize_js_defer_inline',
543 649 'autoptimize_js_exclude',
544 650 'autoptimize_js_forcehead',
545 651 'autoptimize_js_justhead',
546 652 'autoptimize_js_trycatch',
@@ -557,8 +663,27 @@
557 663 'autoptimize_imgopt_provider_stat',
558 664 'autoptimize_imgopt_launched',
559 665 'autoptimize_imgopt_settings',
560 666 'autoptimize_minify_excluded',
667 + 'autoptimize_cache_fallback',
668 + 'autoptimize_ccss_rules',
669 + 'autoptimize_ccss_additional',
670 + 'autoptimize_ccss_queue',
671 + 'autoptimize_ccss_viewport',
672 + 'autoptimize_ccss_finclude',
673 + 'autoptimize_ccss_rlimit',
674 + 'autoptimize_ccss_rtimelimit',
675 + 'autoptimize_ccss_noptimize',
676 + 'autoptimize_ccss_debug',
677 + 'autoptimize_ccss_key',
678 + 'autoptimize_ccss_keyst',
679 + 'autoptimize_ccss_version',
680 + 'autoptimize_ccss_loggedin',
681 + 'autoptimize_ccss_forcepath',
682 + 'autoptimize_ccss_deferjquery',
683 + 'autoptimize_ccss_domain',
684 + 'autoptimize_ccss_unloadccss',
685 + 'autoptimize_installed_before_compatibility',
561 686 );
562 687
563 688 if ( ! is_multisite() ) {
564 689 foreach ( $delete_options as $del_opt ) {
@@ -563,8 +688,9 @@
563 688 if ( ! is_multisite() ) {
564 689 foreach ( $delete_options as $del_opt ) {
565 690 delete_option( $del_opt );
566 691 }
692 + autoptimizeMain::remove_cronjobs();
567 693 } else {
568 694 global $wpdb;
569 695 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
570 696 $original_blog_id = get_current_blog_id();
@@ -572,22 +698,60 @@
572 698 switch_to_blog( $blog_id );
573 699 foreach ( $delete_options as $del_opt ) {
574 700 delete_option( $del_opt );
575 701 }
702 + autoptimizeMain::remove_cronjobs();
576 703 }
577 704 switch_to_blog( $original_blog_id );
578 705 }
579 706
580 - if ( wp_get_schedule( 'ao_cachechecker' ) ) {
581 - wp_clear_scheduled_hook( 'ao_cachechecker' );
707 + // Remove AO CCSS cached files and directory.
708 + $ao_ccss_dir = WP_CONTENT_DIR . '/uploads/ao_ccss/';
709 + if ( file_exists( $ao_ccss_dir ) && is_dir( $ao_ccss_dir ) && defined( 'GLOB_BRACE' ) ) {
710 + // fixme: should check for subdirs when in multisite and remove contents of those as well.
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 );
582 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 + }
583 721 }
584 722
723 + public static function on_deactivation()
724 + {
725 + if ( is_multisite() && is_network_admin() ) {
726 + global $wpdb;
727 + $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
728 + $original_blog_id = get_current_blog_id();
729 + foreach ( $blog_ids as $blog_id ) {
730 + switch_to_blog( $blog_id );
731 + autoptimizeMain::remove_cronjobs();
732 + }
733 + switch_to_blog( $original_blog_id );
734 + } else {
735 + autoptimizeMain::remove_cronjobs();
736 + }
737 + autoptimizeCache::clearall();
738 + }
739 +
740 + public static function remove_cronjobs() {
741 + // Remove scheduled events.
742 + foreach ( array( 'ao_cachechecker', 'ao_ccss_queue', 'ao_ccss_maintenance', 'ao_ccss_keychecker' ) as $_event ) {
743 + if ( wp_get_schedule( $_event ) ) {
744 + wp_clear_scheduled_hook( $_event );
745 + }
746 + }
747 + }
748 +
585 749 public static function notice_cache_unavailable()
586 750 {
587 751 echo '<div class="error"><p>';
588 752 // Translators: %s is the cache directory location.
589 - 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 );
590 754 echo '</p></div>';
591 755 }
592 756
593 757 public static function notice_installed()
@@ -592,9 +756,10 @@
592 756
593 757 public static function notice_installed()
594 758 {
595 759 echo '<div class="updated"><p>';
596 - _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>' );
597 762 echo '</p></div>';
598 763 }
599 764
600 765 public static function notice_updated()
@@ -599,9 +764,9 @@
599 764
600 765 public static function notice_updated()
601 766 {
602 767 echo '<div class="updated"><p>';
603 - _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>' );
604 769 echo '</p></div>';
605 770 }
606 771
607 772 public static function notice_plug_imgopt()
@@ -606,17 +771,85 @@
606 771
607 772 public static function notice_plug_imgopt()
608 773 {
609 774 // Translators: the URL added points to the Autopmize Extra settings.
610 - $_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>' );
611 776 $_ao_imgopt_plug_notice = apply_filters( 'autoptimize_filter_main_imgopt_plug_notice', $_ao_imgopt_plug_notice );
612 777 $_ao_imgopt_launch_ok = autoptimizeImages::launch_ok_wrapper();
613 778 $_ao_imgopt_plug_dismissible = 'ao-img-opt-plug-123';
614 779 $_ao_imgopt_active = autoptimizeImages::imgopt_active();
780 + $_is_ao_settings_page = autoptimizeUtils::is_ao_settings();
615 781
616 - 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 ) ) {
617 783 echo '<div class="notice notice-info is-dismissible" data-dismissible="' . $_ao_imgopt_plug_dismissible . '"><p>';
618 784 echo $_ao_imgopt_plug_notice;
619 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 + }
620 853 }
621 854 }
622 855 }