Created
August 22, 2019 14:44
-
-
Save stanleybz/37e687e27a3f76610b41ca8ff52dd504 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* The admin settings handler of the plugin. | |
* | |
* | |
* @since 1.1.0 | |
* @package LiteSpeed_Cache | |
* @subpackage LiteSpeed_Cache/admin | |
* @author LiteSpeed Technologies <[email protected]> | |
*/ | |
if ( ! defined( 'WPINC' ) ) { | |
die ; | |
} | |
class LiteSpeed_Cache_Admin_Settings | |
{ | |
private static $_instance ; | |
private $_input ; | |
private $_options ; | |
private $_err = array() ; | |
private $_max_int = 2147483647 ; | |
/** | |
* Init | |
* | |
* @since 1.3 | |
* @access private | |
*/ | |
private function __construct() | |
{ | |
} | |
/** | |
* Callback function that will validate any changes made in the settings page. | |
* | |
* NOTE: Anytime that validate_plugin_settings is called, `convert_options_to_input` must be done first if not from option page | |
* | |
* @since 1.0.0 | |
* @access public | |
* @param array $input The configuration selected by the admin when clicking save. | |
* @return array The updated configuration options. | |
*/ | |
public function validate_plugin_settings( $input, $revert_options_to_input = false ) | |
{ | |
// Revert options to initial input | |
if ( $revert_options_to_input ) { | |
$input = LiteSpeed_Cache_Config::convert_options_to_input( $input ) ; | |
} | |
LiteSpeed_Cache_Log::debug( '[Settings] validate_plugin_settings called' ) ; | |
$this->_options = LiteSpeed_Cache_Config::get_instance()->get_options() ; | |
if ( LiteSpeed_Cache_Admin_Display::get_instance()->get_disable_all() ) { | |
add_settings_error( LiteSpeed_Cache_Config::OPTION_NAME, LiteSpeed_Cache_Config::OPTION_NAME, __( '\'Use primary site settings\' set by Network Administrator.', 'litespeed-cache' ) ) ; | |
return $this->_options ; | |
} | |
$this->_input = $input ; | |
$this->_validate_general() ; | |
$this->_validate_cache() ; | |
$this->_validate_purge() ; | |
$this->_validate_exclude() ; | |
$this->_validate_optimize() ; | |
$this->_validate_media() ; | |
$this->_validate_cdn() ; | |
$this->_validate_adv() ; | |
$this->_validate_debug() ; | |
$this->_validate_crawler() ; // Network setup doesn't run validate_plugin_settings | |
if ( ! is_multisite() ) { | |
$this->_validate_singlesite() ; | |
} | |
if ( LSWCP_ESI_SUPPORT ) { | |
$orig_esi_enabled = $this->_options[ LiteSpeed_Cache_Config::OPID_ESI_ENABLE ] ; | |
$this->_validate_esi() ; | |
$new_esi_enabled = $this->_options[ LiteSpeed_Cache_Config::OPID_ESI_ENABLE ] ; | |
if ( $orig_esi_enabled !== $new_esi_enabled ) { | |
LiteSpeed_Cache_Purge::purge_all( 'ESI changed' ) ; | |
} | |
} | |
if ( ! empty( $this->_err ) ) { | |
add_settings_error( LiteSpeed_Cache_Config::OPTION_NAME, LiteSpeed_Cache_Config::OPTION_NAME, implode( '<br />', $this->_err ) ) ; | |
return $this->_options ; | |
} | |
if ( defined( 'LITESPEED_CLI' ) ) { | |
$id = LiteSpeed_Cache_Config::CRWL_CRON_ACTIVE ; | |
$cron_val = $this->_options[ $id ] ; | |
// assign crawler_cron_active to $this->_options if exists in $this->_input separately for CLI | |
// This has to be specified cos crawler cron activation is not set in admin setting page | |
$this->_options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
if ( $cron_val != $this->_options[ $id ] ) { | |
// check if need to enable crawler cron | |
LiteSpeed_Cache_Task::update( $this->_options ) ; | |
} | |
} | |
$this->_validate_thirdparty() ; | |
/** | |
* Check if need to send cfg to CDN or not | |
* @since 2.3 | |
*/ | |
$id = LiteSpeed_Cache_Config::OPT_CDN_QUIC ; | |
if ( $this->_options[ $id ] ) { | |
// Send to Quic CDN | |
LiteSpeed_Cache_CDN_Quic::sync_config( $this->_options ) ; | |
} | |
return $this->_options ; | |
} | |
/** | |
* Validates the single site specific settings. | |
* | |
* @since 1.0.12 | |
* @access private | |
*/ | |
private function _validate_singlesite() | |
{ | |
/** | |
* Handle files: | |
* 1) wp-config.php; | |
* 2) adv-cache.php; | |
* 3) object-cache.php; | |
* 4) .htaccess; | |
*/ | |
/* 1) wp-config.php; */ | |
$id = LiteSpeed_Cache_Config::OPID_ENABLED_RADIO ; | |
if ( $this->_options[ $id ] ) {// todo: If not enabled, may need to remove cache var? | |
$ret = LiteSpeed_Cache_Config::wp_cache_var_setter( true ) ; | |
if ( $ret !== true ) { | |
$this->_err[] = $ret ; | |
} | |
} | |
/* 2) adv-cache.php; */ | |
$id = LiteSpeed_Cache_Config::OPID_CHECK_ADVANCEDCACHE ; | |
$this->_options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
if ( $this->_options[ $id ] ) { | |
LiteSpeed_Cache_Activation::try_copy_advanced_cache() ; | |
} | |
/* 3) object-cache.php; */ | |
/** | |
* Validate Object Cache | |
* @since 1.8 | |
*/ | |
$new_options = $this->_validate_object_cache() ; | |
$this->_options = array_merge( $this->_options, $new_options ) ; | |
/* 4) .htaccess; */ | |
// Parse rewrite rule settings | |
$new_options = $this->_validate_rewrite_settings() ; | |
$this->_options = array_merge( $this->_options, $new_options ) ; | |
// Try to update rewrite rules | |
$disable_lscache_detail_rules = false ; | |
if ( defined( 'LITESPEED_NEW_OFF' ) ) { | |
// Clear lscache rules but keep lscache module rules, keep non-lscache rules | |
$disable_lscache_detail_rules = true ; | |
} | |
$res = LiteSpeed_Cache_Admin_Rules::get_instance()->update( $this->_options, $disable_lscache_detail_rules ) ; | |
if ( $res !== true ) { | |
if ( ! is_array( $res ) ) { | |
$this->_err[] = $res ; | |
} | |
else { | |
$this->_err = array_merge( $this->_err, $res ) ; | |
} | |
} | |
/** | |
* Keep self up-to-date | |
* @since 2.7.2 | |
*/ | |
$id = LiteSpeed_Cache_Config::OPT_AUTO_UPGRADE ; | |
$this->_options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
} | |
/** | |
* Parses any changes made by the network admin on the network settings. | |
* | |
* @since 1.0.4 | |
* @access public | |
*/ | |
public function validate_network_settings( $input, $revert_options_to_input = false ) | |
{ | |
// Revert options to initial input | |
if ( $revert_options_to_input ) { | |
$input = LiteSpeed_Cache_Config::convert_options_to_input( $input ) ; | |
} | |
$this->_input = LiteSpeed_Cache_Admin::cleanup_text( $input ) ; | |
$options = LiteSpeed_Cache_Config::get_instance()->get_site_options() ; | |
/** | |
* Handle files: | |
* 1) wp-config.php; | |
* 2) adv-cache.php; | |
* 3) object-cache.php; | |
* 4) .htaccess; | |
*/ | |
/* 1) wp-config.php; */ | |
$id = LiteSpeed_Cache_Config::NETWORK_OPID_ENABLED ; | |
$network_enabled = self::parse_onoff( $this->_input, $id ) ; | |
if ( $network_enabled ) { | |
$ret = LiteSpeed_Cache_Config::wp_cache_var_setter( true ) ; | |
if ( $ret !== true ) { | |
$this->_err[] = $ret ; | |
} | |
} | |
elseif ( $options[ $id ] != $network_enabled ) { | |
LiteSpeed_Cache_Purge::purge_all( 'Network enable changed' ) ; | |
} | |
$options[ $id ] = $network_enabled ; | |
/* 2) adv-cache.php; */ | |
$id = LiteSpeed_Cache_Config::OPID_CHECK_ADVANCEDCACHE ; | |
$options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
if ( $options[ $id ] ) { | |
LiteSpeed_Cache_Activation::try_copy_advanced_cache() ; | |
} | |
/* 3) object-cache.php; */ | |
/** | |
* Validate Object Cache | |
* @since 1.8 | |
*/ | |
$new_options = $this->_validate_object_cache() ; | |
$options = array_merge( $options, $new_options ) ; | |
/* 4) .htaccess; */ | |
// Parse rewrite settings from input | |
$new_options = $this->_validate_rewrite_settings() ; | |
$options = array_merge( $options, $new_options ) ; | |
// Update htaccess | |
$disable_lscache_detail_rules = false ; | |
if ( ! $network_enabled ) { | |
// Clear lscache rules but keep lscache module rules, keep non-lscache rules | |
// Need to set cachePublicOn in case subblogs turn on cache manually | |
$disable_lscache_detail_rules = true ; | |
} | |
// NOTE: Network admin still need to make a lscache wrapper to avoid subblogs cache not work | |
$res = LiteSpeed_Cache_Admin_Rules::get_instance()->update( $options, $disable_lscache_detail_rules ) ; | |
if ( $res !== true ) { | |
if ( ! is_array( $res ) ) { | |
$this->_err[] = $res ; | |
} | |
else { | |
$this->_err = array_merge( $this->_err, $res ) ; | |
} | |
} | |
$id = LiteSpeed_Cache_Config::NETWORK_OPID_USE_PRIMARY ; | |
$orig_primary = $options[ $id ] ; | |
$options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
if ( $orig_primary != $options[ $id ] ) { | |
LiteSpeed_Cache_Purge::purge_all( 'Network use_primary changed' ) ; | |
} | |
$id = LiteSpeed_Cache_Config::OPID_PURGE_ON_UPGRADE ; | |
$options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
$id = LiteSpeed_Cache_Config::OPT_AUTO_UPGRADE ; | |
$options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
if ( ! empty( $this->_err ) ) { | |
LiteSpeed_Cache_Admin_Display::add_notice( LiteSpeed_Cache_Admin_Display::NOTICE_RED, $this->_err ) ; | |
return ; | |
} | |
LiteSpeed_Cache_Admin_Display::add_notice( LiteSpeed_Cache_Admin_Display::NOTICE_GREEN, __( 'Site options saved.', 'litespeed-cache' ) ) ; | |
update_site_option( LiteSpeed_Cache_Config::OPTION_NAME, $options ) ; | |
} | |
/** | |
* Validates object cache settings. | |
* | |
* @since 1.8 | |
* @access private | |
*/ | |
private function _validate_object_cache() | |
{ | |
$new_options = array() ; | |
$ids = array( | |
LiteSpeed_Cache_Config::OPID_CACHE_OBJECT, | |
LiteSpeed_Cache_Config::OPID_CACHE_OBJECT_KIND, | |
LiteSpeed_Cache_Config::OPID_CACHE_OBJECT_ADMIN, | |
LiteSpeed_Cache_Config::OPID_CACHE_OBJECT_TRANSIENTS, | |
LiteSpeed_Cache_Config::OPID_CACHE_OBJECT_PERSISTENT, | |
) ; | |
foreach ( $ids as $id ) { | |
$new_options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
} | |
$ids = array( | |
LiteSpeed_Cache_Config::OPID_CACHE_OBJECT_HOST, | |
LiteSpeed_Cache_Config::OPID_CACHE_OBJECT_PORT, | |
LiteSpeed_Cache_Config::OPID_CACHE_OBJECT_LIFE, | |
LiteSpeed_Cache_Config::OPID_CACHE_OBJECT_DB_ID, | |
LiteSpeed_Cache_Config::OPID_CACHE_OBJECT_USER, | |
LiteSpeed_Cache_Config::OPID_CACHE_OBJECT_PSWD, | |
); | |
foreach ( $ids as $id ) { | |
$new_options[ $id ] = $this->_input[ $id ] ; | |
} | |
$ids = array( | |
LiteSpeed_Cache_Config::ITEM_OBJECT_GLOBAL_GROUPS, | |
LiteSpeed_Cache_Config::ITEM_OBJECT_NON_PERSISTENT_GROUPS, | |
); | |
$item_options = array() ; | |
foreach ( $ids as $id ) { | |
$item_options[ $id ] = $this->_save_item( $id ) ; | |
} | |
/** | |
* Check if object cache file existing or not | |
*/ | |
if ( ! defined( 'LITESPEED_DISABLE_OBJECT' ) ) { | |
$id = LiteSpeed_Cache_Config::OPID_CACHE_OBJECT ; | |
if ( $new_options[ $id ] ) { | |
$all_options = array_merge( $new_options, $item_options ) ; | |
LiteSpeed_Cache_Log::debug( '[Settings] Update .object_cache.ini and flush object cache' ) ; | |
LiteSpeed_Cache_Object::get_instance()->update_file( $all_options ) ; | |
/** | |
* Clear object cache | |
*/ | |
LiteSpeed_Cache_Object::get_instance()->reconnect( $all_options ) ; | |
} | |
else { | |
if ( defined( 'LSCWP_OBJECT_CACHE' ) ) { | |
LiteSpeed_Cache_Log::debug( '[Settings] Remove .object_cache.ini' ) ; | |
LiteSpeed_Cache_Object::get_instance()->del_file() ; | |
} | |
} | |
} | |
return $new_options ; | |
} | |
/** | |
* Validates the general settings. | |
* | |
* @since 1.0.12 | |
* @access private | |
*/ | |
private function _validate_general() | |
{ | |
// Cache enabled setting | |
$id = LiteSpeed_Cache_Config::OPID_ENABLED_RADIO ; | |
$this->_options[ $id ] = self::is_checked_radio( $this->_input[ $id ] ) ; | |
$enabled = $this->_options[ $id ] ; | |
// Use network setting | |
if( $enabled === LiteSpeed_Cache_Config::VAL_ON2 ) { | |
$enabled = is_multisite() ? defined( 'LITESPEED_NETWORK_ON' ) : true ; // Default to true | |
} | |
// Purge when disabled | |
if ( ! $enabled ) { | |
LiteSpeed_Cache_Purge::purge_all( 'Not enabled' ) ; | |
! defined( 'LITESPEED_NEW_OFF' ) && define( 'LITESPEED_NEW_OFF', true ) ; // Latest status is off | |
} | |
// TTL check | |
$ids = array( | |
LiteSpeed_Cache_Config::OPID_PUBLIC_TTL => array( 30, null ), | |
LiteSpeed_Cache_Config::OPID_PRIVATE_TTL => array( 60, 3600 ), | |
LiteSpeed_Cache_Config::OPID_FRONT_PAGE_TTL => array( 30, null ), | |
LiteSpeed_Cache_Config::OPID_FEED_TTL => array( 0, null, 30 ), | |
LiteSpeed_Cache_Config::OPID_404_TTL => array( 0, null, 30 ), | |
LiteSpeed_Cache_Config::OPID_403_TTL => array( 0, null, 30 ), | |
LiteSpeed_Cache_Config::OPID_500_TTL => array( 0, null, 30 ), | |
) ; | |
foreach ( $ids as $id => $v ) { | |
list( $min, $max ) = $v ; | |
$this->_options[ $id ] = $this->_check_ttl( $this->_input, $id, $min, $max ) ; | |
if ( ! empty( $v[ 2 ] ) && $this->_options[ $id ] < $v[ 2 ] ) { | |
$this->_options[ $id ] = 0 ; | |
} | |
} | |
} | |
/** | |
* Validates the cache control settings. | |
* | |
* @since 1.1.6 | |
* @access private | |
*/ | |
private function _validate_cache() | |
{ | |
$ids = array( | |
LiteSpeed_Cache_Config::OPID_CACHE_PRIV, | |
LiteSpeed_Cache_Config::OPID_CACHE_COMMENTER, | |
LiteSpeed_Cache_Config::OPID_CACHE_REST, | |
); | |
foreach ( $ids as $id ) { | |
$this->_options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
} | |
$id = LiteSpeed_Cache_Config::OPID_CACHE_PAGE_LOGIN ; | |
$this->_options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
if( ! $this->_options[ $id ] ) { | |
LiteSpeed_Cache_Purge::add( LiteSpeed_Cache_Tag::TYPE_LOGIN ) ; | |
} | |
$id = LiteSpeed_Cache_Config::ITEM_CACHE_URI_PRIV ; | |
$this->_save_item( $id, 'relative' ) ; | |
$ids = array( | |
LiteSpeed_Cache_Config::ITEM_CACHE_DROP_QS, // Update Drop Query String @since 1.7 | |
); | |
foreach ( $ids as $id ) { | |
$this->_save_item( $id ) ; | |
} | |
} | |
/** | |
* Validates the purge settings. | |
* | |
* @since 1.0.12 | |
* @access private | |
*/ | |
private function _validate_purge() | |
{ | |
$id = LiteSpeed_Cache_Config::OPID_PURGE_ON_UPGRADE ; | |
$this->_options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
// get auto purge rules options | |
$pvals = array( | |
LiteSpeed_Cache_Config::PURGE_ALL_PAGES, | |
LiteSpeed_Cache_Config::PURGE_FRONT_PAGE, | |
LiteSpeed_Cache_Config::PURGE_HOME_PAGE, | |
LiteSpeed_Cache_Config::PURGE_PAGES, | |
LiteSpeed_Cache_Config::PURGE_PAGES_WITH_RECENT_POSTS, | |
LiteSpeed_Cache_Config::PURGE_AUTHOR, | |
LiteSpeed_Cache_Config::PURGE_YEAR, | |
LiteSpeed_Cache_Config::PURGE_MONTH, | |
LiteSpeed_Cache_Config::PURGE_DATE, | |
LiteSpeed_Cache_Config::PURGE_TERM, | |
LiteSpeed_Cache_Config::PURGE_POST_TYPE, | |
) ; | |
$input_purge_options = array() ; | |
foreach ( $pvals as $v) { | |
$input_name = 'purge_' . $v ; | |
if ( self::parse_onoff( $this->_input, $input_name ) ) { | |
$input_purge_options[] = $v ; | |
} | |
} | |
sort( $input_purge_options ) ; | |
$purge_by_post = implode( '.', $input_purge_options ) ; | |
if ( $purge_by_post !== $this->_options[ LiteSpeed_Cache_Config::OPID_PURGE_BY_POST ] ) { | |
$this->_options[ LiteSpeed_Cache_Config::OPID_PURGE_BY_POST ] = $purge_by_post ; | |
} | |
// Filter scheduled purge URLs | |
$id = LiteSpeed_Cache_Config::OPID_TIMED_URLS ; | |
if ( isset( $this->_input[ $id ] ) ) { | |
$this->_options[ $id ] = LiteSpeed_Cache_Utility::sanitize_lines( $this->_input[ $id ], 'relative' ) ; | |
} | |
// Schduled Purge Time | |
$id = LiteSpeed_Cache_Config::OPID_TIMED_URLS_TIME ; | |
$this->_options[ $id ] = $this->_input[ $id ] ; | |
} | |
/** | |
* Validates the exclude settings. | |
* | |
* @since 1.0.12 | |
* @access private | |
*/ | |
private function _validate_exclude() | |
{ | |
$id = LiteSpeed_Cache_Config::ITEM_FORCE_CACHE_URI ; | |
$this->_save_item( $id, 'relative' ) ; | |
$id = LiteSpeed_Cache_Config::ITEM_EXCLUDES_URI ; | |
$this->_save_item( $id, 'relative' ) ; | |
$id = LiteSpeed_Cache_Config::OPID_EXCLUDES_QS ; | |
if ( isset( $this->_input[ $id ] ) ) { | |
$this->_options[ $id ] = LiteSpeed_Cache_Utility::sanitize_lines( $this->_input[ $id ] ) ; | |
} | |
$id = LiteSpeed_Cache_Config::OPID_EXCLUDES_CAT ; | |
$this->_options[ $id ] = '' ; | |
if ( isset( $this->_input[ $id ] ) ) { | |
$cat_ids = array() ; | |
$cats = explode( "\n", $this->_input[ $id ] ) ; | |
foreach ( $cats as $cat ) { | |
$cat_name = trim( $cat ) ; | |
if ( $cat_name == '' ) { | |
continue ; | |
} | |
$cat_id = get_cat_ID( $cat_name ) ; | |
if ( $cat_id == 0 ) { | |
$this->_err[] = LiteSpeed_Cache_Admin_Display::get_error( LiteSpeed_Cache_Admin_Error::E_SETTING_CAT, $cat_name ) ; | |
} | |
else { | |
$cat_ids[] = $cat_id ; | |
} | |
} | |
if ( ! empty( $cat_ids ) ) { | |
$this->_options[ $id ] = implode( ',', $cat_ids ) ; | |
} | |
} | |
$id = LiteSpeed_Cache_Config::OPID_EXCLUDES_TAG ; | |
$this->_options[ $id ] = '' ; | |
if ( isset( $this->_input[ $id ] ) ) { | |
$tag_ids = array() ; | |
$tags = explode( "\n", $this->_input[ $id ] ) ; | |
foreach ( $tags as $tag ) { | |
$tag_name = trim( $tag ) ; | |
if ( $tag_name == '' ) { | |
continue ; | |
} | |
$term = get_term_by( 'name', $tag_name, 'post_tag' ) ; | |
if ( $term == 0 ) { | |
$this->_err[] = LiteSpeed_Cache_Admin_Display::get_error( LiteSpeed_Cache_Admin_Error::E_SETTING_TAG, $tag_name ) ; | |
} | |
else { | |
$tag_ids[] = $term->term_id ; | |
} | |
} | |
if ( ! empty( $tag_ids ) ) { | |
$this->_options[ $id ] = implode( ',', $tag_ids ) ; | |
} | |
} | |
/** | |
* Update Role Excludes | |
* @since 1.6.2 | |
*/ | |
$id = LiteSpeed_Cache_Config::EXCLUDE_CACHE_ROLES ; | |
update_option( $id, ! empty( $this->_input[ $id ] ) ? $this->_input[ $id ] : array() ) ; | |
} | |
/** | |
* Validates the CDN settings. | |
* | |
* @since 1.2.2 | |
* @access private | |
*/ | |
private function _validate_cdn() | |
{ | |
$cdn_cloudflare_changed = false ; | |
$ids = array( | |
LiteSpeed_Cache_Config::OPID_CDN, | |
LiteSpeed_Cache_Config::OPT_CDN_QUIC, | |
LiteSpeed_Cache_Config::OPID_CDN_CLOUDFLARE, | |
) ; | |
foreach ( $ids as $id ) { | |
$v = self::parse_onoff( $this->_input, $id ) ; | |
if ( $this->_options[ $id ] === $v ) { | |
continue ; | |
} | |
$this->_options[ $id ] = $v ; | |
// Cloudflare setting is changed | |
if ( $id == LiteSpeed_Cache_Config::OPID_CDN_CLOUDFLARE ) { | |
$cdn_cloudflare_changed = true ; | |
} | |
} | |
$id = LiteSpeed_Cache_Config::OPID_CDN_ORI ; | |
$this->_options[ $id ] = $this->_input[ $id ] ; | |
if ( $this->_options[ $id ] ) { | |
$ori_list = explode( ',', $this->_options[ $id ] ) ; | |
foreach ( $ori_list as $k => $v ) { | |
$tmp = parse_url( $v ) ; | |
if ( ! empty( $tmp[ 'scheme' ] ) ) { | |
$v = str_replace( $tmp[ 'scheme' ] . ':', '', $v ) ; | |
} | |
$ori_list[ $k ] = trim( $v ) ; | |
} | |
$this->_options[ $id ] = implode( ',', $ori_list ) ; | |
} | |
$ids = array( | |
LiteSpeed_Cache_Config::OPID_CDN_EXCLUDE, | |
) ; | |
foreach ( $ids as $id ) { | |
$this->_options[ $id ] = LiteSpeed_Cache_Utility::sanitize_lines( $this->_input[ $id ] ) ; | |
} | |
$ids = array( | |
LiteSpeed_Cache_Config::ITEM_CDN_ORI_DIR, | |
) ; | |
foreach ( $ids as $id ) { | |
$this->_save_item( $id ) ; | |
} | |
/** | |
* Handle multiple CDN setting | |
* @since 1.7 | |
*/ | |
$cdn_mapping = array() ; | |
$mapping_fields = array( | |
LiteSpeed_Cache_Config::ITEM_CDN_MAPPING_URL, | |
LiteSpeed_Cache_Config::ITEM_CDN_MAPPING_INC_IMG, | |
LiteSpeed_Cache_Config::ITEM_CDN_MAPPING_INC_CSS, | |
LiteSpeed_Cache_Config::ITEM_CDN_MAPPING_INC_JS, | |
LiteSpeed_Cache_Config::ITEM_CDN_MAPPING_FILETYPE | |
) ; | |
$id = LiteSpeed_Cache_Config::ITEM_CDN_MAPPING ; | |
foreach ( $this->_input[ $id ][ LiteSpeed_Cache_Config::ITEM_CDN_MAPPING_URL ] as $k => $v ) { | |
$this_mapping = array() ; | |
foreach ( $mapping_fields as $f ) { | |
$this_mapping[ $f ] = ! empty( $this->_input[ $id ][ $f ][ $k ] ) ? $this->_input[ $id ][ $f ][ $k ] : false ; | |
if ( $f === LiteSpeed_Cache_Config::ITEM_CDN_MAPPING_FILETYPE ) { | |
$this_mapping[ $f ] = LiteSpeed_Cache_Utility::sanitize_lines( $this_mapping[ $f ] ) ; | |
} | |
} | |
$cdn_mapping[] = $this_mapping ; | |
} | |
update_option( $id, $cdn_mapping ) ; | |
/** | |
* Load jQuery from cdn | |
* @since 1.5 | |
*/ | |
$id = LiteSpeed_Cache_Config::OPID_CDN_REMOTE_JQUERY ; | |
$this->_options[ $id ] = self::is_checked_radio( $this->_input[ $id ] ) ; | |
/** | |
* Quic API | |
* @since 2.4.1 | |
*/ | |
$ids = array( | |
LiteSpeed_Cache_Config::OPT_CDN_QUIC_EMAIL, | |
LiteSpeed_Cache_Config::OPT_CDN_QUIC_KEY, | |
) ; | |
foreach ( $ids as $id ) { | |
if ( $this->_options[ $id ] === $this->_input[ $id ] ) { | |
continue ; | |
} | |
$this->_options[ $id ] = $this->_input[ $id ] ; | |
} | |
/** | |
* CLoudflare API | |
* @since 1.7.2 | |
*/ | |
$ids = array( | |
LiteSpeed_Cache_Config::OPID_CDN_CLOUDFLARE_EMAIL, | |
LiteSpeed_Cache_Config::OPID_CDN_CLOUDFLARE_KEY, | |
LiteSpeed_Cache_Config::OPID_CDN_CLOUDFLARE_NAME, | |
) ; | |
foreach ( $ids as $id ) { | |
if ( $this->_options[ $id ] === $this->_input[ $id ] ) { | |
continue ; | |
} | |
$cdn_cloudflare_changed = true ; | |
$this->_options[ $id ] = $this->_input[ $id ] ; | |
} | |
// If cloudflare API is on, refresh the zone | |
if ( $this->_options[ LiteSpeed_Cache_Config::OPID_CDN_CLOUDFLARE ] && $cdn_cloudflare_changed ) { | |
$zone = LiteSpeed_Cache_CDN_Cloudflare::get_instance()->fetch_zone( $this->_options ) ; | |
if ( $zone ) { | |
$this->_options[ LiteSpeed_Cache_Config::OPID_CDN_CLOUDFLARE_NAME ] = $zone[ 'name' ] ; | |
$this->_options[ LiteSpeed_Cache_Config::OPID_CDN_CLOUDFLARE_ZONE ] = $zone[ 'id' ] ; | |
LiteSpeed_Cache_Log::debug( "Settings: Get zone successfully \t\t[ID] $zone[id]" ) ; | |
} | |
else { | |
$this->_options[ LiteSpeed_Cache_Config::OPID_CDN_CLOUDFLARE_ZONE ] = '' ; | |
LiteSpeed_Cache_Log::debug( '[Settings] Get zone failed, clean zone' ) ; | |
} | |
} | |
} | |
/** | |
* Validates the media settings. | |
* | |
* @since 1.4 | |
* @access private | |
*/ | |
private function _validate_media() | |
{ | |
$ids = array( | |
LiteSpeed_Cache_Config::OPID_MEDIA_IMG_LAZY, | |
LiteSpeed_Cache_Config::OPID_MEDIA_PLACEHOLDER_RESP, | |
LiteSpeed_Cache_Config::OPID_MEDIA_PLACEHOLDER_RESP_ASYNC, | |
LiteSpeed_Cache_Config::OPID_MEDIA_IFRAME_LAZY, | |
LiteSpeed_Cache_Config::OPID_MEDIA_IMG_LAZYJS_INLINE, | |
LiteSpeed_Cache_Config::OPT_MEDIA_OPTM_AUTO, | |
LiteSpeed_Cache_Config::OPT_MEDIA_OPTM_CRON, | |
LiteSpeed_Cache_Config::OPT_MEDIA_OPTM_ORI, | |
LiteSpeed_Cache_Config::OPT_MEDIA_RM_ORI_BKUP, | |
LiteSpeed_Cache_Config::OPT_MEDIA_OPTM_WEBP, | |
LiteSpeed_Cache_Config::OPT_MEDIA_OPTM_LOSSLESS, | |
LiteSpeed_Cache_Config::OPT_MEDIA_OPTM_EXIF, | |
LiteSpeed_Cache_Config::OPT_MEDIA_WEBP_REPLACE_SRCSET, | |
) ; | |
foreach ( $ids as $id ) { | |
$this->_options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
} | |
$ids = array( | |
LiteSpeed_Cache_Config::OPID_MEDIA_IMG_LAZY_PLACEHOLDER, | |
LiteSpeed_Cache_Config::OPID_MEDIA_PLACEHOLDER_RESP_COLOR, | |
) ; | |
foreach ( $ids as $id ) { | |
$this->_options[ $id ] = $this->_input[ $id ] ; | |
} | |
// Update lazyload image excludes | |
$id = LiteSpeed_Cache_Config::ITEM_MEDIA_LAZY_IMG_EXC ; | |
$this->_save_item( $id, 'uri' ) ; | |
// Update lazyload image classname excludes | |
$id = LiteSpeed_Cache_Config::ITEM_MEDIA_LAZY_IMG_CLS_EXC ; | |
$this->_save_item( $id ) ; | |
$id = LiteSpeed_Cache_Config::ITEM_MEDIA_WEBP_ATTRIBUTE ; | |
$this->_save_item( $id ) ; | |
} | |
/** | |
* Validates the optimize settings. | |
* | |
* @since 1.2.2 | |
* @access private | |
*/ | |
private function _validate_optimize() | |
{ | |
$ids = array( | |
LiteSpeed_Cache_Config::OPID_CSS_MINIFY, | |
LiteSpeed_Cache_Config::OPID_CSS_INLINE_MINIFY, | |
LiteSpeed_Cache_Config::OPID_CSS_COMBINE, | |
LiteSpeed_Cache_Config::OPID_CSS_COMBINED_PRIORITY, | |
LiteSpeed_Cache_Config::OPID_CSS_HTTP2, | |
LiteSpeed_Cache_Config::OPID_JS_MINIFY, | |
LiteSpeed_Cache_Config::OPID_JS_INLINE_MINIFY, | |
LiteSpeed_Cache_Config::OPID_JS_COMBINE, | |
LiteSpeed_Cache_Config::OPID_JS_COMBINED_PRIORITY, | |
LiteSpeed_Cache_Config::OPID_JS_HTTP2, | |
LiteSpeed_Cache_Config::OPID_HTML_MINIFY, | |
LiteSpeed_Cache_Config::OPID_OPTM_QS_RM, | |
LiteSpeed_Cache_Config::OPID_OPTM_GGFONTS_RM, | |
LiteSpeed_Cache_Config::OPID_OPTM_CSS_ASYNC, | |
LiteSpeed_Cache_Config::OPT_OPTM_CCSS_GEN, | |
LiteSpeed_Cache_Config::OPT_OPTM_CCSS_ASYNC, | |
LiteSpeed_Cache_Config::OPT_OPTM_CSS_ASYNC_INLINE, | |
LiteSpeed_Cache_Config::OPID_OPTM_JS_DEFER, | |
LiteSpeed_Cache_Config::OPID_OPTM_EMOJI_RM, | |
LiteSpeed_Cache_Config::OPID_OPTM_EXC_JQUERY, | |
LiteSpeed_Cache_Config::OPID_OPTM_GGFONTS_ASYNC, | |
LiteSpeed_Cache_Config::OPID_OPTM_RM_COMMENT, | |
) ; | |
foreach ( $ids as $id ) { | |
$this->_options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
} | |
$ids = array( | |
LiteSpeed_Cache_Config::OPID_CSS_EXCLUDES, | |
LiteSpeed_Cache_Config::OPID_JS_EXCLUDES, | |
) ; | |
foreach ( $ids as $id ) { | |
$this->_options[ $id ] = LiteSpeed_Cache_Utility::sanitize_lines( $this->_input[ $id ], 'uri' ) ; | |
} | |
$id = LiteSpeed_Cache_Config::OPID_OPTIMIZE_TTL ; | |
$this->_options[ $id ] = $this->_check_ttl( $this->_input, $id, 3600 ) ; | |
// Update critical css | |
update_option( LiteSpeed_Cache_Config::ITEM_OPTM_CSS, $this->_input[ LiteSpeed_Cache_Config::ITEM_OPTM_CSS ] ) ; | |
// prevent URI from optimization | |
$id = LiteSpeed_Cache_Config::ITEM_OPTM_EXCLUDES ; | |
$this->_save_item( $id, 'relative' ) ; | |
// Update js deferred excludes | |
$id = LiteSpeed_Cache_Config::ITEM_OPTM_JS_DEFER_EXC ; | |
$this->_save_item( $id, 'uri' ) ; | |
// Update Role Excludes | |
$id = LiteSpeed_Cache_Config::EXCLUDE_OPTIMIZATION_ROLES ; | |
update_option( $id, ! empty( $this->_input[ $id ] ) ? $this->_input[ $id ] : array() ) ; | |
/** | |
* DNS prefetch | |
* @since 1.7.1 | |
*/ | |
$id = LiteSpeed_Cache_Config::ITEM_DNS_PREFETCH ; | |
$this->_save_item( $id, 'domain' ) ; | |
/** | |
* Combined file max size | |
* @since 1.7.1 | |
*/ | |
$id = LiteSpeed_Cache_Config::OPID_OPTM_MAX_SIZE ; | |
$this->_options[ $id ] = $this->_input[ $id ] ; | |
/** | |
* Separate CCSS File Types & URI | |
* @since 2.6.1 | |
*/ | |
$id = LiteSpeed_Cache_Config::ITEM_OPTM_CCSS_SEPARATE_POSTTYPE ; | |
$this->_save_item( $id ) ; | |
$id = LiteSpeed_Cache_Config::ITEM_OPTM_CCSS_SEPARATE_URI ; | |
$this->_save_item( $id, 'uri' ) ; | |
} | |
/** | |
* Validate advanced setting | |
* | |
* @since 1.7.1 | |
* @access private | |
*/ | |
private function _validate_adv() | |
{ | |
$ids = array( | |
LiteSpeed_Cache_Config::OPID_USE_HTTP_FOR_HTTPS_VARY, | |
// LiteSpeed_Cache_Config::OPID_ADV_FAVICON, | |
LiteSpeed_Cache_Config::OPID_ADV_INSTANT_CLICK, | |
) ; | |
foreach ( $ids as $id ) { | |
$this->_options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
} | |
$ids = array( | |
LiteSpeed_Cache_Config::ITEM_ADV_PURGE_ALL_HOOKS, | |
) ; | |
foreach ( $ids as $id ) { | |
$this->_save_item( $id ) ; | |
} | |
/** | |
* Added Favicon | |
* @since 1.7.2 | |
*/ | |
// $fav_file_arr = array( 'frontend', 'backend' ) ; | |
// $new_favicons = array() ; | |
// foreach ( $fav_file_arr as $v ) { | |
// if ( ! empty( $_FILES[ 'litespeed-file-favicon_' . $v ][ 'name' ] ) ) { | |
// $file = wp_handle_upload( $_FILES[ 'litespeed-file-favicon_' . $v ], array( 'action' => 'update' ) ) ; | |
// if ( ! empty( $file[ 'url' ] ) ) { | |
// LiteSpeed_Cache_Log::debug( '[Settings] Updated favicon [' . $v . '] ' . $file[ 'url' ] ) ; | |
// $new_favicons[ $v ] = $file[ 'url' ] ; | |
// } | |
// elseif ( isset( $file[ 'error' ] ) ) { | |
// LiteSpeed_Cache_Log::debug( '[Settings] Failed to update favicon: [' . $v . '] ' . $file[ 'error' ] ) ; | |
// } | |
// else { | |
// LiteSpeed_Cache_Log::debug( '[Settings] Failed to update favicon: Unkown err [' . $v . ']' ) ; | |
// } | |
// } | |
// } | |
// if ( $new_favicons ) { | |
// $cfg_favicon = get_option( LiteSpeed_Cache_Config::ITEM_FAVICON, array() ) ; | |
// update_option( LiteSpeed_Cache_Config::ITEM_FAVICON, array_merge( $cfg_favicon, $new_favicons ) ) ; | |
// } | |
} | |
/** | |
* Validates the debug settings. | |
* | |
* @since 1.0.12 | |
* @access private | |
*/ | |
private function _validate_debug() | |
{ | |
$id = LiteSpeed_Cache_Config::OPID_ADMIN_IPS ; | |
if ( isset( $this->_input[ $id ] ) ) { | |
$admin_ips = array_map( 'trim', explode( "\n", trim( $this->_input[ $id ] ) ) ) ; | |
$admin_ips = array_filter( $admin_ips ) ; | |
$has_err = false ; | |
if ( $admin_ips ) { | |
foreach ( $admin_ips as $ip ) { | |
if ( ! WP_Http::is_ip_address( $ip ) ) { | |
$has_err = true ; | |
break ; | |
} | |
} | |
} | |
$admin_ips = implode( "\n", $admin_ips ) ; | |
if ( $has_err ) { | |
$this->_err[] = LiteSpeed_Cache_Admin_Display::get_error( LiteSpeed_Cache_Admin_Error::E_SETTING_ADMIN_IP_INV ) ; | |
} | |
else { | |
$this->_options[ $id ] = $admin_ips ; | |
} | |
} | |
$id = LiteSpeed_Cache_Config::OPID_DEBUG ; | |
$this->_options[ $id ] = self::is_checked_radio( $this->_input[ $id ] ) ; | |
$id = LiteSpeed_Cache_Config::OPID_LOG_FILE_SIZE ; | |
$this->_options[ $id ] = $this->_check_ttl( $this->_input, $id, 3, 3000 ) ; | |
$ids = array( | |
LiteSpeed_Cache_Config::OPID_DEBUG_DISABLE_ALL, | |
LiteSpeed_Cache_Config::OPID_DEBUG_LEVEL, | |
LiteSpeed_Cache_Config::OPID_HEARTBEAT, | |
LiteSpeed_Cache_Config::OPID_DEBUG_COOKIE, | |
LiteSpeed_Cache_Config::OPID_COLLAPS_QS, | |
LiteSpeed_Cache_Config::OPID_LOG_FILTERS, | |
) ; | |
foreach ( $ids as $id ) { | |
$this->_options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
} | |
// Remove Object Cache | |
if ( $this->_options[ LiteSpeed_Cache_Config::OPID_DEBUG_DISABLE_ALL ] ) { | |
// Do a purge all (This is before oc file removal, can purge oc too) | |
LiteSpeed_Cache_Purge::purge_all( '[Settings] Debug Disabled ALL' ) ; | |
LiteSpeed_Cache_Log::debug( '[Settings] Remove .object_cache.ini due to debug_disable_all' ) ; | |
LiteSpeed_Cache_Object::get_instance()->del_file() ; | |
// Set a const to avoid regenerating again | |
define( 'LITESPEED_DISABLE_OBJECT', true ) ; | |
} | |
// Filters ignored | |
$ids = array( | |
LiteSpeed_Cache_Config::ITEM_LOG_IGNORE_FILTERS, | |
LiteSpeed_Cache_Config::ITEM_LOG_IGNORE_PART_FILTERS, | |
) ; | |
foreach ( $ids as $id ) { | |
$this->_save_item( $id ) ; | |
} | |
} | |
/** | |
* Validates the crawler settings. | |
* | |
* @since 1.0.12 | |
* @access private | |
*/ | |
private function _validate_crawler() | |
{ | |
$ids = array( | |
LiteSpeed_Cache_Config::CRWL_POSTS, | |
LiteSpeed_Cache_Config::CRWL_PAGES, | |
LiteSpeed_Cache_Config::CRWL_CATS, | |
LiteSpeed_Cache_Config::CRWL_TAGS, | |
) ; | |
foreach ( $ids as $id ) { | |
$this->_options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
} | |
$id = LiteSpeed_Cache_Config::CRWL_EXCLUDES_CPT ; | |
if ( isset( $this->_input[ $id ] ) ) { | |
$arr = array_map( 'trim', explode( "\n", $this->_input[ $id ] ) ) ; | |
$arr = array_filter( $arr ) ; | |
$ori = array_diff( get_post_types( '', 'names' ), array( 'post', 'page' ) ) ; | |
$this->_options[ $id ] = implode( "\n", array_intersect( $arr, $ori ) ) ; | |
} | |
$id = LiteSpeed_Cache_Config::CRWL_ORDER_LINKS ; | |
if( ! isset( $this->_input[ $id ] ) || ! in_array( $this->_input[ $id ], array( | |
LiteSpeed_Cache_Config::CRWL_DATE_DESC, | |
LiteSpeed_Cache_Config::CRWL_DATE_ASC, | |
LiteSpeed_Cache_Config::CRWL_ALPHA_DESC, | |
LiteSpeed_Cache_Config::CRWL_ALPHA_ASC, | |
) ) | |
) { | |
$this->_input[ $id ] = LiteSpeed_Cache_Config::CRWL_DATE_DESC ; | |
} | |
$this->_options[ $id ] = $this->_input[ $id ] ; | |
$usleep_min = 0 ; | |
$usleep_max = 30000 ; | |
if ( ! empty( $_SERVER[ LiteSpeed_Cache_Config::ENV_CRAWLER_USLEEP ] ) ) { | |
$usleep_min = $_SERVER[ LiteSpeed_Cache_Config::ENV_CRAWLER_USLEEP ] ; | |
$usleep_max = null ; | |
} | |
$ids = array( | |
LiteSpeed_Cache_Config::CRWL_USLEEP => array( $usleep_min, $usleep_max ), | |
LiteSpeed_Cache_Config::CRWL_RUN_DURATION => array( 0, null ), | |
LiteSpeed_Cache_Config::CRWL_RUN_INTERVAL => array( 60, null ), | |
LiteSpeed_Cache_Config::CRWL_CRAWL_INTERVAL => array( 0, null ), | |
LiteSpeed_Cache_Config::CRWL_THREADS => array( 1, 16 ), | |
) ; | |
foreach ( $ids as $id => $v ) { | |
list( $min, $max ) = $v ; | |
$this->_options[ $id ] = $this->_check_ttl( $this->_input, $id, $min, $max ) ; | |
} | |
$id = LiteSpeed_Cache_Config::CRWL_LOAD_LIMIT ; | |
$this->_options[ $id ] = $this->_input[ $id ] ; | |
$id = LiteSpeed_Cache_Config::CRWL_DOMAIN_IP ; | |
if ( ! empty( $this->_input[ $id ] ) && ! WP_Http::is_ip_address( $this->_input[ $id ] ) ) { | |
$this->_err[] = LiteSpeed_Cache_Admin_Display::get_error( LiteSpeed_Cache_Admin_Error::E_SETTING_SITE_IP, $this->_input[ $id ] ) ; | |
} | |
else { | |
$this->_options[ $id ] = $this->_input[ $id ] ; | |
} | |
$id = LiteSpeed_Cache_Config::CRWL_CUSTOM_SITEMAP ; | |
if ( ! empty( $this->_input[ $id ] ) && ( $err = $this->_validate_custom_sitemap( $this->_input[ $id ] ) ) !== true ) { | |
$this->_err[] = LiteSpeed_Cache_Admin_Display::get_error( $err, $this->_input[ $id ] ) ; | |
} | |
else { | |
$this->_options[ $id ] = $this->_input[ $id ] ; | |
} | |
$id = LiteSpeed_Cache_Config::ITEM_CRWL_AS_UIDS ; | |
$this->_save_item( $id ) ; | |
/** | |
* Save cookie crawler | |
* @since 2.8 | |
*/ | |
$id = LiteSpeed_Cache_Config::ITEM_CRWL_COOKIES ; | |
$cookie_crawlers = array() ; | |
if ( ! empty( $this->_input[ $id ][ 'name' ] ) ) { | |
foreach ( $this->_input[ $id ][ 'name' ] as $k => $v ) { | |
if ( ! $v ) { | |
continue ; | |
} | |
$cookie_crawlers[ $v ] = $this->_input[ $id ][ 'vals' ][ $k ] ; | |
} | |
} | |
update_option( $id, $cookie_crawlers ) ; | |
} | |
/** | |
* Validates the custom sitemap settings. | |
* | |
* @since 1.1.1 | |
* @access private | |
* @param string $url The sitemap url | |
*/ | |
private function _validate_custom_sitemap( $url ) | |
{ | |
return LiteSpeed_Cache_Crawler::get_instance()->parse_custom_sitemap( $url, false ) ; | |
} | |
/** | |
* Validates settings related to rewrite rules | |
* | |
* @since 1.3 | |
* @access private | |
* @return array New options related to rewrite rule | |
*/ | |
private function _validate_rewrite_settings() | |
{ | |
$new_options = array() ; | |
$ids = array( | |
LiteSpeed_Cache_Config::OPID_CACHE_MOBILE, | |
LiteSpeed_Cache_Config::OPID_CACHE_FAVICON, | |
LiteSpeed_Cache_Config::OPID_CACHE_RES, | |
LiteSpeed_Cache_Config::OPID_CACHE_BROWSER, | |
LiteSpeed_Cache_Config::OPT_MEDIA_WEBP_REPLACE, | |
) ; | |
foreach ( $ids as $id ) { | |
$new_options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
} | |
// TTL check | |
$id = LiteSpeed_Cache_Config::OPID_CACHE_BROWSER_TTL ; | |
$new_options[ $id ] = $this->_check_ttl( $this->_input, $id, 30 ) ; | |
// check mobile agents | |
$id = LiteSpeed_Cache_Config::ID_MOBILEVIEW_LIST ; | |
if ( ! $this->_input[ $id ] && $new_options[ LiteSpeed_Cache_Config::OPID_CACHE_MOBILE ] ) { | |
$this->_err[] = LiteSpeed_Cache_Admin_Display::get_error( LiteSpeed_Cache_Admin_Error::E_SETTING_REWRITE, array( $id, 'EMPTY' ) ) ; | |
} | |
elseif ( $this->_input[ $id ] && ! $this->_syntax_checker( $this->_input[ $id ] ) ) { | |
$this->_err[] = LiteSpeed_Cache_Admin_Display::get_error( LiteSpeed_Cache_Admin_Error::E_SETTING_REWRITE, array( $id, esc_html( $this->_input[ $id ] ) ) ) ; | |
} | |
else { | |
$new_options[ $id ] = $this->_input[ $id ] ; | |
} | |
// No cache cookie settings | |
$id = LiteSpeed_Cache_Config::ID_NOCACHE_COOKIES ; | |
$this->_input[ $id ] = preg_replace( "/[\r\n]+/", '|', $this->_input[ $id ] ) ; | |
if ( $this->_input[ $id ] && ! $this->_syntax_checker( $this->_input[ $id ] ) ) { | |
$this->_err[] = LiteSpeed_Cache_Admin_Display::get_error( LiteSpeed_Cache_Admin_Error::E_SETTING_REWRITE, array( $id, esc_html( $this->_input[ $id ] ) ) ) ; | |
} | |
else { | |
$new_options[ $id ] = $this->_input[ $id ] ; | |
} | |
// No cache user agent settings | |
$id = LiteSpeed_Cache_Config::ID_NOCACHE_USERAGENTS ; | |
if ( $this->_input[ $id ] && ! $this->_syntax_checker( $this->_input[ $id ] ) ) { | |
$this->_err[] = LiteSpeed_Cache_Admin_Display::get_error( LiteSpeed_Cache_Admin_Error::E_SETTING_REWRITE, array( $id, esc_html( $this->_input[ $id ] ) ) ) ; | |
} | |
else { | |
$new_options[ $id ] = $this->_input[ $id ] ; | |
} | |
// Login cookie | |
$id = LiteSpeed_Cache_Config::OPID_LOGIN_COOKIE ; | |
if ( $this->_input[ $id ] && preg_match( '#[^\w\-]#', $this->_input[ $id ] ) ) { | |
$this->_err[] = LiteSpeed_Cache_Admin_Display::get_error( LiteSpeed_Cache_Admin_Error::E_SETTING_LC, esc_html( $this->_input[ $id ] ) ) ; | |
} | |
else { | |
$new_options[ $id ] = $this->_input[ $id ] ; | |
} | |
return $new_options ; | |
} | |
/** | |
* Validates the third party settings. | |
* | |
* @since 1.0.12 | |
* @access private | |
*/ | |
private function _validate_thirdparty() | |
{ | |
$tp_default_options = LiteSpeed_Cache_Config::get_instance()->get_thirdparty_options() ; | |
if ( empty( $tp_default_options ) ) { | |
return ; | |
} | |
$tp_input = array_intersect_key( $this->_input, $tp_default_options ) ; | |
if ( empty( $tp_input ) ) { | |
return ; | |
} | |
$tp_options = apply_filters( 'litespeed_cache_save_options', array_intersect_key( $this->_options, $tp_default_options ), $tp_input ) ; | |
if ( ! empty( $tp_options ) && is_array( $tp_options ) ) { | |
$this->_options = array_merge( $this->_options, $tp_options ) ; | |
} | |
} | |
/** | |
* Validates the esi settings. | |
* | |
* @since 1.1.3 | |
* @access private | |
*/ | |
private function _validate_esi() | |
{ | |
$ids = array( | |
LiteSpeed_Cache_Config::OPID_ESI_ENABLE, | |
LiteSpeed_Cache_Config::OPID_ESI_CACHE_ADMBAR, | |
LiteSpeed_Cache_Config::OPID_ESI_CACHE_COMMFORM, | |
) ; | |
foreach ( $ids as $id ) { | |
$this->_options[ $id ] = self::parse_onoff( $this->_input, $id ) ; | |
} | |
// Save vary group settings | |
$this->_save_item( LiteSpeed_Cache_Config::VARY_GROUP, 'array' ) ; | |
} | |
/** | |
* Hooked to the wp_redirect filter. | |
* This will only hook if there was a problem when saving the widget. | |
* | |
* @since 1.1.3 | |
* @access public | |
* @param string $location The location string. | |
* @return string the updated location string. | |
*/ | |
public static function widget_save_err( $location ) | |
{ | |
return str_replace( '?message=0', '?error=0', $location ) ; | |
} | |
/** | |
* Hooked to the widget_update_callback filter. | |
* Validate the LiteSpeed Cache settings on edit widget save. | |
* | |
* @since 1.1.3 | |
* @access public | |
* @param array $instance The new settings. | |
* @param array $new_instance | |
* @param array $old_instance The original settings. | |
* @param WP_Widget $widget The widget | |
* @return mixed Updated settings on success, false on error. | |
*/ | |
public static function validate_widget_save( $instance, $new_instance, $old_instance, $widget ) | |
{ | |
if ( empty( $new_instance ) ) { | |
return $instance ; | |
} | |
if ( ! isset( $new_instance[ LiteSpeed_Cache_ESI::WIDGET_OPID_ESIENABLE ] ) ) { | |
return $instance ; | |
} | |
if ( ! isset( $new_instance[ LiteSpeed_Cache_ESI::WIDGET_OPID_TTL ] ) ) { | |
return $instance ; | |
} | |
$esistr = $new_instance[ LiteSpeed_Cache_ESI::WIDGET_OPID_ESIENABLE ] ; | |
$ttlstr = $new_instance[ LiteSpeed_Cache_ESI::WIDGET_OPID_TTL ] ; | |
if ( ! is_numeric( $ttlstr ) || ! is_numeric( $esistr ) ) { | |
add_filter( 'wp_redirect', 'LiteSpeed_Cache_Admin_Settings::widget_save_err' ) ; | |
return false ; | |
} | |
$esi = self::is_checked_radio( $esistr ) ; | |
$ttl = intval( $ttlstr ) ; | |
if ( $ttl != 0 && $ttl < 30 ) { | |
add_filter( 'wp_redirect', 'LiteSpeed_Cache_Admin_Settings::widget_save_err' ) ; | |
return false ; // invalid ttl. | |
} | |
if ( empty( $instance[ LiteSpeed_Cache_Config::OPTION_NAME ] ) ) { | |
$instance[ LiteSpeed_Cache_Config::OPTION_NAME ] = array() ; | |
} | |
$instance[ LiteSpeed_Cache_Config::OPTION_NAME ][ LiteSpeed_Cache_ESI::WIDGET_OPID_ESIENABLE ] = $esi ; | |
$instance[ LiteSpeed_Cache_Config::OPTION_NAME ][ LiteSpeed_Cache_ESI::WIDGET_OPID_TTL ] = $ttl ; | |
$current = ! empty( $old_instance[ LiteSpeed_Cache_Config::OPTION_NAME ] ) ? $old_instance[ LiteSpeed_Cache_Config::OPTION_NAME ] : false ; | |
if ( ! $current || $esi != $current[ LiteSpeed_Cache_ESI::WIDGET_OPID_ESIENABLE ] ) { | |
LiteSpeed_Cache_Purge::purge_all( 'Wdiget ESI_enable changed' ) ; | |
} | |
elseif ( $ttl != 0 && $ttl != $current[ LiteSpeed_Cache_ESI::WIDGET_OPID_TTL ] ) { | |
LiteSpeed_Cache_Purge::add( LiteSpeed_Cache_Tag::TYPE_WIDGET . $widget->id ) ; | |
} | |
LiteSpeed_Cache_Purge::purge_all( 'Wdiget saved' ) ; | |
return $instance ; | |
} | |
/** | |
* Parse rewrite input to check for possible issues (e.g. unescaped spaces). | |
* | |
* Issues tracked: | |
* Starts with | | |
* Ends with | | |
* Double | | |
* Unescaped space | |
* Invalid character (NOT \w, -, \, |, \s, /, ., +, *, (, )) | |
* | |
* @since 1.0.9 | |
* @access private | |
* @param String $rule Input rewrite rule. | |
* @return bool True for valid rules, false otherwise. | |
*/ | |
private function _syntax_checker( $rule ) | |
{ | |
$escaped = str_replace( '@', '\@', $rule ) ; | |
$success = true ; | |
set_error_handler( 'litespeed_exception_handler' ) ; | |
try { | |
preg_match( '@' . $escaped . '@', null ) ; | |
} catch ( ErrorException $e ) { | |
$success = false ; | |
} | |
restore_error_handler() ; | |
return $success ; | |
} | |
/** | |
* Helper function to validate TTL settings. Will check if it's set, is an integer, and is greater than 0 and less than INT_MAX. | |
* | |
* @since 1.0.12 | |
* @since 2.6.2 Automatically correct number | |
* @access private | |
* @param array $input Input array | |
* @param string $id Option ID | |
* @param number $min Minimum number | |
* @param number $max Maximum number | |
* @return bool True if valid, false otherwise. | |
*/ | |
private function _check_ttl( $input, $id, $min = false, $max = null ) | |
{ | |
$v = isset( $input[ $id ] ) ? (int) $input[ $id ] : 0 ; | |
if ( $min && $v < $min ) { | |
return $min ; | |
} | |
if ( $v < 0 ) { | |
return 0 ; | |
} | |
if ( $max === null ) { | |
$max = $this->_max_int ; | |
} | |
if ( $v > $max ) { | |
return $max ; | |
} | |
return $v ; | |
} | |
/** | |
* Filter the value for checkbox via input and id (enabled/disabled) | |
* | |
* @since 1.1.6 | |
* @access public | |
* @param int $input The whole input array | |
* @param string $id The ID of the option | |
* @return bool Filtered value | |
*/ | |
public static function parse_onoff( $input, $id ) | |
{ | |
return isset( $input[ $id ] ) && self::is_checked( $input[ $id ] ) ; | |
} | |
/** | |
* Filter the value for checkbox (enabled/disabled) | |
* | |
* @since 1.1.0 | |
* @access public | |
* @param int $val The checkbox value | |
* @return bool Filtered value | |
*/ | |
public static function is_checked( $val ) | |
{ | |
$val = intval( $val ) ; | |
if( $val === LiteSpeed_Cache_Config::VAL_ON ) { | |
return true ; | |
} | |
return false ; | |
} | |
/** | |
* Filter the value for radio (enabled/disabled/notset) | |
* | |
* @since 1.1.0 | |
* @access public | |
* @param int $val The radio value | |
* @return int Filtered value | |
*/ | |
public static function is_checked_radio( $val ) | |
{ | |
$val = intval( $val ) ; | |
if( $val === LiteSpeed_Cache_Config::VAL_ON ) { | |
return LiteSpeed_Cache_Config::VAL_ON ; | |
} | |
if( $val === LiteSpeed_Cache_Config::VAL_ON2 ) { | |
return LiteSpeed_Cache_Config::VAL_ON2 ; | |
} | |
return LiteSpeed_Cache_Config::VAL_OFF ; | |
} | |
/** | |
* To save item in options | |
* | |
* @since 2.2.1 | |
* @access private | |
*/ | |
private function _save_item( $id, $sanitize_filter = false ) | |
{ | |
$val = '' ; | |
if ($id === LiteSpeed_Cache_Config::VARY_GROUP) { | |
$val = $this->_input[ $id ] ; | |
update_option( $id, $val ) ; | |
return $val ; | |
} | |
if ( ! empty( $this->_input[ $id ] ) ) { | |
$val = LiteSpeed_Cache_Utility::sanitize_lines( $this->_input[ $id ], $sanitize_filter ) ; | |
} | |
update_option( $id, $val ) ; | |
return $val ; | |
} | |
/** | |
* Get the current instance object. | |
* | |
* @since 1.1.0 | |
* @access public | |
* @return Current class instance. | |
*/ | |
public static function get_instance() | |
{ | |
if ( ! isset( self::$_instance ) ) { | |
self::$_instance = new self() ; | |
} | |
return self::$_instance ; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment