array( 'enabled' => 1, 'lifetime' => 86400, 'mobile_cache' => 1, 'logged_in_cache' => 0, 'excluded_urls' => "/wp-admin\n/wp-login.php\n/cart\n/checkout\n/my-account", 'excluded_cookies' => "wordpress_logged_in_\ncomment_author_\nwoocommerce_items_in_cart\nwp_woocommerce_session_", 'excluded_queries' => "s\npreview\nnocache\nadd-to-cart", 'excluded_roles' => "administrator\neditor", ), 'preload' => array( 'enabled' => 1, 'batch_size' => 8, 'sitemap_urls' => '', ), 'browser' => array( 'enabled' => 1, 'max_age' => 2592000, 'etags' => 1, ), 'css' => array( 'minify' => 1, 'critical_css' => '', 'exclusions' => '', ), 'js' => array( 'minify' => 1, 'defer' => 1, 'async' => 0, 'delay' => 0, 'exclusions' => "jquery\nwp-includes/js/dist", ), 'images' => array( 'optimize_uploads' => 1, 'webp' => 1, 'quality' => 82, 'lazy' => 1, ), 'database' => array( 'schedule' => 'weekly', ), 'heartbeat' => array( 'mode' => 'reduce', 'frequency' => 60, 'admin' => 1, 'frontend' => 0, 'editor' => 1, ), 'compression' => array( 'enabled' => 1, ), 'lazy' => array( 'images' => 1, 'iframes' => 1, 'videos' => 1, 'exclusions' => '', ), 'cdn' => array( 'enabled' => 0, 'url' => '', 'exclusions' => '', ), 'logging' => array( 'enabled' => 1, 'retention_days' => 14, ), 'automation' => array( 'enabled' => 1, 'cache_cleanup' => 'daily', 'preload' => 'daily', 'database_optimization' => 'weekly', 'one_click' => 'weekly', ), ); } /** * Ensure option exists. * * @return void */ public static function install_defaults() { $current = get_option( self::OPTION ); if ( false === $current ) { add_option( self::OPTION, self::defaults(), '', false ); add_option( 'acelora_site_accelerator_install_time', time(), '', false ); return; } update_option( self::OPTION, self::merge_defaults( $current ), false ); } /** * Get all settings. * * @return array */ public function all() { if ( null === $this->settings ) { $stored = get_option( self::OPTION, array() ); $this->settings = self::merge_defaults( is_array( $stored ) ? $stored : array() ); } return $this->settings; } /** * Get a dot-notated setting. * * @param string $key Dot-notated setting key. * @param mixed $default Default value. * @return mixed */ public function get( $key, $default = null ) { $value = $this->all(); foreach ( explode( '.', $key ) as $part ) { if ( ! is_array( $value ) || ! array_key_exists( $part, $value ) ) { return $default; } $value = $value[ $part ]; } return $value; } /** * Save settings. * * @param array $settings Settings. * @return bool */ public function save( $settings ) { $clean = self::sanitize( self::merge_defaults( $settings ) ); $this->settings = $clean; return update_option( self::OPTION, $clean, false ); } /** * Merge stored values with defaults. * * @param array $settings Settings. * @return array */ public static function merge_defaults( $settings ) { return array_replace_recursive( self::defaults(), is_array( $settings ) ? $settings : array() ); } /** * Sanitize settings recursively. * * @param array $settings Settings. * @return array */ public static function sanitize( $settings ) { $defaults = self::defaults(); $clean = self::merge_defaults( $settings ); foreach ( $defaults as $section => $fields ) { foreach ( $fields as $field => $default ) { $value = isset( $clean[ $section ][ $field ] ) ? $clean[ $section ][ $field ] : $default; if ( is_int( $default ) ) { $clean[ $section ][ $field ] = max( 0, absint( $value ) ); } elseif ( in_array( $field, array( 'url' ), true ) ) { $clean[ $section ][ $field ] = esc_url_raw( untrailingslashit( $value ) ); } elseif ( 'schedule' === $field || false !== strpos( $field, 'optimization' ) || in_array( $field, array( 'cache_cleanup', 'preload', 'one_click', 'mode' ), true ) ) { $clean[ $section ][ $field ] = sanitize_key( $value ); } else { $clean[ $section ][ $field ] = is_string( $value ) ? sanitize_textarea_field( wp_unslash( $value ) ) : $value; } } } $clean['cache']['lifetime'] = max( 60, absint( $clean['cache']['lifetime'] ) ); $clean['preload']['batch_size'] = max( 1, min( 50, absint( $clean['preload']['batch_size'] ) ) ); $clean['images']['quality'] = max( 40, min( 100, absint( $clean['images']['quality'] ) ) ); $clean['heartbeat']['frequency'] = max( 15, min( 300, absint( $clean['heartbeat']['frequency'] ) ) ); $clean['browser']['max_age'] = max( 3600, absint( $clean['browser']['max_age'] ) ); return $clean; } /** * Convert newline-delimited settings to a cleaned list. * * @param string $value Raw list. * @return array */ public function list_value( $value ) { $lines = preg_split( '/\r\n|\r|\n/', (string) $value ); $lines = array_map( 'trim', $lines ); $lines = array_filter( $lines ); return array_values( array_unique( $lines ) ); } }