added maple performance caching plugin

This commit is contained in:
rodolfomartinez 2026-02-02 12:35:28 -05:00
parent c44c49a836
commit e468202f95
12 changed files with 4501 additions and 0 deletions

View file

@ -0,0 +1,801 @@
<?php
/**
* Plugin Compatibility Class
*
* Handles automatic detection and safe defaults for common plugins.
*
* @package MaplePerformance
*/
// Prevent direct access
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Compatibility class
*/
class Maple_Performance_Compat {
/**
* Single instance
*/
private static $instance = null;
/**
* Detected plugins (via auto-detect)
*/
private $detected = array();
/**
* Enabled plugins (manual selection or auto-detected)
*/
private $enabled = array();
/**
* Plugin settings
*/
private $settings = array();
/**
* Get instance
*/
public static function get_instance() {
if ( null === self::$instance ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Constructor
*/
private function __construct() {
$this->settings = maple_performance()->settings;
$this->determine_enabled_plugins();
$this->init_hooks();
}
/**
* Determine which plugins should have compatibility rules applied
*/
private function determine_enabled_plugins() {
// If auto-detect is enabled, detect plugins
if ( ! empty( $this->settings['compat_auto_detect'] ) ) {
$this->detect_plugins();
$this->enabled = $this->detected;
} else {
// Use manual selection
$manual = $this->settings['compat_plugins'] ?? array();
foreach ( $manual as $plugin ) {
$this->enabled[ $plugin ] = true;
}
}
}
/**
* Detect active plugins (used when auto-detect is enabled)
*/
private function detect_plugins() {
// WooCommerce
if ( class_exists( 'WooCommerce' ) || defined( 'WC_PLUGIN_FILE' ) ) {
$this->detected['woocommerce'] = true;
}
// LearnDash
if ( defined( 'LEARNDASH_VERSION' ) || class_exists( 'SFWD_LMS' ) ) {
$this->detected['learndash'] = true;
}
// WPForms
if ( defined( 'WPFORMS_VERSION' ) || class_exists( 'WPForms' ) ) {
$this->detected['wpforms'] = true;
}
// Wordfence
if ( defined( 'WORDFENCE_VERSION' ) || class_exists( 'wordfence' ) ) {
$this->detected['wordfence'] = true;
}
// Gutenberg FSE / Block Themes
if ( function_exists( 'wp_is_block_theme' ) && wp_is_block_theme() ) {
$this->detected['gutenberg_fse'] = true;
}
// Gravity Forms
if ( class_exists( 'GFForms' ) || defined( 'GF_MIN_WP_VERSION' ) ) {
$this->detected['gravityforms'] = true;
}
// Contact Form 7
if ( defined( 'WPCF7_VERSION' ) || class_exists( 'WPCF7' ) ) {
$this->detected['cf7'] = true;
}
// Elementor
if ( defined( 'ELEMENTOR_VERSION' ) ) {
$this->detected['elementor'] = true;
}
// === Caching plugin conflict detection ===
// WP Rocket
if ( defined( 'WP_ROCKET_VERSION' ) ) {
$this->detected['wp_rocket'] = true;
}
// W3 Total Cache
if ( defined( 'W3TC' ) || class_exists( 'W3_Plugin_TotalCache' ) ) {
$this->detected['w3tc'] = true;
}
// LiteSpeed Cache
if ( defined( 'LSCWP_V' ) || class_exists( 'LiteSpeed_Cache' ) ) {
$this->detected['litespeed'] = true;
}
// WP Super Cache
if ( defined( 'WPCACHEHOME' ) || function_exists( 'wp_cache_phase2' ) ) {
$this->detected['wp_super_cache'] = true;
}
// WP Fastest Cache
if ( class_exists( 'WpFastestCache' ) || defined( 'WPFC_WP_CONTENT_BASENAME' ) ) {
$this->detected['wp_fastest_cache'] = true;
}
// Autoptimize
if ( class_exists( 'autoptimizeMain' ) || defined( 'AUTOPTIMIZE_PLUGIN_VERSION' ) ) {
$this->detected['autoptimize'] = true;
}
// Cache Enabler
if ( class_exists( 'Cache_Enabler' ) || defined( 'CACHE_ENABLER_VERSION' ) ) {
$this->detected['cache_enabler'] = true;
}
// Hummingbird
if ( class_exists( 'WP_Hummingbird' ) || defined( 'WPHB_VERSION' ) ) {
$this->detected['hummingbird'] = true;
}
// Breeze (Cloudways)
if ( class_exists( 'Breeze_Admin' ) || defined( 'BREEZE_VERSION' ) ) {
$this->detected['breeze'] = true;
}
// SG Optimizer (SiteGround)
if ( class_exists( 'SiteGround_Optimizer' ) || defined( 'SG_OPTIMIZER_VERSION' ) ) {
$this->detected['sg_optimizer'] = true;
}
// Swift Performance
if ( class_exists( 'Swift_Performance' ) || defined( 'FLAVOR_FLAVOR' ) ) {
$this->detected['swift_performance'] = true;
}
// Comet Cache
if ( class_exists( 'WebSharks\\CometCache\\Classes\\Plugin' ) || defined( 'COMET_CACHE_VERSION' ) ) {
$this->detected['comet_cache'] = true;
}
// Powered Cache
if ( defined( 'POWERED_CACHE_VERSION' ) ) {
$this->detected['powered_cache'] = true;
}
// Perfmatters
if ( class_exists( 'Perfmatters' ) || defined( 'PERFMATTERS_VERSION' ) ) {
$this->detected['perfmatters'] = true;
}
}
/**
* Initialize hooks
*/
private function init_hooks() {
// Only apply filters if at least one plugin is enabled
if ( empty( $this->enabled ) ) {
// Still check for caching conflicts in admin
add_action( 'admin_notices', array( $this, 'conflict_notices' ) );
return;
}
// Filter exclusions based on enabled plugins
add_filter( 'maple_performance_js_exclusions', array( $this, 'add_js_exclusions' ) );
add_filter( 'maple_performance_css_exclusions', array( $this, 'add_css_exclusions' ) );
add_filter( 'maple_performance_path_exclusions', array( $this, 'add_path_exclusions' ) );
add_filter( 'maple_performance_cookie_exclusions', array( $this, 'add_cookie_exclusions' ) );
// Add admin notice for conflicts
add_action( 'admin_notices', array( $this, 'conflict_notices' ) );
// WooCommerce specific hooks
if ( $this->is_enabled( 'woocommerce' ) ) {
$this->init_woocommerce_compat();
}
// LearnDash specific hooks
if ( $this->is_enabled( 'learndash' ) ) {
$this->init_learndash_compat();
}
// WPForms specific hooks
if ( $this->is_enabled( 'wpforms' ) ) {
$this->init_wpforms_compat();
}
// Wordfence specific hooks
if ( $this->is_enabled( 'wordfence' ) ) {
$this->init_wordfence_compat();
}
// Gutenberg FSE specific hooks
if ( $this->is_enabled( 'gutenberg_fse' ) ) {
$this->init_gutenberg_fse_compat();
}
}
/**
* Check if plugin compatibility is enabled (either via auto-detect or manual)
*/
public function is_enabled( $plugin ) {
return ! empty( $this->enabled[ $plugin ] );
}
/**
* Check if plugin was detected (for display purposes)
*/
public function is_detected( $plugin ) {
return ! empty( $this->detected[ $plugin ] );
}
/**
* Get all detected plugins
*/
public function get_detected() {
// Always run detection for display in admin
if ( empty( $this->detected ) ) {
$this->detect_plugins();
}
return $this->detected;
}
/**
* Get all enabled plugins
*/
public function get_enabled() {
return $this->enabled;
}
/**
* Add JS exclusions for enabled plugins
*/
public function add_js_exclusions( $exclusions ) {
// WooCommerce
if ( $this->is_enabled( 'woocommerce' ) ) {
$exclusions = array_merge( $exclusions, array(
'woocommerce',
'wc-',
'wc_',
'jquery-blockui',
'selectWoo',
'select2',
'js-cookie',
'cart-fragments',
'checkout',
'add-to-cart',
'payment',
'stripe',
'paypal',
'square',
'braintree',
) );
}
// LearnDash
if ( $this->is_enabled( 'learndash' ) ) {
$exclusions = array_merge( $exclusions, array(
'learndash',
'sfwd-',
'sfwd_',
'ld-',
'ld_',
'ldlms',
'quiz',
'wpProQuiz',
) );
}
// WPForms
if ( $this->is_enabled( 'wpforms' ) ) {
$exclusions = array_merge( $exclusions, array(
'wpforms',
'wpforms-',
'jquery-validation',
'mailcheck',
'inputmask',
) );
}
// Wordfence
if ( $this->is_enabled( 'wordfence' ) ) {
$exclusions = array_merge( $exclusions, array(
'wordfence',
'wf-',
'wfls-',
) );
}
// Gutenberg FSE / Block Themes
if ( $this->is_enabled( 'gutenberg_fse' ) ) {
$exclusions = array_merge( $exclusions, array(
'wp-block-',
'wp-edit-',
) );
}
// Gravity Forms
if ( $this->is_enabled( 'gravityforms' ) ) {
$exclusions = array_merge( $exclusions, array(
'gform',
'gravityforms',
'gf_',
) );
}
// Contact Form 7
if ( $this->is_enabled( 'cf7' ) ) {
$exclusions = array_merge( $exclusions, array(
'contact-form-7',
'wpcf7',
) );
}
// Elementor
if ( $this->is_enabled( 'elementor' ) ) {
$exclusions = array_merge( $exclusions, array(
'elementor-',
'elementor_',
) );
}
return array_unique( $exclusions );
}
/**
* Add CSS exclusions for enabled plugins
*/
public function add_css_exclusions( $exclusions ) {
// LearnDash - Focus Mode CSS should load normally
if ( $this->is_enabled( 'learndash' ) ) {
$exclusions = array_merge( $exclusions, array(
'learndash-front',
'sfwd-',
) );
}
// WPForms
if ( $this->is_enabled( 'wpforms' ) ) {
$exclusions = array_merge( $exclusions, array(
'wpforms',
) );
}
// Gutenberg FSE / Block Themes - protect global styles
if ( $this->is_enabled( 'gutenberg_fse' ) ) {
$exclusions = array_merge( $exclusions, array(
'global-styles',
'wp-block-',
'core-block-',
) );
}
return array_unique( $exclusions );
}
/**
* Add path exclusions for enabled plugins
*/
public function add_path_exclusions( $exclusions ) {
// WooCommerce
if ( $this->is_enabled( 'woocommerce' ) ) {
$exclusions = array_merge( $exclusions, array(
'/cart/',
'/cart',
'/checkout/',
'/checkout',
'/my-account/',
'/my-account',
'/wc-api/',
'/order-received/',
'/order-pay/',
'/view-order/',
'/add-to-cart=',
'?add-to-cart=',
'?remove_item=',
'?removed_item=',
) );
}
// LearnDash
if ( $this->is_enabled( 'learndash' ) ) {
$exclusions = array_merge( $exclusions, array(
'/lessons/',
'/topic/',
'/quiz/',
'/quizzes/',
'/certificates/',
'/sfwd-',
) );
}
// Wordfence
if ( $this->is_enabled( 'wordfence' ) ) {
$exclusions = array_merge( $exclusions, array(
'/wp-login.php',
'?wfls-',
) );
}
return array_unique( $exclusions );
}
/**
* Add cookie exclusions for enabled plugins
*/
public function add_cookie_exclusions( $exclusions ) {
// WooCommerce
if ( $this->is_enabled( 'woocommerce' ) ) {
$exclusions = array_merge( $exclusions, array(
'woocommerce_items_in_cart',
'woocommerce_cart_hash',
'wp_woocommerce_session_',
'woocommerce_recently_viewed',
) );
}
// Wordfence
if ( $this->is_enabled( 'wordfence' ) ) {
$exclusions = array_merge( $exclusions, array(
'wfCBLBypass',
'wf_loginalerted_',
) );
}
return array_unique( $exclusions );
}
/**
* Initialize WooCommerce compatibility
*/
private function init_woocommerce_compat() {
// Don't cache cart fragments AJAX
add_action( 'wc_ajax_get_refreshed_fragments', array( $this, 'disable_caching' ), 1 );
add_action( 'wc_ajax_add_to_cart', array( $this, 'disable_caching' ), 1 );
add_action( 'wc_ajax_remove_from_cart', array( $this, 'disable_caching' ), 1 );
add_action( 'wc_ajax_apply_coupon', array( $this, 'disable_caching' ), 1 );
add_action( 'wc_ajax_remove_coupon', array( $this, 'disable_caching' ), 1 );
add_action( 'wc_ajax_update_shipping_method', array( $this, 'disable_caching' ), 1 );
add_action( 'wc_ajax_checkout', array( $this, 'disable_caching' ), 1 );
// Clear cache on stock changes
add_action( 'woocommerce_product_set_stock', array( $this, 'clear_product_cache' ) );
add_action( 'woocommerce_variation_set_stock', array( $this, 'clear_product_cache' ) );
// Clear cache on order status changes (affects stock)
add_action( 'woocommerce_order_status_changed', array( $this, 'clear_on_order_status' ), 10, 3 );
// Exclude WooCommerce pages from optimization
add_filter( 'maple_performance_exclude_optimization', array( $this, 'exclude_woo_pages' ) );
}
/**
* Initialize LearnDash compatibility
*/
private function init_learndash_compat() {
// Don't cache any LearnDash AJAX
add_action( 'wp_ajax_learndash_mark_complete', array( $this, 'disable_caching' ), 1 );
add_action( 'wp_ajax_ld_adv_quiz_result', array( $this, 'disable_caching' ), 1 );
add_action( 'wp_ajax_wpProQuiz_admin_ajax', array( $this, 'disable_caching' ), 1 );
// Clear cache on course enrollment/completion
add_action( 'learndash_course_completed', array( $this, 'clear_learndash_user_cache' ), 10, 1 );
add_action( 'learndash_lesson_completed', array( $this, 'clear_learndash_user_cache' ), 10, 1 );
add_action( 'learndash_topic_completed', array( $this, 'clear_learndash_user_cache' ), 10, 1 );
add_action( 'learndash_quiz_completed', array( $this, 'clear_learndash_user_cache' ), 10, 2 );
// Clear cache when user is enrolled
add_action( 'learndash_update_course_access', array( $this, 'clear_course_cache' ), 10, 4 );
}
/**
* Initialize WPForms compatibility
*/
private function init_wpforms_compat() {
// WPForms AJAX is generally fine, but ensure it's not cached
add_action( 'wp_ajax_wpforms_submit', array( $this, 'disable_caching' ), 1 );
add_action( 'wp_ajax_nopriv_wpforms_submit', array( $this, 'disable_caching' ), 1 );
add_action( 'wp_ajax_wpforms_file_upload_speed_test', array( $this, 'disable_caching' ), 1 );
add_action( 'wp_ajax_nopriv_wpforms_file_upload_speed_test', array( $this, 'disable_caching' ), 1 );
add_action( 'wp_ajax_wpforms_restricted_email', array( $this, 'disable_caching' ), 1 );
add_action( 'wp_ajax_nopriv_wpforms_restricted_email', array( $this, 'disable_caching' ), 1 );
}
/**
* Initialize Wordfence compatibility
*/
private function init_wordfence_compat() {
// Don't interfere with Wordfence login security
add_action( 'wp_ajax_nopriv_wordfence_ls_authenticate', array( $this, 'disable_caching' ), 1 );
add_action( 'wp_ajax_wordfence_ls_authenticate', array( $this, 'disable_caching' ), 1 );
// Don't cache Wordfence blocked pages
if ( defined( 'WORDFENCE_BLOCKED' ) && WORDFENCE_BLOCKED ) {
add_filter( 'maple_performance_should_cache', '__return_false' );
}
// Respect Wordfence's caching headers
add_filter( 'maple_performance_should_cache', array( $this, 'check_wordfence_bypass' ) );
}
/**
* Initialize Gutenberg FSE / Block Theme compatibility
*/
private function init_gutenberg_fse_compat() {
// Don't aggregate global styles inline CSS
add_filter( 'maple_performance_aggregate_inline_css', '__return_false' );
// Protect block editor assets on frontend
add_filter( 'maple_performance_exclude_optimization', array( $this, 'exclude_block_editor_frontend' ) );
}
/**
* Exclude block editor frontend from aggressive optimization
*/
public function exclude_block_editor_frontend( $exclude ) {
// If viewing a page with blocks that need JS interaction
// This is conservative - most block content is static
return $exclude;
}
/**
* Disable caching for current request
*/
public function disable_caching() {
if ( ! defined( 'DONOTCACHEPAGE' ) ) {
define( 'DONOTCACHEPAGE', true );
}
}
/**
* Clear product cache
*/
public function clear_product_cache( $product ) {
if ( ! class_exists( 'Maple_Performance_Cache' ) ) {
return;
}
$product_id = is_numeric( $product ) ? $product : $product->get_id();
$url = get_permalink( $product_id );
if ( $url ) {
$cache = Maple_Performance_Cache::get_instance();
$cache->clear_url_cache( $url );
}
// Also clear shop page
$shop_url = function_exists( 'wc_get_page_permalink' ) ? wc_get_page_permalink( 'shop' ) : '';
if ( $shop_url ) {
$cache->clear_url_cache( $shop_url );
}
}
/**
* Clear cache on order status change
*/
public function clear_on_order_status( $order_id, $old_status, $new_status ) {
// Only clear when status changes might affect stock
$stock_statuses = array( 'completed', 'processing', 'cancelled', 'refunded' );
if ( in_array( $new_status, $stock_statuses ) || in_array( $old_status, $stock_statuses ) ) {
$order = wc_get_order( $order_id );
if ( $order ) {
foreach ( $order->get_items() as $item ) {
$product_id = $item->get_product_id();
$this->clear_product_cache( $product_id );
}
}
}
}
/**
* Exclude WooCommerce pages from JS/CSS optimization
*/
public function exclude_woo_pages( $exclude ) {
if ( function_exists( 'is_cart' ) && is_cart() ) {
return true;
}
if ( function_exists( 'is_checkout' ) && is_checkout() ) {
return true;
}
if ( function_exists( 'is_account_page' ) && is_account_page() ) {
return true;
}
return $exclude;
}
/**
* Clear LearnDash user-related cache
*/
public function clear_learndash_user_cache( $data ) {
// LearnDash pages are user-specific and already excluded for logged-in users
// But we can clear the course archive pages
if ( ! class_exists( 'Maple_Performance_Cache' ) ) {
return;
}
$cache = Maple_Performance_Cache::get_instance();
// Clear course archive
$course_archive = get_post_type_archive_link( 'sfwd-courses' );
if ( $course_archive ) {
$cache->clear_url_cache( $course_archive );
}
// Clear home page (might show course counts)
$cache->clear_url_cache( home_url( '/' ) );
}
/**
* Clear course cache when enrollment changes
*/
public function clear_course_cache( $user_id, $course_id, $access_list, $remove ) {
if ( ! class_exists( 'Maple_Performance_Cache' ) ) {
return;
}
$cache = Maple_Performance_Cache::get_instance();
// Clear the course page (might show enrollment count)
$course_url = get_permalink( $course_id );
if ( $course_url ) {
$cache->clear_url_cache( $course_url );
}
}
/**
* Check Wordfence bypass
*/
public function check_wordfence_bypass( $should_cache ) {
// If Wordfence has set bypass cookie, don't cache
if ( isset( $_COOKIE['wfCBLBypass'] ) ) {
return false;
}
return $should_cache;
}
/**
* Show admin notices for plugin conflicts
*/
public function conflict_notices() {
// Build list of conflicting caching plugins
$caching_conflicts = $this->get_caching_conflicts();
// Show caching conflict warning on all admin pages (dismissible)
if ( ! empty( $caching_conflicts ) && ! get_transient( 'maple_perf_conflict_dismissed' ) ) {
$this->show_conflict_warning( $caching_conflicts );
}
// Show detailed info only on Maple Performance settings page
$screen = get_current_screen();
if ( ! $screen || $screen->id !== 'settings_page_maple-performance' ) {
return;
}
// If conflicts exist but were dismissed, show a subtle reminder on settings page
if ( ! empty( $caching_conflicts ) && get_transient( 'maple_perf_conflict_dismissed' ) ) {
echo '<div class="notice notice-warning">';
echo '<p><strong>' . esc_html__( 'Reminder:', 'maple-performance' ) . '</strong> ';
echo sprintf(
esc_html__( 'Other caching plugin(s) detected: %s. For best results, use only one caching solution.', 'maple-performance' ),
'<code>' . implode( '</code>, <code>', array_map( 'esc_html', $caching_conflicts ) ) . '</code>'
);
echo '</p></div>';
}
// Show detected compatible plugins (info)
$compatible = array();
if ( $this->is_detected( 'woocommerce' ) ) $compatible[] = 'WooCommerce';
if ( $this->is_detected( 'learndash' ) ) $compatible[] = 'LearnDash';
if ( $this->is_detected( 'wpforms' ) ) $compatible[] = 'WPForms';
if ( $this->is_detected( 'wordfence' ) ) $compatible[] = 'Wordfence';
if ( $this->is_detected( 'gravityforms' ) ) $compatible[] = 'Gravity Forms';
if ( $this->is_detected( 'cf7' ) ) $compatible[] = 'Contact Form 7';
if ( $this->is_detected( 'elementor' ) ) $compatible[] = 'Elementor';
if ( ! empty( $compatible ) ) {
echo '<div class="notice notice-info">';
echo '<p><strong>' . esc_html__( 'Maple Performance - Detected Plugins:', 'maple-performance' ) . '</strong> ';
echo sprintf(
esc_html__( 'Compatibility rules available for: %s. Enable them in the Plugin Compatibility section below.', 'maple-performance' ),
'<code>' . implode( '</code>, <code>', array_map( 'esc_html', $compatible ) ) . '</code>'
);
echo '</p></div>';
}
}
/**
* Get list of detected caching plugin conflicts
*/
public function get_caching_conflicts() {
$conflicts = array();
$caching_plugins = array(
'wp_rocket' => 'WP Rocket',
'w3tc' => 'W3 Total Cache',
'litespeed' => 'LiteSpeed Cache',
'wp_super_cache' => 'WP Super Cache',
'wp_fastest_cache' => 'WP Fastest Cache',
'autoptimize' => 'Autoptimize',
'cache_enabler' => 'Cache Enabler',
'hummingbird' => 'Hummingbird',
'breeze' => 'Breeze',
'sg_optimizer' => 'SG Optimizer',
'swift_performance'=> 'Swift Performance',
'comet_cache' => 'Comet Cache',
'powered_cache' => 'Powered Cache',
'perfmatters' => 'Perfmatters',
);
foreach ( $caching_plugins as $key => $name ) {
if ( $this->is_detected( $key ) ) {
$conflicts[] = $name;
}
}
return $conflicts;
}
/**
* Check if any caching conflicts exist
*/
public function has_caching_conflicts() {
return ! empty( $this->get_caching_conflicts() );
}
/**
* Show conflict warning notice
*/
private function show_conflict_warning( $conflicts ) {
// Handle dismiss action
if ( isset( $_GET['maple_dismiss_conflict'] ) && wp_verify_nonce( $_GET['_wpnonce'] ?? '', 'maple_dismiss_conflict' ) ) {
set_transient( 'maple_perf_conflict_dismissed', true, 7 * DAY_IN_SECONDS );
return;
}
$dismiss_url = wp_nonce_url( add_query_arg( 'maple_dismiss_conflict', '1' ), 'maple_dismiss_conflict' );
echo '<div class="notice notice-error">';
echo '<p><strong>' . esc_html__( '⚠️ Maple Performance - Caching Conflict Detected', 'maple-performance' ) . '</strong></p>';
echo '<p>' . sprintf(
esc_html__( 'The following caching/optimization plugin(s) are also active: %s', 'maple-performance' ),
'<strong>' . implode( ', ', array_map( 'esc_html', $conflicts ) ) . '</strong>'
) . '</p>';
echo '<p>' . esc_html__( 'Running multiple caching plugins simultaneously can cause:', 'maple-performance' ) . '</p>';
echo '<ul style="list-style: disc; margin-left: 20px;">';
echo '<li>' . esc_html__( 'Blank pages or site errors', 'maple-performance' ) . '</li>';
echo '<li>' . esc_html__( 'Stale/outdated content being served', 'maple-performance' ) . '</li>';
echo '<li>' . esc_html__( 'Slower performance (double processing)', 'maple-performance' ) . '</li>';
echo '<li>' . esc_html__( 'Cache invalidation failures', 'maple-performance' ) . '</li>';
echo '</ul>';
echo '<p><strong>' . esc_html__( 'Recommended action:', 'maple-performance' ) . '</strong> ';
echo esc_html__( 'Deactivate the other caching plugin(s), or deactivate Maple Performance if you prefer to keep your existing solution.', 'maple-performance' );
echo '</p>';
echo '<p>';
echo '<a href="' . esc_url( admin_url( 'plugins.php' ) ) . '" class="button button-primary">' . esc_html__( 'Go to Plugins', 'maple-performance' ) . '</a> ';
echo '<a href="' . esc_url( $dismiss_url ) . '" class="button">' . esc_html__( 'Dismiss for 7 days', 'maple-performance' ) . '</a>';
echo '</p>';
echo '</div>';
}
}