AlkantarClanX12

Your IP : 3.144.255.116


Current Path : /home/thanudqk/thepball.com/wp-content/plugins/hummingbird-performance/core/
Upload File :
Current File : /home/thanudqk/thepball.com/wp-content/plugins/hummingbird-performance/core/class-settings.php

<?php
/**
 * Class Settings manages common settings for modules.
 *
 * @package Hummingbird\Core
 * @since 1.8
 */

namespace Hummingbird\Core;

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class Settings
 */
class Settings {

	/**
	 * Plugin instance.
	 *
	 * @var Settings
	 */
	private static $instance;

	/**
	 * List of available modules.
	 *
	 * @since 1.8
	 *
	 * @var array
	 */
	private static $available_modules = array(
		'minify',
		'page_cache',
		'performance',
		'uptime',
		'gravatar',
		'caching',
		'cloudflare',
		'advanced',
		'rss',
		'settings',
		'redis',
	);

	/**
	 * List of network modules that have settings for each sub-site.
	 *
	 * @since 1.8
	 *
	 * @var array
	 */
	private static $network_modules = array( 'minify', 'page_cache', 'performance', 'advanced' );

	/**
	 * Return the plugin instance.
	 *
	 * @return Settings
	 */
	public static function get_instance() {
		if ( ! self::$instance ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Settings constructor.
	 */
	private function __construct() {
	}

	/**
	 * Return the plugin default settings.
	 *
	 * @return array  Default Hummingbird settings.
	 */
	public static function get_default_settings() {
		$defaults = array(
			'minify'      => array(
				'enabled'      => false,
				'use_cdn'      => true,
				'log'          => false,
				'file_path'    => '',
				// Only for multisites. Toggles minification in a subsite
				// By default is true as if 'minify'-'enabled' is set to false, this option has no meaning.
				'minify_blog'  => false,
				'view'         => 'basic', // Accepts: 'basic' or 'advanced'.
				'type'         => 'speedy', // Accepts: 'speedy' or 'basic'.
				'do_assets'    => array( // Assets to optimize.
					'styles'  => true,
					'scripts' => true,
				),
				// Only for multisite.
				'block'        => array(
					'scripts' => array(),
					'styles'  => array(),
				),
				'dont_minify'  => array(
					'scripts' => array(),
					'styles'  => array(),
				),
				'dont_combine' => array(
					'scripts' => array(),
					'styles'  => array(),
				),
				'position'     => array(
					'scripts' => array(),
					'styles'  => array(),
				),
				'defer'        => array(
					'scripts' => array(),
					'styles'  => array(),
				),
				'inline'       => array(
					'scripts' => array(),
					'styles'  => array(),
				),
				'nocdn'        => array(
					'scripts' => array(),
					'styles'  => array(),
				),
			),
			'uptime'      => array(
				'enabled'       => false,
				'notifications' => array(
					'enabled' => false,
				),
				'reports'       => array(
					'enabled' => false,
				),
			),
			'gravatar'    => array(
				'enabled' => false,
			),
			'page_cache'  => array(
				'enabled'      => false,
				// Only for multisites. Toggles page caching in a subsite
				// By default is true as if 'page_cache'-'enabled' is set to false, this option has no meaning.
				'cache_blog'   => true,
				'control'      => false,
				'detection'    => 'auto', // Accepts: manual, auto and none.
				'pages_cached' => 0,
				'integrations' => array(
					'varnish' => false,
					'opcache' => false,
				),
				'preload'      => false,
				'preload_type' => array(
					'home_page' => true,
					'on_clear'  => true,
				),
			),
			'caching'     => array(
				// Always enabled, so no 'enabled' option.
				'expiry_css'        => '1y/A31536000',
				'expiry_javascript' => '1y/A31536000',
				'expiry_media'      => '1y/A31536000',
				'expiry_images'     => '1y/A31536000',
			),
			'cloudflare'  => array(
				'enabled'      => false,
				'connected'    => false,
				'last_check'   => false,
				'email'        => '',
				'api_key'      => '',
				'zone'         => '',
				'zone_name'    => '',
				'plan'         => false,
				'page_rules'   => array(),
				'cache_expiry' => 31536000,
			),
			'performance' => array(
				'reports'       => array(
					'enabled' => false,
				),
				'subsite_tests' => true,
				'dismissed'     => false,
				'widget'        => array(
					'desktop'       => true, // Desktop or mobile report.
					'show_metrics'  => true,
					'show_audits'   => true,
					'show_historic' => true,
				),
				'hub'           => array(
					'show_metrics'  => true,
					'show_audits'   => true,
					'show_historic' => true,
				),
			),
			'advanced'    => array(
				'query_string'         => false,
				'query_strings_global' => false, // If true, will force query_string on all subsites.
				'emoji'                => false,
				'emoji_global'         => false, // If true, will force emoji on all subsites.
				'prefetch'             => array(),
				'db_cleanups'          => false,
				'cart_fragments'       => false,
				'lazy_load'            => array(
					'enabled'   => false,
					'method'    => 'click',
					'button'    => array(
						'dimensions' => array(
							'height' => 0,
							'width'  => 0,
							'radius' => 0,
						),
						'color'      => array(
							'background' => '',
							'border'     => '',
							'hover'      => '',
						),
						'alignment'  => array(
							'align'      => 'center',
							'full_width' => 'on',
							'left'       => 0,
							'right'      => 0,
							'top'        => 0,
							'bottom'     => 0,
						),
					),
					'threshold' => 10,
				),
			),
			'rss'         => array(
				'enabled'  => true,
				'duration' => 3600,
			),
			'settings'    => array(
				'accessible_colors' => false,
				'remove_settings'   => false,
				'remove_data'       => false,
				'tracking'          => false,
			),
			'redis'       => array(
				'enabled' => false,
			),
		);

		/**
		 * Filter the default settings.
		 * Useful when adding new settings to the plugin
		 */
		return apply_filters( 'wp_hummingbird_default_options', $defaults );
	}

	/**
	 * Array of settings per sub-site.
	 *
	 * @access private
	 *
	 * @param string $module  Module for to get sub site setting fields for.
	 *
	 * @return array
	 */
	private static function get_blog_option_names( $module ) {
		if ( ! in_array( $module, self::$network_modules, true ) ) {
			return array();
		}

		$options = array(
			'minify'      => array( 'minify_blog', 'view', 'type', 'do_assets', 'block', 'dont_minify', 'dont_combine', 'position', 'defer', 'inline', 'nocdn' ),
			'page_cache'  => array( 'cache_blog' ),
			'performance' => array( 'dismissed', 'widget' ),
			'advanced'    => array( 'query_string', 'emoji', 'prefetch', 'cart_fragments' ),
		);

		return $options[ $module ];
	}

	/**
	 * Filter out sub site options from network options on multisite.
	 *
	 * @access private
	 *
	 * @param array $options  Options array.
	 *
	 * @return array
	 */
	private static function filter_multisite_options( $options ) {
		$network_options = array();
		$blog_options    = array();

		foreach ( $options as $module => $setting ) {
			/*
			 * Skip if module is not registered.
			 * Only needed in case an update to 1.8 manually by replacing the files.
			 */
			if ( ! in_array( $module, self::$available_modules, true ) ) {
				continue;
			}

			$data = array_fill_keys( self::get_blog_option_names( $module ), self::get_blog_option_names( $module ) );

			$network_options[ $module ] = array_diff_key( $setting, $data );
			$blog_options[ $module ]    = array_intersect_key( $setting, $data );
		}

		// array_filter will remove all empty values.
		return array(
			'network' => $network_options,
			'blog'    => array_filter( $blog_options ),
		);
	}

	/**
	 * Reset database to default settings. Will overwrite all current settings.
	 * This can be moved out to update_settings, because it's almost identical.
	 */
	public static function reset_to_defaults() {
		Utils::get_module( 'redis' )->disable();

		$defaults = self::get_default_settings();

		if ( ! is_multisite() ) {
			update_option( 'wphb_settings', $defaults );
		} else {
			$options = self::filter_multisite_options( $defaults );
			update_site_option( 'wphb_settings', $options['network'] );
			update_option( 'wphb_settings', $options['blog'] );
		}
	}

	/**
	 * Return the plugin settings.
	 *
	 * @param bool|string $for_module  Module to fetch options for.
	 *
	 * @return array  Hummingbird settings.
	 */
	public static function get_settings( $for_module = false ) {
		if ( ! is_multisite() ) {
			$options = get_option( 'wphb_settings', array() );
		} else {
			$blog_options    = get_option( 'wphb_settings', array() );
			$network_options = get_site_option( 'wphb_settings', array() );
			$options         = array_merge_recursive( $blog_options, $network_options );
		}

		$defaults = self::get_default_settings();

		// We need to parse each module individually.
		foreach ( $defaults as $module => $option ) {
			// If there is nothing set in the current option, we use the default set.
			if ( ! isset( $options[ $module ] ) ) {
				$options[ $module ] = $option;
				continue;
			}
			// Else we combine defaults with current options.
			$options[ $module ] = wp_parse_args( $options[ $module ], $option );
		}

		return ( $for_module ) ? $options[ $for_module ] : $options;
	}

	/**
	 * Update the plugin settings.
	 *
	 * @param array       $new_settings  New settings.
	 * @param bool|string $for_module    Module to update settings for.
	 */
	public static function update_settings( $new_settings, $for_module = false ) {
		if ( $for_module ) {
			$options                = self::get_settings();
			$options[ $for_module ] = $new_settings;
			$new_settings           = $options;
		}

		if ( ! is_multisite() ) {
			update_option( 'wphb_settings', $new_settings );
		} else {
			$options = self::filter_multisite_options( $new_settings );
			update_site_option( 'wphb_settings', $options['network'] );
			update_option( 'wphb_settings', $options['blog'] );
		}
	}

	/**
	 * Get setting.
	 *
	 * @param string      $option_name  Return a single WP Hummingbird setting.
	 * @param bool|string $for_module   Module to fetch options for.
	 *
	 * @return mixed
	 */
	public static function get_setting( $option_name, $for_module = false ) {
		$options = self::get_settings( $for_module );

		if ( ! isset( $options[ $option_name ] ) ) {
			return '';
		}

		/**
		 * Failsafe for when options are stored incorrectly.
		 */
		$defaults = self::get_default_settings();
		if ( $for_module ) {
			$defaults = $defaults[ $for_module ];
		}

		if ( self::is_exception( $for_module, $options, $option_name ) ) {
			return $options[ $option_name ];
		}

		if ( gettype( $defaults[ $option_name ] ) !== gettype( $options[ $option_name ] ) ) {
			self::update_setting( $option_name, $defaults[ $option_name ], $for_module );
			return $defaults[ $option_name ];
		}

		return $options[ $option_name ];
	}

	/**
	 * Check if setting has an exception.
	 *
	 * In get_settings we compare the values to defaults (including value type).
	 * Two options can be bool/string: minify -> enabled and page_cache -> enabled.
	 *
	 * @since 1.8.1
	 *
	 * @param string $module       Module.
	 * @param array  $options      Options.
	 * @param string $option_name  Option name.
	 *
	 * @return bool
	 */
	private static function is_exception( $module, $options, $option_name ) {
		$exceptions = array(
			'minify'      => 'super-admins',
			'page_cache'  => 'blog-admins',
			'performance' => 'super-admins',
		);

		if ( isset( $exceptions[ $module ] ) && $exceptions[ $module ] === $options[ $option_name ] ) {
			return true;
		}

		return false;
	}

	/**
	 * Update selected plugin setting.
	 *
	 * @param string      $option_name  Setting name.
	 * @param mixed       $value        Setting value.
	 * @param bool|string $for_module   Module to update settings for.
	 */
	public static function update_setting( $option_name, $value, $for_module = false ) {
		$options = self::get_settings( $for_module );

		$options[ $option_name ] = $value;

		self::update_settings( $options, $for_module );
	}

	/**
	 * Return a single WP Hummingbird option.
	 *
	 * @param string $option  Option.
	 *
	 * @return mixed
	 */
	public static function get( $option ) {
		if ( ! is_main_site() ) {
			$value = get_option( $option );
		} else {
			$value = get_site_option( $option );
		}

		return $value;
	}

	/**
	 * Delete a single WP Hummingbird option.
	 *
	 * @param string $option  Option.
	 */
	public static function delete( $option ) {
		if ( ! is_main_site() ) {
			delete_option( $option );
		} else {
			delete_site_option( $option );
		}
	}

	/**
	 * Update option.
	 *
	 * @param string      $option   WP Hummingbird option name.
	 * @param mixed       $value    WP Hummingbird option value.
	 * @param string|bool $autoload Optional. Whether to load the option when WordPress starts up. For existing options,
	 *                              `$autoload` can only be updated using `update_option()` if `$value` is also changed.
	 *                              Accepts 'yes'|true to enable or 'no'|false to disable. For non-existent options,
	 *                              the default value is 'yes'. Default null.
	 */
	public static function update( $option, $value, $autoload = null ) {
		if ( ! is_main_site() ) {
			update_option( $option, $value, $autoload );
		} else {
			update_site_option( $option, $value );
		}
	}

}