get_var('SHOW TABLES LIKE "' . $wpdb->prefix . 'litespeed_url_file"');
if ($tb_exists) {
$q =
'ALTER TABLE `' .
$wpdb->prefix .
'litespeed_url_file`
ADD COLUMN `mobile` tinyint(4) NOT NULL COMMENT "mobile=1",
ADD COLUMN `webp` tinyint(4) NOT NULL COMMENT "webp=1"
';
$wpdb->query($q);
}
}
/**
* Add expired to url_file table
* @since 4.4.4
*/
function litespeed_update_4_4_4()
{
global $wpdb;
Debug2::debug('[Data] Upgrade url_file table');
$tb_exists = $wpdb->get_var('SHOW TABLES LIKE "' . $wpdb->prefix . 'litespeed_url_file"');
if ($tb_exists) {
$q =
'ALTER TABLE `' .
$wpdb->prefix .
'litespeed_url_file`
ADD COLUMN `expired` int(11) NOT NULL DEFAULT 0,
ADD KEY `filename_2` (`filename`,`expired`),
ADD KEY `url_id` (`url_id`,`expired`)
';
$wpdb->query($q);
}
}
/**
* Drop cssjs table and rm cssjs folder
* @since 4.3
*/
function litespeed_update_4_3()
{
if (file_exists(LITESPEED_STATIC_DIR . '/ccsjs')) {
File::rrmdir(LITESPEED_STATIC_DIR . '/ccsjs');
}
}
/**
* Drop object cache data file
* @since 4.1
*/
function litespeed_update_4_1()
{
if (file_exists(WP_CONTENT_DIR . '/.object-cache.ini')) {
unlink(WP_CONTENT_DIR . '/.object-cache.ini');
}
}
/**
* Drop cssjs table and rm cssjs folder
* @since 4.0
*/
function litespeed_update_4()
{
global $wpdb;
$tb = $wpdb->prefix . 'litespeed_cssjs';
$existed = $wpdb->get_var("SHOW TABLES LIKE '$tb'");
if (!$existed) {
return;
}
$q = 'DROP TABLE IF EXISTS ' . $tb;
$wpdb->query($q);
if (file_exists(LITESPEED_STATIC_DIR . '/ccsjs')) {
File::rrmdir(LITESPEED_STATIC_DIR . '/ccsjs');
}
}
/**
* Append jQuery to JS optm exclude list for max compatibility
* Turn off JS Combine and Defer
*
* @since 3.5.1
*/
function litespeed_update_3_5()
{
$__conf = Conf::cls();
// Excludes jQuery
foreach (array('optm-js_exc', 'optm-js_defer_exc') as $v) {
$curr_setting = $__conf->conf($v);
$curr_setting[] = 'jquery.js';
$curr_setting[] = 'jquery.min.js';
$__conf->update($v, $curr_setting);
}
// Turn off JS Combine and defer
$show_msg = false;
foreach (array('optm-js_comb', 'optm-js_defer', 'optm-js_inline_defer') as $v) {
$curr_setting = $__conf->conf($v);
if (!$curr_setting) {
continue;
}
$show_msg = true;
$__conf->update($v, false);
}
if ($show_msg) {
$msg = sprintf(
__(
'LiteSpeed Cache upgraded successfully. NOTE: Due to changes in this version, the settings %1$s and %2$s have been turned OFF. Please turn them back on manually and verify that your site layout is correct, and you have no JS errors.',
'litespeed-cache'
),
'' . __('JS Combine', 'litespeed-cache') . '
',
'' . __('JS Defer', 'litespeed-cache') . '
'
);
$msg .= sprintf(' %s.', __('Click here to settings', 'litespeed-cache'));
Admin_Display::info($msg, false, true);
}
}
/**
* For version under v2.0 to v2.0+
*
* @since 3.0
*/
function litespeed_update_2_0($ver)
{
global $wpdb;
// Table version only exists after all old data migrated
// Last modified is v2.4.2
if (version_compare($ver, '2.4.2', '<')) {
/**
* Convert old data from postmeta to img_optm table
* @since 2.0
*/
// Migrate data from `wp_postmeta` to `wp_litespeed_img_optm`
$mids_to_del = array();
$q = "SELECT * FROM $wpdb->postmeta WHERE meta_key = %s ORDER BY meta_id";
$meta_value_list = $wpdb->get_results($wpdb->prepare($q, 'litespeed-optimize-data'));
if ($meta_value_list) {
$max_k = count($meta_value_list) - 1;
foreach ($meta_value_list as $k => $v) {
$md52src_list = maybe_unserialize($v->meta_value);
foreach ($md52src_list as $md5 => $v2) {
$f = array(
'post_id' => $v->post_id,
'optm_status' => $v2[1],
'src' => $v2[0],
'srcpath_md5' => md5($v2[0]),
'src_md5' => $md5,
'server' => $v2[2],
);
$wpdb->replace($wpdb->prefix . 'litespeed_img_optm', $f);
}
$mids_to_del[] = $v->meta_id;
// Delete from postmeta
if (count($mids_to_del) > 100 || $k == $max_k) {
$q = "DELETE FROM $wpdb->postmeta WHERE meta_id IN ( " . implode(',', array_fill(0, count($mids_to_del), '%s')) . ' ) ';
$wpdb->query($wpdb->prepare($q, $mids_to_del));
$mids_to_del = array();
}
}
Debug2::debug('[Data] img_optm inserted records: ' . $k);
}
$q = "DELETE FROM $wpdb->postmeta WHERE meta_key = %s";
$rows = $wpdb->query($wpdb->prepare($q, 'litespeed-optimize-status'));
Debug2::debug('[Data] img_optm delete optm_status records: ' . $rows);
}
/**
* Add target_md5 field to table
* @since 2.4.2
*/
if (version_compare($ver, '2.4.2', '<') && version_compare($ver, '2.0', '>=')) {
// NOTE: For new users, need to bypass this section
$sql = sprintf('ALTER TABLE `%1$s` ADD `server_info` text NOT NULL, DROP COLUMN `server`', $wpdb->prefix . 'litespeed_img_optm');
$res = $wpdb->query($sql);
if ($res !== true) {
Debug2::debug('[Data] Warning: Alter table img_optm failed!', $sql);
} else {
Debug2::debug('[Data] Successfully upgraded table img_optm.');
}
}
// Delete img optm tb version
delete_option($wpdb->prefix . 'litespeed_img_optm');
// Delete possible HTML optm data from wp_options
delete_option('litespeed-cache-optimized');
// Delete HTML optm tb version
delete_option($wpdb->prefix . 'litespeed_optimizer');
}
/**
* Move all options in litespeed-cache-conf from v3.0- to separate records
*
* @since 3.0
*/
function litespeed_update_3_0($ver)
{
global $wpdb;
// Upgrade v2.0- to v2.0 first
if (version_compare($ver, '2.0', '<')) {
litespeed_update_2_0($ver);
}
set_time_limit(86400);
// conv items to litespeed.conf.*
Debug2::debug('[Data] Conv items to litespeed.conf.*');
$data = array(
'litespeed-cache-exclude-cache-roles' => 'cache-exc_roles',
'litespeed-cache-drop_qs' => 'cache-drop_qs',
'litespeed-forced_cache_uri' => 'cache-force_uri',
'litespeed-cache_uri_priv' => 'cache-priv_uri',
'litespeed-excludes_uri' => 'cache-exc',
'litespeed-cache-vary-group' => 'cache-vary_group',
'litespeed-adv-purge_all_hooks' => 'purge-hook_all',
'litespeed-object_global_groups' => 'object-global_groups',
'litespeed-object_non_persistent_groups' => 'object-non_persistent_groups',
'litespeed-media-lazy-img-excludes' => 'media-lazy_exc',
'litespeed-media-lazy-img-cls-excludes' => 'media-lazy_cls_exc',
'litespeed-media-webp_attribute' => 'img_optm-webp_attr',
'litespeed-optm-css' => 'optm-ccss_con',
'litespeed-optm_excludes' => 'optm-exc',
'litespeed-optm-ccss-separate_posttype' => 'optm-ccss_sep_posttype',
'litespeed-optm-css-separate_uri' => 'optm-ccss_sep_uri',
'litespeed-optm-js-defer-excludes' => 'optm-js_defer_exc',
'litespeed-cache-dns_prefetch' => 'optm-dns_prefetch',
'litespeed-cache-exclude-optimization-roles' => 'optm-exc_roles',
'litespeed-log_ignore_filters' => 'debug-log_no_filters', // depreciated
'litespeed-log_ignore_part_filters' => 'debug-log_no_part_filters', // depreciated
'litespeed-cdn-ori_dir' => 'cdn-ori_dir',
'litespeed-cache-cdn_mapping' => 'cdn-mapping',
'litespeed-crawler-as-uids' => 'crawler-roles',
'litespeed-crawler-cookies' => 'crawler-cookies',
);
foreach ($data as $k => $v) {
$old_data = get_option($k);
if ($old_data) {
Debug2::debug("[Data] Convert $k");
// They must be an array
if (!is_array($old_data) && $v != 'optm-ccss_con') {
$old_data = explode("\n", $old_data);
}
if ($v == 'crawler-cookies') {
$tmp = array();
$i = 0;
foreach ($old_data as $k2 => $v2) {
$tmp[$i]['name'] = $k2;
$tmp[$i]['vals'] = explode("\n", $v2);
$i++;
}
$old_data = $tmp;
}
add_option('litespeed.conf.' . $v, $old_data);
}
Debug2::debug("[Data] Delete $k");
delete_option($k);
}
// conv other items
$data = array(
'litespeed-setting-mode' => 'litespeed.setting.mode',
'litespeed-media-need-pull' => 'litespeed.img_optm.need_pull',
'litespeed-env-ref' => 'litespeed.env.ref',
'litespeed-cache-cloudflare_status' => 'litespeed.cdn.cloudflare.status',
);
foreach ($data as $k => $v) {
$old_data = get_option($k);
if ($old_data) {
add_option($v, $old_data);
}
delete_option($k);
}
// Conv conf from litespeed-cache-conf child to litespeed.conf.*
Debug2::debug('[Data] Conv conf from litespeed-cache-conf child to litespeed.conf.*');
$previous_options = get_option('litespeed-cache-conf');
$data = array(
'radio_select' => 'cache',
'hash' => 'hash',
'auto_upgrade' => 'auto_upgrade',
'news' => 'news',
'crawler_domain_ip' => 'server_ip',
'esi_enabled' => 'esi',
'esi_cached_admbar' => 'esi-cache_admbar',
'esi_cached_commform' => 'esi-cache_commform',
'heartbeat' => 'misc-heartbeat_front',
'cache_browser' => 'cache-browser',
'cache_browser_ttl' => 'cache-ttl_browser',
'instant_click' => 'util-instant_click',
'use_http_for_https_vary' => 'util-no_https_vary',
'purge_upgrade' => 'purge-upgrade',
'timed_urls' => 'purge-timed_urls',
'timed_urls_time' => 'purge-timed_urls_time',
'cache_priv' => 'cache-priv',
'cache_commenter' => 'cache-commenter',
'cache_rest' => 'cache-rest',
'cache_page_login' => 'cache-page_login',
'cache_favicon' => 'cache-favicon',
'cache_resources' => 'cache-resources',
'mobileview_enabled' => 'cache-mobile',
'mobileview_rules' => 'cache-mobile_rules',
'nocache_useragents' => 'cache-exc_useragents',
'nocache_cookies' => 'cache-exc_cookies',
'excludes_qs' => 'cache-exc_qs',
'excludes_cat' => 'cache-exc_cat',
'excludes_tag' => 'cache-exc_tag',
'public_ttl' => 'cache-ttl_pub',
'private_ttl' => 'cache-ttl_priv',
'front_page_ttl' => 'cache-ttl_frontpage',
'feed_ttl' => 'cache-ttl_feed',
'login_cookie' => 'cache-login_cookie',
'debug_disable_all' => 'debug-disable_all',
'debug' => 'debug',
'admin_ips' => 'debug-ips',
'debug_level' => 'debug-level',
'log_file_size' => 'debug-filesize',
'debug_cookie' => 'debug-cookie',
'collapse_qs' => 'debug-collapse_qs',
// 'log_filters' => 'debug-log_filters',
'crawler_cron_active' => 'crawler',
// 'crawler_include_posts' => 'crawler-inc_posts',
// 'crawler_include_pages' => 'crawler-inc_pages',
// 'crawler_include_cats' => 'crawler-inc_cats',
// 'crawler_include_tags' => 'crawler-inc_tags',
// 'crawler_excludes_cpt' => 'crawler-exc_cpt',
// 'crawler_order_links' => 'crawler-order_links',
'crawler_usleep' => 'crawler-usleep',
'crawler_run_duration' => 'crawler-run_duration',
'crawler_run_interval' => 'crawler-run_interval',
'crawler_crawl_interval' => 'crawler-crawl_interval',
'crawler_threads' => 'crawler-threads',
'crawler_load_limit' => 'crawler-load_limit',
'crawler_custom_sitemap' => 'crawler-sitemap',
'cache_object' => 'object',
'cache_object_kind' => 'object-kind',
'cache_object_host' => 'object-host',
'cache_object_port' => 'object-port',
'cache_object_life' => 'object-life',
'cache_object_persistent' => 'object-persistent',
'cache_object_admin' => 'object-admin',
'cache_object_transients' => 'object-transients',
'cache_object_db_id' => 'object-db_id',
'cache_object_user' => 'object-user',
'cache_object_pswd' => 'object-psw',
'cdn' => 'cdn',
'cdn_ori' => 'cdn-ori',
'cdn_exclude' => 'cdn-exc',
// 'cdn_remote_jquery' => 'cdn-remote_jq',
'cdn_quic' => 'cdn-quic',
'cdn_cloudflare' => 'cdn-cloudflare',
'cdn_cloudflare_email' => 'cdn-cloudflare_email',
'cdn_cloudflare_key' => 'cdn-cloudflare_key',
'cdn_cloudflare_name' => 'cdn-cloudflare_name',
'cdn_cloudflare_zone' => 'cdn-cloudflare_zone',
'media_img_lazy' => 'media-lazy',
'media_img_lazy_placeholder' => 'media-lazy_placeholder',
'media_placeholder_resp' => 'media-placeholder_resp',
'media_placeholder_resp_color' => 'media-placeholder_resp_color',
'media_placeholder_resp_async' => 'media-placeholder_resp_async',
'media_iframe_lazy' => 'media-iframe_lazy',
// 'media_img_lazyjs_inline' => 'media-lazyjs_inline',
'media_optm_auto' => 'img_optm-auto',
'media_optm_cron' => 'img_optm-cron',
'media_optm_ori' => 'img_optm-ori',
'media_rm_ori_bkup' => 'img_optm-rm_bkup',
// 'media_optm_webp' => 'img_optm-webp',
'media_webp_replace' => 'img_optm-webp',
'media_optm_lossless' => 'img_optm-lossless',
'media_optm_exif' => 'img_optm-exif',
'media_webp_replace_srcset' => 'img_optm-webp_replace_srcset',
'css_minify' => 'optm-css_min',
// 'css_inline_minify' => 'optm-css_inline_min',
'css_combine' => 'optm-css_comb',
// 'css_combined_priority' => 'optm-css_comb_priority',
// 'css_http2' => 'optm-css_http2',
'css_exclude' => 'optm-css_exc',
'js_minify' => 'optm-js_min',
// 'js_inline_minify' => 'optm-js_inline_min',
'js_combine' => 'optm-js_comb',
// 'js_combined_priority' => 'optm-js_comb_priority',
// 'js_http2' => 'optm-js_http2',
'js_exclude' => 'optm-js_exc',
// 'optimize_ttl' => 'optm-ttl',
'html_minify' => 'optm-html_min',
'optm_qs_rm' => 'optm-qs_rm',
'optm_ggfonts_rm' => 'optm-ggfonts_rm',
'optm_css_async' => 'optm-css_async',
// 'optm_ccss_gen' => 'optm-ccss_gen',
// 'optm_ccss_async' => 'optm-ccss_async',
'optm_css_async_inline' => 'optm-css_async_inline',
'optm_js_defer' => 'optm-js_defer',
'optm_emoji_rm' => 'optm-emoji_rm',
// 'optm_exclude_jquery' => 'optm-exc_jq',
'optm_ggfonts_async' => 'optm-ggfonts_async',
// 'optm_max_size' => 'optm-max_size',
// 'optm_rm_comment' => 'optm-rm_comment',
);
foreach ($data as $k => $v) {
if (!isset($previous_options[$k])) {
continue;
}
// The following values must be array
if (!is_array($previous_options[$k])) {
if (in_array($v, array('cdn-ori', 'cache-exc_cat', 'cache-exc_tag'))) {
$previous_options[$k] = explode(',', $previous_options[$k]);
$previous_options[$k] = array_filter($previous_options[$k]);
} elseif (in_array($v, array('cache-mobile_rules', 'cache-exc_useragents', 'cache-exc_cookies'))) {
$previous_options[$k] = explode('|', str_replace('\\ ', ' ', $previous_options[$k]));
$previous_options[$k] = array_filter($previous_options[$k]);
} elseif (
in_array($v, array(
'purge-timed_urls',
'cache-exc_qs',
'debug-ips',
// 'crawler-exc_cpt',
'cdn-exc',
'optm-css_exc',
'optm-js_exc',
))
) {
$previous_options[$k] = explode("\n", $previous_options[$k]);
$previous_options[$k] = array_filter($previous_options[$k]);
}
}
// Special handler for heartbeat
if ($v == 'misc-heartbeat_front') {
if (!$previous_options[$k]) {
add_option('litespeed.conf.misc-heartbeat_front', true);
add_option('litespeed.conf.misc-heartbeat_back', true);
add_option('litespeed.conf.misc-heartbeat_editor', true);
add_option('litespeed.conf.misc-heartbeat_front_ttl', 0);
add_option('litespeed.conf.misc-heartbeat_back_ttl', 0);
add_option('litespeed.conf.misc-heartbeat_editor_ttl', 0);
}
continue;
}
add_option('litespeed.conf.' . $v, $previous_options[$k]);
}
// Conv purge_by_post
$data = array(
'-' => 'purge-post_all',
'F' => 'purge-post_f',
'H' => 'purge-post_h',
'PGS' => 'purge-post_p',
'PGSRP' => 'purge-post_pwrp',
'A' => 'purge-post_a',
'Y' => 'purge-post_y',
'M' => 'purge-post_m',
'D' => 'purge-post_d',
'T' => 'purge-post_t',
'PT' => 'purge-post_pt',
);
if (isset($previous_options['purge_by_post'])) {
$purge_by_post = explode('.', $previous_options['purge_by_post']);
foreach ($data as $k => $v) {
add_option('litespeed.conf.' . $v, in_array($k, $purge_by_post));
}
}
// Conv 404/403/500 TTL
$ttl_status = array();
if (isset($previous_options['403_ttl'])) {
$ttl_status[] = '403 ' . $previous_options['403_ttl'];
}
if (isset($previous_options['404_ttl'])) {
$ttl_status[] = '404 ' . $previous_options['404_ttl'];
}
if (isset($previous_options['500_ttl'])) {
$ttl_status[] = '500 ' . $previous_options['500_ttl'];
}
add_option('litespeed.conf.cache-ttl_status', $ttl_status);
/**
* Resave cdn cfg from lscfg to separate cfg when upgrade to v1.7
*
* NOTE: this can be left here as `add_option` bcos it is after the item `litespeed-cache-cdn_mapping` is converted
*
* @since 1.7
*/
if (isset($previous_options['cdn_url'])) {
$cdn_mapping = array(
'url' => $previous_options['cdn_url'],
'inc_img' => $previous_options['cdn_inc_img'],
'inc_css' => $previous_options['cdn_inc_css'],
'inc_js' => $previous_options['cdn_inc_js'],
'filetype' => $previous_options['cdn_filetype'],
);
add_option('litespeed.conf.cdn-mapping', array($cdn_mapping));
Debug2::debug('[Data] plugin_upgrade option adding CDN map');
}
/**
* Move Exclude settings to separate item
*
* NOTE: this can be left here as `add_option` bcos it is after the relevant items are converted
*
* @since 2.3
*/
if (isset($previous_options['forced_cache_uri'])) {
add_option('litespeed.conf.cache-force_uri', $previous_options['forced_cache_uri']);
}
if (isset($previous_options['cache_uri_priv'])) {
add_option('litespeed.conf.cache-priv_uri', $previous_options['cache_uri_priv']);
}
if (isset($previous_options['optm_excludes'])) {
add_option('litespeed.conf.optm-exc', $previous_options['optm_excludes']);
}
if (isset($previous_options['excludes_uri'])) {
add_option('litespeed.conf.cache-exc', $previous_options['excludes_uri']);
}
// Backup stale conf
Debug2::debug('[Data] Backup stale conf');
delete_option('litespeed-cache-conf');
add_option('litespeed-cache-conf.bk', $previous_options);
// Upgrade site_options if is network
if (is_multisite()) {
$ver = get_site_option('litespeed.conf._version');
if (!$ver) {
Debug2::debug('[Data] Conv multisite');
$previous_site_options = get_site_option('litespeed-cache-conf');
$data = array(
'network_enabled' => 'cache',
'use_primary_settings' => 'use_primary_settings',
'auto_upgrade' => 'auto_upgrade',
'purge_upgrade' => 'purge-upgrade',
'cache_favicon' => 'cache-favicon',
'cache_resources' => 'cache-resources',
'mobileview_enabled' => 'cache-mobile',
'mobileview_rules' => 'cache-mobile_rules',
'login_cookie' => 'cache-login_cookie',
'nocache_cookies' => 'cache-exc_cookies',
'nocache_useragents' => 'cache-exc_useragents',
'cache_object' => 'object',
'cache_object_kind' => 'object-kind',
'cache_object_host' => 'object-host',
'cache_object_port' => 'object-port',
'cache_object_life' => 'object-life',
'cache_object_persistent' => 'object-persistent',
'cache_object_admin' => 'object-admin',
'cache_object_transients' => 'object-transients',
'cache_object_db_id' => 'object-db_id',
'cache_object_user' => 'object-user',
'cache_object_pswd' => 'object-psw',
'cache_browser' => 'cache-browser',
'cache_browser_ttl' => 'cache-ttl_browser',
'media_webp_replace' => 'img_optm-webp',
);
foreach ($data as $k => $v) {
if (!isset($previous_site_options[$k])) {
continue;
}
// The following values must be array
if (!is_array($previous_site_options[$k])) {
if (in_array($v, array('cache-mobile_rules', 'cache-exc_useragents', 'cache-exc_cookies'))) {
$previous_site_options[$k] = explode('|', str_replace('\\ ', ' ', $previous_site_options[$k]));
$previous_site_options[$k] = array_filter($previous_site_options[$k]);
}
}
add_site_option('litespeed.conf.' . $v, $previous_site_options[$k]);
}
// These are already converted to single record in single site
$data = array('object-global_groups', 'object-non_persistent_groups');
foreach ($data as $v) {
$old_data = get_option($v);
if ($old_data) {
add_site_option('litespeed.conf.' . $v, $old_data);
}
}
delete_site_option('litespeed-cache-conf');
add_site_option('litespeed.conf._version', '3.0');
}
}
// delete tables
Debug2::debug('[Data] Drop litespeed_optimizer');
$q = 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'litespeed_optimizer';
$wpdb->query($q);
// Update image optm table
Debug2::debug('[Data] Upgrade img_optm table');
$tb_exists = $wpdb->get_var('SHOW TABLES LIKE "' . $wpdb->prefix . 'litespeed_img_optm"');
if ($tb_exists) {
$status_mapping = array(
'requested' => 3,
'notified' => 6,
'pulled' => 9,
'failed' => -1,
'miss' => -3,
'err' => -9,
'err_fetch' => -5,
'err_optm' => -7,
'xmeta' => -8,
);
foreach ($status_mapping as $k => $v) {
$q = 'UPDATE `' . $wpdb->prefix . "litespeed_img_optm` SET optm_status='$v' WHERE optm_status='$k'";
$wpdb->query($q);
}
$q =
'ALTER TABLE `' .
$wpdb->prefix .
'litespeed_img_optm`
DROP INDEX `post_id_2`,
DROP INDEX `root_id`,
DROP INDEX `src_md5`,
DROP INDEX `srcpath_md5`,
DROP COLUMN `srcpath_md5`,
DROP COLUMN `src_md5`,
DROP COLUMN `root_id`,
DROP COLUMN `target_saved`,
DROP COLUMN `webp_saved`,
DROP COLUMN `server_info`,
MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
MODIFY COLUMN `optm_status` tinyint(4) NOT NULL DEFAULT 0,
MODIFY COLUMN `src` text COLLATE utf8mb4_unicode_ci NOT NULL
';
$wpdb->query($q);
}
delete_option('litespeed-recommended');
Debug2::debug('[Data] litespeed_update_3_0 done!');
add_option('litespeed.conf._version', '3.0');
}