File "OptimizerAdmin.php"
Full Path: /home/aiclgcwq/photonindustriespvt.com/wp-content/plugins/tenweb-speed-optimizer/OptimizerAdmin.php
File size: 92.56 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace TenWebOptimizer;
use Plugin_Upgrader;
use TenWebOptimizer\WebPageCache\OptimizerWebPageCache;
use Theme_Upgrader;
use WP_Query;
/**
* Class OptimizerAdmin
*/
class OptimizerAdmin
{
const TWO_DELAYED_DEFAULT_LIST = 'getbutton.io,//a.omappapi.com/app/js/api.min.js,' .
'feedbackcompany.com/includes/widgets/feedback-company-widget.min.js,snap.licdn.com/li.lms-analytics/insight.min.js,' .
'static.ads-twitter.com/uwt.js,platform.twitter.com/widgets.js,twq(,/sdk.js#xfbml,static.leadpages.net/leadbars/current/embed.js,' .
'translate.google.com/translate_a/element.js,widget.manychat.com,xfbml.customerchat.js,static.hotjar.com/c/hotjar-,' .
'smartsuppchat.com/loader.js,grecaptcha.execute,Tawk_API,shareaholic,sharethis,simple-share-buttons-adder,addtoany,' .
'font-awesome,wpdiscuz,cookie-law-info,pinit.js,/gtag/js,gtag(,/gtm.js,/gtm-,fbevents.js,fbq(,' .
"google-analytics.com/analytics.js,ga( ',ga(',adsbygoogle,ShopifyBuy,widget.trustpilot.com/bootstrap," .
'ft.sdk.min.js,apps.elfsight.com/p/platform.js,livechatinc.com/tracking.js,LiveChatWidget,/busting/facebook-tracking/,' .
'olark,pixel-caffeine/build/frontend.js,wp-emoji-release.min.js';
protected static $instance = null;
private $page_url;
private $TwoSettings;
const TENWEB_SO_REGENERATE_CRITICAL_ON_UPDATE = false;
private $plugins_requiring_critical_regeneration = [
'elementor/elementor.php',
'elementor-pro/elementor-pro.php',
'beaver-builder-lite-version/fl-builder.php',
'siteorigin-panels/siteorigin-panels.php',
'revslider/revslider.php'
];
public function __construct()
{
$two_plugin_activated_flow_init = get_option('two_plugin_activated_flow_init');
if ($two_plugin_activated_flow_init === '1') {
delete_option('two_plugin_activated_flow_init');
delete_option('two_flow_speed');
delete_option('flow_score_check_init');
OptimizerUtils::add_log_for_score_check_flow('two_activate', 'start init_flow_score_check=>true');
OptimizerUtils::init_flow_score_check(true);
}
global $TwoSettings;
$this->TwoSettings = $TwoSettings;
$this->init_admin();
$this->page_url = OptimizerUtils::get_page_url();
$two_triggerPostOptimizationTasks = get_option('two_triggerPostOptimizationTasks');
// if (!empty($_GET['nonce']) && wp_verify_nonce($_GET['nonce'], 'two_10web_connection')) {
// wp_verify_nonce has been changed as the request from the core service isn't able to pass nonce verification//
if (!empty($_GET['nonce']) && wp_verify_nonce($_GET['nonce'], 'two_10web_connection')) { //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
add_action('admin_init', [$this, 'connect_to_tenweb']); //changed from in_admin_header hook, because of gallery flow, ask Hrach and Serine why
} elseif (isset($_GET['two_disconnect'])) {
if (isset($_GET['nonce']) && wp_verify_nonce($_GET['nonce'], 'two_disconnect_nonce')) { //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
add_action('in_admin_header', ['\TenWebOptimizer\OptimizerAdmin', 'disconnect_from_tenweb']);
}
} elseif (!empty($_GET['new_connection_flow']) && !empty($_GET['connection_error']) && empty($_GET['old_connection_flow'])) {
\TenWebOptimizer\OptimizerUtils::two_redirect(OptimizerUtils::get_tenweb_connection_link('sign-up', ['old_connection_flow' => 1]));
}
add_action('delete_post', [$this, 'delete_optimized_pages_by_id']);
add_action('wp_trash_post', [$this, 'delete_optimized_pages_by_id']);
add_action('permalink_structure_changed', [$this, 'wp_permalink_structure_changed_'], 10, 2);
if ($this->TwoSettings->get_settings('two_enable_plugin_autoupdate') === 'on') {
add_filter('auto_update_plugin', [ $this, 'two_add_two_plugin_to_autoupdate' ], 10, 2);
}
if (get_option(TW_OPTIMIZE_PREFIX . '_cache_structure_size') && (int) get_option(TW_OPTIMIZE_PREFIX . '_cache_structure_size') > TENWEB_CACHE_STRUCTURE_ALLOWED_SIZE) {
self::clear_cache(false, true);
}
}
public function checkDiviSettingsChange()
{
$diviOption = get_option('et_divi');
if ($diviOption && is_array($diviOption) && isset($diviOption['divi_custom_css'])) {
$newCustomCSS = $diviOption['divi_custom_css'];
}
if (get_option(TW_OPTIMIZE_PREFIX . '_clear_cache_after_divi')
|| (false !== get_option(TW_OPTIMIZE_PREFIX . '_old_divi_custom_css') && isset($newCustomCSS) && get_option(TW_OPTIMIZE_PREFIX . '_old_divi_custom_css') !== $newCustomCSS)) {
$this->diviChangesClearCache();
}
}
private function diviChangesClearCache()
{
$two_critical_pages = OptimizerUtils::getCriticalPages();
if (!is_array($two_critical_pages)) {
$two_critical_pages = [];
}
foreach ($two_critical_pages as $critical_page) {
if (isset($critical_page['id']) && $critical_page['id'] != 'front_page') {
OptimizerUtils::delete_critical_page($critical_page['id']);
if (has_action('two_page_optimized_removed')) {
do_action('two_page_optimized_removed', $critical_page['id']);
}
}
}
self::clear_cache();
delete_option(TW_OPTIMIZE_PREFIX . '_clear_cache_after_divi');
delete_option(TW_OPTIMIZE_PREFIX . '_old_divi_custom_css');
}
public function two_add_two_plugin_to_autoupdate($update, $item)
{
$plugins = [ 'tenweb-speed-optimizer' ];
if (isset($item->slug) && in_array($item->slug, $plugins)) {
// update plugin
return true;
}
// use default settings
return $update;
}
public function delete_optimized_pages_by_id($page_id)
{
OptimizerUtils::delete_critical_page($page_id);
if (has_action('two_page_optimized_removed')) {
do_action('two_page_optimized_removed', $page_id);
}
}
public function change_front_page($old_value, $value, $option)
{
// Remove new front page from list.
OptimizerUtils::delete_critical_page($value);
if (has_action('two_page_optimized_removed')) {
do_action('two_page_optimized_removed', $value);
}
self::clear_cache();
}
public function wp_permalink_structure_changed_($old_permalink_structure, $permalink_structure)
{
$no_optimize_pages = get_option('no_optimize_pages');
if (is_array($no_optimize_pages)) {
foreach ($no_optimize_pages as $key => $val) {
if ($key != 'front_page') {
$post_data = OptimizerUtils::get_permalink_name_by_id($key);
$no_optimize_pages[$key] = $post_data[ 'url' ];
}
}
update_option('no_optimize_pages', $no_optimize_pages);
}
}
public function init_admin()
{
ob_start();
// phpcs:ignore
if (!isset($_GET[ 'two_nooptimize' ]) && !isset($_GET[ 'two_action' ])) {
add_action('wp_ajax_nopriv_two_manager_clear_cache', [ $this, 'manager_clear_cache' ]);
if (current_user_can('manage_options')) {
add_action('admin_init', [$this, 'update']);
add_action('admin_init', [$this, 'redirect_after_activation'], 20);
add_action('admin_init', [$this, 'checkDiviSettingsChange']);
add_action('admin_menu', [$this, 'admin_menu']);
add_action('admin_enqueue_scripts', ['\TenWebOptimizer\OptimizerAdmin', 'two_enqueue_admin_assets']);
add_action('wp_enqueue_scripts', [$this, 'two_enqueue_assets']);
add_action('wp_ajax_two_settings', [$this, 'ajax_two_settings']);
add_action('wp_ajax_two_update_setting', [$this, 'ajax_two_update_setting']);
add_action('wp_ajax_two_critical', [$this, 'two_critical']);
add_action('wp_ajax_two_critical_statuses', [$this, 'two_critical_statuses']);
add_action('wp_ajax_two_deactivate_plugins', [$this, 'two_deactivate_plugin']);
add_action('wp_ajax_two_white_label', [$this, 'two_white_label']);
add_action('wp_ajax_two_elementor_regenerate_ccss', [$this, 'two_elementor_regenerate_ccss']);
add_filter('plugin_action_links_' . TENWEB_SO_BASENAME, [$this, 'add_action_link'], 10, 2);
if (!is_admin() && !isset($_GET['elementor-preview']) && isset($_GET['two-menu'])) { // phpcs:ignore
add_action('admin_bar_menu', [$this, 'two_admin_bar_menu'], 99999);
}
add_action('wp_ajax_two_css_options', [$this, 'save_css_options']);
add_action('wp_ajax_two_get_posts_for_critical', [$this, 'get_posts_for_critical']);
// TODO: BOOST-1575 Ensure that the cache for the updated post is cleared for both logged-in and non-logged-in users.
// Once TODO is fixed, delete the 'post_clear_all_cache' function and use the post_clear_cache.
//add_action('save_post', [$this, 'post_clear_cache'], 10, 3); // Clearing all the caches to handle templates. Editing a template will clear entire cache.
add_action('save_post', [$this, 'post_clear_all_cache'], 10, 3); // Clearing all the page caches
add_action('switch_theme', [$this, 'clear_cache'], 10, 0); // When user change theme.
add_action('update_option_show_on_front', [$this, 'change_front_page'], 10, 3); // When reading settings for front page are updated.
add_action('update_option_page_on_front', [$this, 'change_front_page'], 10, 3); // When reading settings for front page are updated.
add_action('wp_update_nav_menu', [$this, 'clear_cache_without_critical_css_regeneration'], 10, 0); // When a custom menu is update.
add_action('update_option_sidebars_widgets', [$this, 'clear_cache_without_critical_css_regeneration'], 10, 0); // When you change the order of widgets.
add_action('update_option_category_base', [$this, 'clear_cache_without_critical_css_regeneration'], 10, 0); // When category permalink is updated.
add_action('update_option_tag_base', [$this, 'clear_cache_without_critical_css_regeneration'], 10, 0); // When tag permalink is updated.
add_action('permalink_structure_changed', [$this, 'clear_cache_without_critical_css_regeneration'], 10, 0); // When permalink structure is update.
add_action('add_link', [$this, 'clear_cache_without_critical_css_regeneration'], 10, 0); // When a link is added.
add_action('edit_link', [$this, 'clear_cache_without_critical_css_regeneration'], 10, 0); // When a link is updated.
add_action('delete_link', [$this, 'clear_cache_without_critical_css_regeneration'], 10, 0); // When a link is deleted.
add_action('customize_save', [$this, 'clear_cache'], 10, 0); // When customizer is saved.
add_action('update_option_theme_mods_' . get_option('stylesheet'), [$this, 'clear_cache_without_critical_css_regeneration'], 10, 0); // When location of a menu is updated.
add_action('sidebar_admin_setup', [$this, 'clear_cache'], 10, 0);
add_action('activated_plugin', [$this, 'clear_cache_conditionally_activate'], 10, 1);
add_action('upgrader_process_complete', [$this, 'clear_cache_conditionally_update'], 10, 2);
add_action('deactivated_plugin', [$this, 'clear_cache_without_critical_css_regeneration'], 10, 0);
add_action('_core_updated_successfully', [$this, 'clear_cache_without_critical_css_regeneration'], 10, 0);
//detect ContactForm7 changes
add_action('wpcf7_save_contact_form', [$this, 'clear_cache_without_critical_css_regeneration'], 10, 0);
//detect WooThemes settings changes
add_action('update_option_woo_options', [$this, 'clear_cache_without_critical_css_regeneration'], 10, 0);
// Disabled temporarily as ACF triggers save_post from front.
// phpcs:ignore
/*if ( class_exists( 'ACF' ) ) {
add_action( 'save_post', array('\TenWebOptimizer\OptimizerAdmin', 'acf_update_fields'), 10, 2 );
}*/
//detect Formidable changes
add_action('frm_update_form', [$this, 'clear_cache_without_critical_css_regeneration'], 10, 0);
//detect Contact Form by WP Forms changes
add_action('wpforms_builder_save_form', [$this, 'clear_cache_without_critical_css_regeneration'], 10, 0);
}
}
add_action('wp_ajax_two_flow_set_mode', [ $this, 'two_flow_set_mode' ]);
add_action('wp_ajax_two_update_flow_status', [ $this, 'two_update_flow_status' ]);
add_action('wp_ajax_two_finish_flow', [ $this, 'two_finish_flow' ]);
add_action('wp_ajax_two_flow_incompatible_plugins', [ $this, 'two_flow_incompatible_plugins' ]);
add_action('wp_ajax_two_clear_cloudflare_cache', [ $this, 'two_clear_cloudflare_cache' ]);
add_filter('two_clear_cache_action', [ $this, 'clear_cache' ], 10, 0);
add_action('two_clear_cache', [ $this, 'clear_cache' ], 10, 0);
add_action('pre_current_active_plugins', [ $this, 'add_deactivation_popup' ]);
/* show custom columns only for administrators */
if (strtolower(TWO_SO_ORGANIZATION_NAME) == '10web' && current_user_can('administrator')) {
add_action('manage_post_posts_custom_column', [ $this, 'two_manage_posts_column'], 10, 2);
add_action('manage_page_posts_custom_column', [ $this, 'two_manage_posts_column'], 10, 2);
}
}
public function two_manage_posts_column($column_key, $post_id)
{
if ($column_key == 'two-speed') {
if (get_post_status($post_id) != 'publish') {
return;
}
require __DIR__ . '/views/post_custom_column.php';
}
}
public function two_flow_set_mode()
{
// phpcs:ignore
if (isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'two_ajax_nonce')
&& isset($_POST['mode'])
&& OptimizerUtils::check_admin_capabilities()) {
$two_conflicting_plugins = OptimizerUtils::get_conflicting_plugins();
$two_triggerPostOptimizationTasks = get_option('two_triggerPostOptimizationTasks');
$mode = sanitize_text_field($_POST['mode']);
global $TwoSettings;
self::set_global_mode($mode);
if (isset($_POST['test_mode']) && $_POST['test_mode'] === '1') { //if clicked on contact us we don't disable test mode
$TwoSettings->update_setting('two_test_mode', 'on', true);
} else {
$TwoSettings->update_setting('two_test_mode', 'off', true);
OptimizerUtils::update_connection_flow_progress('running', 'mode_apply_and_test_mode_disable', [$mode]);
}
if (empty($two_conflicting_plugins) && $two_triggerPostOptimizationTasks !== '1') {
update_option('two_triggerPostOptimizationTasks', '1', false);
}
if (isset($_POST['redirect']) && $_POST['redirect'] === '1') {
OptimizerUtils::two_redirect(TENWEB_DASHBOARD . '?flow_success=1&optimizing_website=' . get_site_option(TENWEB_PREFIX . '_domain_id'));
}
}
}
public function two_update_flow_status()
{
$return_data = [
'success' => false,
];
// phpcs:ignore
if (isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'two_ajax_nonce') && isset($_POST['status']) && !empty($_POST['status']) && OptimizerUtils::check_admin_capabilities()) {
// 1 in-progress
// 2 finished (Looks good)
// 3 contact-us
// 4 contact-us button clicked (new step contact-us clicked)
update_option('two_flow_status', sanitize_text_field($_POST['status']));
if ($_POST['status'] === '4') {
OptimizerUtils::update_connection_flow_progress('running', 'contact_us_clicked');
} elseif ($_POST['status'] === '3') {
OptimizerUtils::update_connection_flow_progress('running', 'contact_us');
}
$return_data['success'] = true;
}
// phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_encode
echo json_encode($return_data);
die;
}
public function two_finish_flow()
{
$return_data = [
'success' => false,
];
// phpcs:ignore
if (isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'two_ajax_nonce') && OptimizerUtils::check_admin_capabilities()) {
update_option('two_flow_status', '2');
OptimizerUtils::update_connection_flow_progress('done', 'connection_flow_finish');
$return_data['success'] = true;
}
// phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_encode
echo json_encode($return_data);
die;
}
public function two_flow_incompatible_plugins()
{
// phpcs:ignore
if (isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'two_ajax_nonce')) {
$incompatible_plugins = [];
$two_triggerPostOptimizationTasks = get_option('two_triggerPostOptimizationTasks');
if (isset($_POST['two_disable_incompatible_plugins']) && isset($_POST['incompatible_plugins']) && is_array($_POST['incompatible_plugins']) && !empty($_POST['incompatible_plugins'])) {
$incompatible_plugins = sanitize_text_field($_POST['incompatible_plugins']);
$two_conflicting_plugins = OptimizerUtils::get_conflicting_plugins();
$incompatible_plugins_inactive = [];
foreach ($incompatible_plugins as $incompatible_plugin) {
if (isset($two_conflicting_plugins[$incompatible_plugin])) {
$incompatible_plugins_inactive[] = $two_conflicting_plugins[$incompatible_plugin];
}
}
if (!empty($incompatible_plugins_inactive) && $two_triggerPostOptimizationTasks !== '1') {
OptimizerUtils::update_connection_flow_progress('running', 'incompatible_plugins_inactive', $incompatible_plugins_inactive);
}
deactivate_plugins($incompatible_plugins);
}
if ($two_triggerPostOptimizationTasks !== '1') {
update_option('two_triggerPostOptimizationTasks', '1', false);
}
OptimizerUtils::two_redirect(TENWEB_DASHBOARD . '?flow_success=1&optimizing_website=' . get_site_option(TENWEB_PREFIX . '_domain_id'));
}
}
public function add_deactivation_popup()
{
if (!TENWEB_SO_HOSTED_ON_10WEB && OptimizerUtils::is_tenweb_booster_connected()) {
include 'views/deactivation_popup.php';
}
}
public function clear_cache_conditionally_activate($plugin)
{
$exclude_critical_regeneration = true;
if ($plugin) {
// Regenerate criticals only if an allowed plugin is actived.
if (in_array($plugin, $this->plugins_requiring_critical_regeneration)) {
$exclude_critical_regeneration = false;
}
}
self::clear_cache(false, $exclude_critical_regeneration, true, true, 'front_page', false, false);
}
public function clear_cache_conditionally_update($upgrader, $hook_extra)
{
$exclude_critical_regeneration = true;
if ($upgrader instanceof Theme_Upgrader) {
// Regenerate citicals only if active theme is updated.
if (isset($hook_extra['themes']) && (is_array($hook_extra['themes']) && in_array(get_option('stylesheet'), $hook_extra['themes']))) {
$exclude_critical_regeneration = false;
}
} elseif ($upgrader instanceof Plugin_Upgrader) {
// Regenerate criticals only if an allowed plugin is active and updated.
if (isset($upgrader->skin->plugin_active) && $upgrader->skin->plugin_active &&
isset($hook_extra['plugins']) && (is_array($hook_extra['plugins']) && array_intersect($this->plugins_requiring_critical_regeneration, $hook_extra['plugins']))) {
$exclude_critical_regeneration = false;
}
}
self::clear_cache(false, $exclude_critical_regeneration, true, true, 'front_page', false, false);
}
public function clear_cache_without_critical_css_regeneration()
{
self::clear_cache(false, true, true, true, 'front_page', false, false);
}
public function post_clear_cache($post_ID, $post, $update)
{
if (isset($post->post_status) && $post->post_status === 'publish' && $update) {
$permalink = get_permalink($post_ID);
OptimizerWebPageCache::delete_cache_by_url($permalink);
if ('post' === $post->post_type && (int) get_option('page_for_posts') > 0) {
OptimizerWebPageCache::delete_cache_by_url(get_option('page_for_posts'));
}
$post_type_archive = get_post_type_archive_link($post->post_type);
if ($post_type_archive) {
OptimizerWebPageCache::delete_cache_by_url($post_type_archive);
}
// Add next post.
// phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.get_adjacent_post_get_adjacent_post
$next_post = get_adjacent_post(false, '', false);
if ($next_post) {
OptimizerWebPageCache::delete_cache_by_url(get_permalink($next_post));
}
// Add next post in same category.
// phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.get_adjacent_post_get_adjacent_post
$next_in_same_cat_post = get_adjacent_post(true, '', false);
if ($next_in_same_cat_post && $next_in_same_cat_post !== $next_post) {
OptimizerWebPageCache::delete_cache_by_url(get_permalink($next_in_same_cat_post));
}
// Add previous post.
// phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.get_adjacent_post_get_adjacent_post
$previous_post = get_adjacent_post(false, '', true);
if ($previous_post) {
OptimizerWebPageCache::delete_cache_by_url(get_permalink($previous_post));
}
// Add previous post in same category.
// phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.get_adjacent_post_get_adjacent_post
$previous_in_same_cat_post = get_adjacent_post(true, '', true);
if ($previous_in_same_cat_post && $previous_in_same_cat_post !== $previous_post) {
OptimizerWebPageCache::delete_cache_by_url(get_permalink($previous_in_same_cat_post));
}
// Add the author page.
$author_url = trailingslashit(get_author_posts_url($post->post_author));
if (trailingslashit(site_url()) !== $author_url && trailingslashit(home_url()) !== $author_url) {
OptimizerWebPageCache::delete_cache_by_url($author_url);
}
// Add all parents.
$parents = get_post_ancestors($post_ID);
if ((bool) $parents) {
foreach ($parents as $parent_id) {
OptimizerWebPageCache::delete_cache_by_url(get_permalink($parent_id));
}
}
OptimizerWebPageCache::delete_cache_by_url(home_url());
remove_action('save_post', [$this, 'post_clear_cache'], 10, 2);
}
}
public function post_clear_all_cache()
{
OptimizerWebPageCache::delete_all_cached_pages();
remove_action('save_post', [$this, 'post_clear_all_cache'], 10, 2);
}
public static function acf_update_fields($post_id, $post)
{
if ($post->post_type == 'acf-field-group' || $post->post_type == 'acf-field') {
self::clear_cache(false, true);
remove_action('save_post', ['\TenWebOptimizer\OptimizerAdmin', 'acf_update_fields'], 10, 2);
}
}
private static function fix_delayed_list_slashes()
{
if (empty(get_option('two_delayed_js_execution_list_updated_fix_slashes'))) {
global $TwoSettings;
$option = $TwoSettings->get_settings('two_delayed_js_execution_list');
if (!empty($option)) {
$option = implode('', explode('\\', $option));
$TwoSettings->update_setting('two_delayed_js_execution_list', stripslashes(trim($option)));
}
}
update_option('two_delayed_js_execution_list_updated_fix_slashes', 1);
}
public function connect_to_tenweb($parameters = null)
{
if (empty($parameters)) {
$parameters = [];
$parameters['email'] = !empty($_GET['email']) ? sanitize_email($_GET['email']) : null; //phpcs:ignore WordPress.Security.NonceVerification.Recommended
$parameters['token'] = !empty($_GET['token']) ? sanitize_text_field($_GET['token']) : null; //phpcs:ignore WordPress.Security.NonceVerification.Recommended
$parameters['new_connection_flow'] = !empty($_GET['new_connection_flow']) ? rest_sanitize_boolean($_GET['new_connection_flow']) : null; //phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$parameters['sign_up_from_free_plugin'] = !empty($_GET['sign_up_from_free_plugin']) ? rest_sanitize_boolean($_GET['sign_up_from_free_plugin']) : null; //phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
}
$email = !empty($parameters['email']) ? sanitize_email($parameters['email']) : null;
$token = !empty($parameters['token']) ? sanitize_text_field($parameters['token']) : null;
$new_connection_flow = !empty($parameters['new_connection_flow']);
$sign_up_from_free_plugin = !empty($parameters['sign_up_from_free_plugin']);
if (!empty($email) && !empty($token)) {
$pwd = md5($token);
$class_login = \Tenweb_Authorization\Login::get_instance();
$args = [ 'connected_from' => TENWEB_SO_CONNECTED_FROM ];
if ($class_login->login($email, $pwd, $token, $args) == true && $class_login->check_logged_in()) {
OptimizerUtils::add_log_for_score_check_flow('connect_to_tenweb', 'start init_flow_score_check=>true');
OptimizerUtils::init_flow_score_check(true);
$two_first_connect = get_option('two_first_connect', false);
$date = time();
if (!$two_first_connect) {
//this option also used to check booster real connection when IO is connected
update_option('two_first_connect', $date);
}
delete_option('two_triggerPostOptimizationTasks');
delete_option('incompatible_plugins_active_send');
global $TwoSettings;
\Tenweb_Authorization\Helper::remove_error_logs();
$TwoSettings->update_setting('two_connected', '1');
$TwoSettings->sync_configs_with_plugin_state();
/*set test mode and set global mode extreme*/
self::set_global_mode('extreme');
/*-----------------------------*/
delete_option('two_flow_critical_start');
self::generateCriticalCssOnInit(true);
$domain_id = get_site_option(TENWEB_PREFIX . '_domain_id');
$url = TENWEB_DASHBOARD . '/websites?optimizing_website=' . $domain_id . '&from_plugin=' . OptimizerUtils::FROM_PLUGIN;
if ($sign_up_from_free_plugin) {
$url .= '&from_free_plugin=1';
}
if ($new_connection_flow) {
// Clear all unexpected output. We don't want to see a warning in rest response.
while (ob_get_level() !== 0) {
ob_end_clean();
}
die(json_encode(['connected_domain_id' => get_site_option(TENWEB_PREFIX . '_domain_id')])); //phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_encode
}
OptimizerUtils::two_redirect($url);
} else {
$errors = $class_login->get_errors();
$err_msg = (!empty($errors)) ? $errors['message'] : 'Something went wrong. ' .
'If this website is already connected to the 10Web dashboard via the manager plugin, ' .
'please disconnect it from the manager plugin to be able to use 10Web Booster.';
set_site_transient('tenweb_so_auth_error_logs', $err_msg, MINUTE_IN_SECONDS);
}
}
if (is_multisite()) {
OptimizerUtils::two_redirect(network_admin_url() . 'admin.php?page=two_settings_page');
}
OptimizerUtils::two_redirect(get_admin_url() . 'admin.php?page=two_settings_page');
}
public static function disconnect_from_tenweb($silent = false)
{
global $TwoSettings;
$TwoSettings->update_setting('two_connected', '0');
$TwoSettings->sync_configs_with_plugin_state('inactive');
delete_option('two_flow_status');
delete_option('two_triggerPostOptimizationTasks');
delete_option('incompatible_plugins_active_send');
delete_option('flow_score_check_init');
delete_option('two_flow_score_log');
delete_option('two_clear_cache_from');
delete_option('two_flow_critical_start');
delete_option('wp_two_nonce_two_init_flow_score');
delete_option('two_activate_score_check_nonce_data');
//deleting option which is showing IO connection
delete_site_option(TENWEB_PREFIX . '_from_image_optimizer');
delete_site_option(TENWEB_PREFIX . '_client_referral_hash');
delete_site_option(TW_OPTIMIZE_PREFIX . '_saved_nonce');
$two_critical_pages = OptimizerUtils::getCriticalPages();
foreach ($two_critical_pages as $c_page) {
OptimizerUtils::delete_critical_page($c_page['id']);
}
$class_login = \Tenweb_Authorization\Login::get_instance();
\Tenweb_Authorization\Helper::remove_error_logs();
$class_login->logout(false);
$redirection_link = get_admin_url() . 'admin.php?page=two_settings_page';
if (isset($_GET['two_reconnect']) && isset($_GET['two_reconnect_nonce'])
&& wp_verify_nonce(sanitize_text_field($_GET['two_reconnect_nonce']), 'two_reconnect_nonce')) {
$redirection_link = \TenWebOptimizer\OptimizerUtils::get_tenweb_connection_link();
}
if (!$silent) {
self::clear_cache(false, true);
self::two_uninstall();
if (is_multisite()) {
OptimizerUtils::two_redirect($redirection_link);
}
OptimizerUtils::two_redirect($redirection_link);
} else {
self::two_uninstall();
}
}
public static function get_incompatible_active_plugins()
{
$incompatiblePluginList = [];
foreach (OptimizerUtils::TWO_INCOMPATIBLE_PLUGIN_LIST as $pluginSlug => $pluginName) {
if (is_plugin_active($pluginSlug)) {
$incompatiblePluginList[] = $pluginName;
}
}
return $incompatiblePluginList;
}
/*
* check state activate and deactivate plugin
*/
public function get_plugins_state()
{
$screen = get_current_screen();
if ($screen->id === 'plugins') {
$two_active_plugins_list = get_option('two_active_plugins_list');
$active_plugins_current = get_option('active_plugins');
if (is_array($two_active_plugins_list) && is_array($active_plugins_current)) {
$diff = array_merge(array_diff($active_plugins_current, $two_active_plugins_list), array_diff($two_active_plugins_list, $active_plugins_current));
if (!empty($diff)) {
self::clear_cache(false, true);
update_option('two_active_plugins_list', $active_plugins_current);
}
} else {
update_option('two_active_plugins_list', $active_plugins_current);
}
}
}
public function two_admin_bar_menu($wp_admin_bar)
{
$wp_admin_bar->add_menu([
'id' => 'two_options',
'title' => '10Web Booster',
]);
}
public function two_enqueue_assets()
{
wp_register_style('two-open-sans', 'https://fonts.googleapis.com/css?family=Open+Sans:300,400,500,600,700,800&display=swap');
$two_exclude_css = $this->TwoSettings->get_settings('two_exclude_css');
$two_async_css = $this->TwoSettings->get_settings('two_async_css');
$two_disable_css = $this->TwoSettings->get_settings('two_disable_css');
$two_async_page = $this->TwoSettings->get_settings('two_async_page');
$two_disable_page = $this->TwoSettings->get_settings('two_disable_page');
$two_async_all = $this->TwoSettings->get_settings('two_async_all');
$two_disable_css_page = [];
$two_async_css_page = [];
if (is_array($two_disable_page) && isset($two_disable_page[$this->page_url])) {
$two_disable_css_page = explode(',', $two_disable_page[$this->page_url]);
}
if (is_array($two_async_page) && isset($two_async_page[$this->page_url])) {
$two_async_css_page = explode(',', $two_async_page[$this->page_url]);
}
$two_async_css = explode(',', $two_async_css);
$two_disable_css = explode(',', $two_disable_css);
$two_exclude_css = explode(',', $two_exclude_css);
wp_enqueue_script('two_admin_bar_js', TENWEB_SO_URL . '/assets/js/two_admin_bar.js', ['jquery'], TENWEB_SO_VERSION);
wp_enqueue_style('two_admin_bar_css', TENWEB_SO_URL . '/assets/css/two_admin_bar.css', [], TENWEB_SO_VERSION);
wp_localize_script('two_admin_bar_js', 'two_admin_vars', [
'ajaxurl' => admin_url('admin-ajax.php'),
'ajaxnonce' => wp_create_nonce('two_ajax_nonce'),
'two_async_css' => json_encode($two_async_css), // phpcs:ignore
'two_disable_css' => json_encode($two_disable_css), // phpcs:ignore
'two_disable_css_page' => json_encode($two_disable_css_page), // phpcs:ignore
'two_async_css_page' => json_encode($two_async_css_page), // phpcs:ignore
'two_async_all' => $two_async_all,
'two_exclude_css' => $two_exclude_css,
]);
}
public function save_css_options()
{
// phpcs:ignore
if (isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'two_ajax_nonce')) {
$page_url_without_pagespeed = '';
$two_async_css = $this->TwoSettings->get_settings('two_async_css');
$two_disable_css = $this->TwoSettings->get_settings('two_disable_css');
$two_async_page = $this->TwoSettings->get_settings('two_async_page');
$two_disable_page = $this->TwoSettings->get_settings('two_disable_page');
$two_exclude_css = $this->TwoSettings->get_settings('two_exclude_css');
$page_url = sanitize_url($_POST['page_url']); // phpcs:ignore
if (OptimizerUtils::get_url_query($page_url, 'PageSpeed') === 'off') {
$page_url_without_pagespeed = str_replace(['?PageSpeed=off', '&PageSpeed=off'], '', $page_url);
}
$page_url = OptimizerUtils::remove_domain_part($page_url);
$page_url_without_pagespeed = OptimizerUtils::remove_domain_part($page_url_without_pagespeed);
$el_id = sanitize_text_field($_POST['el_id']); // phpcs:ignore
$task = sanitize_text_field($_POST['task']); // phpcs:ignore
$state = sanitize_text_field($_POST['state']); // phpcs:ignore
if (!is_array($two_disable_page)) {
$two_disable_page = [];
}
if (!is_array($two_async_page)) {
$two_async_page = [];
}
$two_disable_page[$page_url] = sanitize_text_field($_POST['two_disable_page']); // phpcs:ignore
$two_async_page[$page_url] = sanitize_text_field($_POST['two_async_page']); // phpcs:ignore
if (!empty($page_url_without_pagespeed)) {
$two_disable_page[$page_url_without_pagespeed] = sanitize_text_field($_POST['two_disable_page']); // phpcs:ignore
$two_async_page[$page_url_without_pagespeed] = sanitize_text_field($_POST['two_async_page']); // phpcs:ignore
}
$this->TwoSettings->update_setting('two_disable_page', $two_disable_page);
$this->TwoSettings->update_setting('two_async_page', $two_async_page);
if ($task == 'two_async') {
if ($state === '1') {
$this->TwoSettings->update_setting('two_async_css', $two_async_css . ',' . $el_id);
$this->TwoSettings->update_setting('two_disable_css', str_replace(',' . $el_id, '', $two_disable_css));
} else {
$this->TwoSettings->update_setting('two_async_css', str_replace($el_id, '', $two_async_css));
}
} elseif ($task == 'two_disable') {
if ($state === '1') {
$this->TwoSettings->update_setting('two_disable_css', $two_disable_css . ',' . $el_id);
$this->TwoSettings->update_setting('two_async_css', str_replace(',' . $el_id, '', $two_async_css));
} else {
$this->TwoSettings->update_setting('two_disable_css', str_replace($el_id, '', $two_disable_css));
}
} elseif ($task == 'two_exclude_css') {
if ($state === '1') {
$this->TwoSettings->update_setting('two_exclude_css', $two_exclude_css . ',' . $el_id);
$this->TwoSettings->update_setting('two_async_css', str_replace(',' . $el_id, '', $two_async_css));
$this->TwoSettings->update_setting('two_disable_css', str_replace(',' . $el_id, '', $two_disable_css));
} else {
$this->TwoSettings->update_setting('two_exclude_css', str_replace($el_id, '', $two_disable_css));
}
} else {
$this->TwoSettings->update_setting('two_async_css', str_replace(',' . $el_id, '', $two_async_css));
$this->TwoSettings->update_setting('two_disable_css', str_replace(',' . $el_id, '', $two_disable_css));
}
}
}
public static function two_enqueue_admin_assets($hook_suffix)
{
if ($hook_suffix === 'plugins.php' && strtolower(TWO_SO_ORGANIZATION_NAME) != '10web') {
wp_enqueue_script('two_update_white_label_js', TENWEB_SO_URL . '/assets/js/two_update_white_label.js', [ 'jquery' ], TENWEB_SO_VERSION);
}
wp_register_style('two-open-sans', 'https://fonts.googleapis.com/css?family=Open+Sans:300,400,500,600,700,800&display=swap');
if ($hook_suffix == 'toplevel_page_two_settings_page') {
wp_enqueue_script('two_deactivate_plugin', TENWEB_SO_URL . '/assets/js/two_deactivate_plugin.js', [ 'jquery' ], TENWEB_SO_VERSION);
wp_localize_script('two_deactivate_plugin', 'two_admin_vars', [
'ajaxurl' => admin_url('admin-ajax.php'),
'ajaxnonce' => wp_create_nonce('two_ajax_nonce')
]);
$two_admin_vars = [
'ajaxurl' => admin_url('admin-ajax.php'),
'ajaxnonce' => wp_create_nonce('two_ajax_nonce')
];
$two_critical_default_settings = get_option('two_critical_default_settings');
global $TwoSettings;
if (empty($two_critical_default_settings)) {
$TwoSettings->init_critical_defaults();
}
if (isset($_GET[ 'mode' ]) && 'advanced' === $_GET[ 'mode' ] && (!defined('TWO_INCOMPATIBLE_ERROR') || !TWO_INCOMPATIBLE_ERROR)) { // phpcs:ignore
wp_enqueue_script('two_tagsinput_js', TENWEB_SO_URL . '/assets/js/jquery.tagsinput.min.js', [ 'jquery' ], TENWEB_SO_VERSION);
wp_enqueue_script('two_admin_js', TENWEB_SO_URL . '/assets/js/two_admin.js', [ 'jquery' ], TENWEB_SO_VERSION);
wp_localize_script('two_admin_js', 'two_critical_options', $TwoSettings->critical_options);
wp_enqueue_script('datatables_js', TENWEB_SO_URL . '/assets/js/datatables.min.js', [ 'jquery' ], TENWEB_SO_VERSION);
wp_enqueue_script('two_jquery_multi-select_js', TENWEB_SO_URL . '/assets/js/jquery.multi-select.js', [ 'jquery' ], TENWEB_SO_VERSION);
wp_enqueue_style('two_admin_css', TENWEB_SO_URL . '/assets/css/two_admin.css', '', TENWEB_SO_VERSION);
wp_enqueue_style('two_multi-select_css', TENWEB_SO_URL . '/assets/css/multi-select.css', '', TENWEB_SO_VERSION);
wp_enqueue_style('jquery_tagsinput_css', TENWEB_SO_URL . '/assets/css/jquery.tagsinput.min.css', '', TENWEB_SO_VERSION);
wp_enqueue_style('datatables_min_css', TENWEB_SO_URL . '/assets/css/datatables.min.css', '', TENWEB_SO_VERSION);
wp_localize_script('two_admin_js', 'two_admin_vars', $two_admin_vars);
wp_enqueue_script('two_select2', TENWEB_SO_URL . '/assets/lib/select2/js/select2.min.js', [ 'jquery' ], TENWEB_SO_VERSION);
wp_enqueue_style('two_select2', TENWEB_SO_URL . '/assets/lib/select2/css/select2.min.css', '', TENWEB_SO_VERSION);
} else {
wp_enqueue_style('two_settings_basic_css', TENWEB_SO_URL . '/assets/css/settings_basic.css', ['two-open-sans'], TENWEB_SO_VERSION);
}
}
if ($hook_suffix != 'toplevel_page_two_settings_page') {
// Not add the css to the 10Web Booster page.
wp_enqueue_style('two_speed_css', TENWEB_SO_URL . '/assets/css/speed.css', ['two-open-sans'], TENWEB_SO_VERSION);
}
wp_enqueue_script('two_circle_js', TENWEB_SO_URL . '/assets/js/circle-progress.js', ['jquery'], TENWEB_SO_VERSION);
$is_two_advanced = isset($_GET['page']) && $_GET['page'] == 'two_settings_page' && isset($_GET['mode']) && $_GET['mode'] == 'advanced'; // phpcs:ignore
$optimizing_in_progress_transinent = false;
if (get_the_ID()) {
$optimizing_in_progress_transinent = \TenWebWpTransients\OptimizerTransients::get('two_optimize_inprogress_' . get_the_ID());
}
if (!$is_two_advanced) {
wp_enqueue_script('two_speed_js', TENWEB_SO_URL . '/assets/js/speed.js', ['jquery', 'two_circle_js'], TENWEB_SO_VERSION);
wp_localize_script('two_speed_js', 'two_speed', [
'nonce' => wp_create_nonce('two_ajax_nonce'),
'ajax_url' => admin_url('admin-ajax.php'),
'clearing' => __('Clearing...', 'tenweb-speed-optimizer'),
'cleared' => __('Cleared cache', 'tenweb-speed-optimizer'),
'clear' => __('Clear cache', 'tenweb-speed-optimizer'),
'optimize_entire_website' => \TenWebOptimizer\OptimizerOnInit::two_reached_limit(),
'critical_pages' => \TenWebOptimizer\OptimizerUtils::getCriticalPages(),
'front_page_id' => get_option('page_on_front'),
'optimizing_in_progress' => $optimizing_in_progress_transinent,
'two_front_page_speed' => get_option('two-front-page-speed', []),
'wrong_email' => __('Please enter a valid email address.', 'tenweb-speed-optimizer'),
'sign_up' => __('SIGN UP & CONNECT', 'tenweb-speed-optimizer'),
'connection_link' => esc_url(\TenWebOptimizer\OptimizerUtils::get_tenweb_connection_link()),
'something_wrong' => __('Something went wrong, please try again.', 'tenweb-speed-optimizer'),
]);
wp_localize_script('two_speed_js', 'two_limit_exceed_popup_content', [
'exceed_url' => \TenWebOptimizer\OptimizerOnInit::two_reached_limit() ? esc_url(\TenWebOptimizer\OptimizerOnInit::two_reached_limit() . '?two_comes_from=pagesListAfterLimit') : '',
'exceed_title' => esc_html__('You’ve reached the Free Plan limit', 'tenweb-speed-optimizer'),
'exceed_desc_1' => esc_html__('Upgrade to 10Web Booster Pro to optimize all pages', 'tenweb-speed-optimizer'),
'exceed_desc_2' => esc_html__('and enable Cloudflare Enterprise CDN.', 'tenweb-speed-optimizer'),
'exceed_button_text' => esc_html__('Upgrade', 'tenweb-speed-optimizer'),
]);
}
}
public function admin_menu()
{
add_menu_page(
TWO_SO_ORGANIZATION_NAME . ' Booster',
TWO_SO_ORGANIZATION_NAME . ' Booster',
'manage_options',
'two_settings_page',
[
'\TenWebOptimizer\OptimizerAdmin',
'settings_page',
],
\TenWebOptimizer\OptimizerUtils::get_booster_icon(),
30
);
add_submenu_page(
'',
__('White Label', 'tenweb-speed-optimizer'),
__('White Label', 'tenweb-speed-optimizer'),
'manage_options',
'two_white_label',
['\TenWebOptimizer\OptimizerAdmin', 'white_label_view']
);
$cloudflare_cdn_class = 'two-submenu-cdn-free';
$cloudflare_cdn_class_enabled = '';
if (\TenWebOptimizer\OptimizerUtils::is_paid_user()) {
$cloudflare_cdn_class = 'two-submenu-cdn-paid';
global $TwoSettings;
if ($TwoSettings->get_settings('cloudflare_cache_status') == 'on') {
$cloudflare_cdn_class_enabled = 'two-submenu-cdn-enabled';
}
}
if (!defined('TWO_INCOMPATIBLE_ERROR')
&& !TENWEB_SO_HOSTED_ON_10WEB
&& \TenWebOptimizer\OptimizerUtils::is_tenweb_booster_connected()
&& strtolower(TWO_SO_ORGANIZATION_NAME) === '10web') {
add_submenu_page(
'two_settings_page',
'Main Page',
'Main Page',
'manage_options',
'two_settings_page',
[
'\TenWebOptimizer\OptimizerAdmin',
'settings_page',
]
);
add_submenu_page(
'two_settings_page',
'Cloudflare CDN',
'<span class="' . sanitize_html_class($cloudflare_cdn_class) . ' ' . $cloudflare_cdn_class_enabled . '">Cloudflare CDN</span>',
'manage_options',
'two_cloudflare_cdn',
[
'\TenWebOptimizer\OptimizerAdmin',
'cloudflare_cdn_page',
]
);
if (!\TenWebOptimizer\OptimizerUtils::is_paid_user()) {
add_submenu_page(
'two_settings_page',
'Customer support',
'Customer support',
'manage_options',
'two_customer_support',
[
'\TenWebOptimizer\OptimizerAdmin',
'customer_support',
]
);
}
}
}
public static function white_label_view()
{
require_once __DIR__ . '/views/white_label_view.php';
}
public static function settings_page()
{
if (isset($_GET['mode']) && 'advanced' === $_GET['mode'] && (!defined('TWO_INCOMPATIBLE_ERROR') || !TWO_INCOMPATIBLE_ERROR)) { // phpcs:ignore
if (OptimizerUtils::is_wpml_active() && (empty($_GET['lang']) || $_GET['lang'] !== 'all')) { // phpcs:ignore
$baseUrl = sanitize_text_field($_SERVER['REQUEST_SCHEME']) . '://' . sanitize_text_field($_SERVER['SERVER_NAME']) . sanitize_text_field($_SERVER['REQUEST_URI']); // phpcs:ignore
$location = add_query_arg(sanitize_text_field($_SERVER['QUERY_STRING']), '', $baseUrl); // phpcs:ignore
$location = add_query_arg('lang', 'all', $location);
OptimizerUtils::two_redirect($location);
}
require_once __DIR__ . '/views/settings_view.php';
} else {
if ((!defined('TWO_INCOMPATIBLE_ERROR') || !TWO_INCOMPATIBLE_ERROR) && OptimizerUtils::is_tenweb_booster_connected() && get_option(TENWEBIO_MANAGER_PREFIX . '_domain_id')) {
require_once __DIR__ . '/views/settings_basic.php';
} else {
require_once __DIR__ . '/views/settings_connect.php';
}
}
}
public static function cloudflare_cdn_page()
{
require_once __DIR__ . '/views/cdn_page.php';
}
public static function referral_program_page()
{
require_once __DIR__ . '/views/referral_program_page.php';
}
public static function customer_support()
{
$main_class = 'two-customer-support-main';
$close_icon = false;
require_once __DIR__ . '/views/customer_support.php';
customer_care_html($main_class, $close_icon);
}
public static function get_instance()
{
if (null == self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
public function ajax_two_settings()
{
if (isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'two_ajax_nonce') && isset($_POST['task'])) { // phpcs:ignore
$ajax_task = sanitize_text_field($_POST['task']);
$clear_cache_from = isset($_POST['clear_cache_from']) ? sanitize_text_field($_POST['clear_cache_from']) : '';
if ($ajax_task === 'clear_cache') {
self::clear_cache(
true,
true,
true,
true,
'front_page',
false,
true,
true,
false,
$clear_cache_from
);
} elseif ($ajax_task === 'regenerate_critical') {
self::clear_cache(true, false, true, true, 'all');
} elseif ($ajax_task === 'settings') {
if (isset($_POST['two_critical_pages'])) {
$two_critical_pages = OptimizerUtils::getCriticalPages();
foreach ($_POST['two_critical_pages'] as $key => $val) { // phpcs:ignore
if (isset($two_critical_pages[$key]) && isset($_POST['two_critical_pages'][$key])) {
if (isset($two_critical_pages[$key]['critical_css'])) {
$_POST['two_critical_pages'][$key]['critical_css'] = $two_critical_pages[$key]['critical_css'];
}
if (isset($two_critical_pages[$key]['uncritical_css'])) {
$_POST['two_critical_pages'][$key]['uncritical_css'] = $two_critical_pages[$key]['uncritical_css'];
}
if (isset($two_critical_pages[$key]['critical_fonts'])) {
$_POST['two_critical_pages'][$key]['critical_fonts'] = $two_critical_pages[$key]['critical_fonts'];
}
if (isset($two_critical_pages[$key]['critical_bg'])) {
$_POST['two_critical_pages'][$key]['critical_bg'] = $two_critical_pages[$key]['critical_bg'];
}
if (isset($two_critical_pages[$key]['status'])) {
$_POST['two_critical_pages'][$key]['status'] = $two_critical_pages[$key]['status'];
}
if (isset($two_critical_pages[$key]['critical_date'])) {
$_POST['two_critical_pages'][$key]['critical_date'] = $two_critical_pages[$key]['critical_date'];
}
if (isset($two_critical_pages[$key]['images_in_viewport'])) {
$_POST['two_critical_pages'][$key]['images_in_viewport'] = $two_critical_pages[$key]['images_in_viewport'];
}
}
}
}
$this->TwoSettings->set_settings($_POST);
} elseif ($ajax_task == 'regenerate_webp') {
$url_list = sanitize_text_field($_POST[ 'url_list' ]); // phpcs:ignore
$request_webp_action = OptimizerUtils::request_webp_action('regenerate', $url_list);
echo json_encode($request_webp_action); // phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_encode
die;
} elseif ($ajax_task == 'delete_webp') {
$request_webp_action = OptimizerUtils::request_webp_action('delete');
echo json_encode($request_webp_action); // phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_encode
die;
} elseif ($ajax_task === 'delete_logs' && !empty($_POST['log_type'])) {
OptimizerLogger::delete_logs(sanitize_text_field($_POST['log_type']));
wp_send_json_success();
}
global $TwoSettings;
if ($TwoSettings->get_settings('two_remove_elementor_lazyload') == 'on') {
// change elementor background_lazyload to inactive
if (is_plugin_active('elementor/elementor.php') && get_option('elementor_experiment-e_lazyload') != 'inactive') {
update_option('elementor_experiment-e_lazyload', 'inactive', false);
}
}
// Purge 10Web cache.
do_action('tenweb_purge_all_caches');
$message = apply_filters('two_save_settings_message', __('Success!', 'tenweb-speed-optimizer'));
$code = apply_filters('two_save_settings_code', 0);
$two_webp_delivery_working = OptimizerUtils::testWebPDelivery();
echo json_encode([ 'success' => true, 'message' => $message, 'code' => $code, 'webp_delivery_status' => $two_webp_delivery_working ]); // phpcs:ignore
die;
}
echo json_encode(['success' => false]); // phpcs:ignore
die;
}
public function ajax_two_update_setting()
{
if (isset($_POST[ 'nonce' ]) && wp_verify_nonce($_POST['nonce'], 'two_ajax_nonce')) { // phpcs:ignore
$name = sanitize_text_field($_POST['name']); // phpcs:ignore
$value = sanitize_text_field($_POST['value']); // phpcs:ignore
$this->TwoSettings->update_setting($name, $value);
echo json_encode([ 'success' => true ]); // phpcs:ignore
die;
}
echo json_encode([ 'success' => false ]); // phpcs:ignore
die;
}
public function two_critical()
{
$return_data = [
'success' => false,
];
if (isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'two_ajax_nonce')) { // phpcs:ignore
\TenWebWpTransients\OptimizerTransients::set('two_critical_in_process', '1', 360);
if (isset($_POST['data']['task'])) {
$task = sanitize_text_field($_POST['data']['task']);
if ($task === 'generate') {
if (isset($_POST['data'])) {
$_POST['data']['initiator'] = 'manual_from_ccss_tab';
}
$return_data = OptimizerCriticalCss::generateCriticalCSS($_POST);
} elseif ($task === 'delete' && isset($_POST['data']['page_id'])) {
$page_id = sanitize_text_field($_POST['data']['page_id']);
OptimizerUtils::delete_critical_page($page_id);
self::clear_cache(false, true);
if (has_action('two_page_optimized_removed')) {
do_action('two_page_optimized_removed', $page_id);
}
} elseif ('insert/update' === $task && isset($_POST['data']['page_id'])) {
$page_id = sanitize_text_field($_POST['data']['page_id']);
$two_critical_pages = $this->TwoSettings->get_settings('two_critical_pages');
$update_data = map_deep($_POST['data']['two_critical_pages'][$page_id], 'sanitize_text_field'); // phpcs:ignore
if (isset($two_critical_pages[$page_id])) {
if (isset($two_critical_pages[$page_id]['critical_css'])) {
$update_data['critical_css'] = $two_critical_pages[$page_id]['critical_css'];
}
if (isset($two_critical_pages[$page_id]['uncritical_css'])) {
$update_data['uncritical_css'] = $two_critical_pages[$page_id]['uncritical_css'];
}
if (isset($two_critical_pages[$page_id]['critical_fonts'])) {
$update_data['critical_fonts'] = $two_critical_pages[$page_id]['critical_fonts'];
}
if (isset($two_critical_pages[$page_id]['critical_bg'])) {
$update_data['critical_bg'] = $two_critical_pages[$page_id]['critical_bg'];
}
if (isset($two_critical_pages[$page_id]['critical_date'])) {
$update_data['critical_date'] = $two_critical_pages[$page_id]['critical_date'];
}
}
if (!is_array($two_critical_pages)) {
$two_critical_pages = [];
}
$two_critical_pages[$page_id] = $update_data;
$this->TwoSettings->update_setting('two_critical_pages', $two_critical_pages);
$return_data['success'] = true;
} elseif ($task === 'update_defaults') {
if (isset($_POST['data']['default_settings'])) {
$default_settings = map_deep($_POST['data']['default_settings'], 'sanitize_text_field'); // phpcs:ignore
if (empty($_POST['data']['default_settings']['default_sizes'])) {
$default_settings['default_sizes'] = [];
}
update_option('two_critical_default_settings', $default_settings);
}
$return_data['success'] = true;
}
}
}
echo json_encode($return_data); // phpcs:ignore
die;
}
public function two_critical_statuses()
{
if (isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'two_ajax_nonce')) { // phpcs:ignore
$two_critical_pages = OptimizerUtils::getCriticalPages();
$two_critical_in_process = \TenWebWpTransients\OptimizerTransients::get('two_critical_in_process');
$return_data = [
'pages' => [],
'status' => $two_critical_in_process,
];
if (is_array($two_critical_pages)) {
foreach ($two_critical_pages as $page_id => $critical_page) {
$critical_page_status = $critical_page[ 'status' ];
if ($critical_page_status == 'success') {
if (!isset($critical_page[ 'critical_css' ]) || empty($critical_page[ 'critical_css' ])) {
$critical_page_status = 'not_started';
$two_critical_pages[ $page_id ][ 'status' ] = 'not_started';
}
}
$return_data[ 'pages' ][] = [
'page_id' => $critical_page[ 'id' ],
'status' => $critical_page_status,
];
}
}
$this->TwoSettings->update_setting('two_critical_pages', $two_critical_pages);
echo json_encode($return_data, true); // phpcs:ignore
die;
}
}
public function add_action_link($links, $file)
{
if (TENWEB_SO_BASENAME === $file) {
$settings_link = '<a href="' . esc_url(admin_url('admin.php?page=two_settings_page')) . '">' . __('Settings') . '</a>';
array_unshift($links, $settings_link);
}
return $links;
}
public function manager_clear_cache()
{
// this should be native WP transient as it could be set in other plugins
$two_token_clear_cache = get_transient('two_token_clear_cache');
if (isset($_POST['two_token']) && $two_token_clear_cache === $_POST['two_token']) { // phpcs:ignore
\TenWebWpTransients\OptimizerTransients::delete('two_token_clear_cache');
self::clear_cache(false, !$_POST['regenerate_critical_css']); // phpcs:ignore
}
}
public function two_clear_cloudflare_cache()
{
if (isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'two_ajax_nonce') && OptimizerUtils::check_admin_capabilities()) { // phpcs:ignore
if (isset($_POST['page_url'])) {
OptimizerUtils::clear_cloudflare_cache([sanitize_url($_POST['page_url'])]); // phpcs:ignore
}
}
}
public static function clear_cache(
$is_json = false,
$excludeCriticalRegeneration = false,
$delete_tenweb_manager_cache = true,
$delete_cloudflare_cache = true,
$critical_regeneration_mode = 'front_page',
$clear_critical = false,
$clear_two_cloudflare_cache = true,
$warmup_cache = true,
$delete_files = false,
$clear_cache_from = '',
$skip_home_critical_generation = false
) {
do_action('two_before_clear_cache', debug_backtrace()); //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace
$date = time();
global $TwoSettings;
$TwoSettings->update_setting('two_clear_cache_date', $date);
$TwoSettings->update_setting('tenweb_so_version', TENWEB_SO_VERSION);
$dir = OptimizerCache::get_path();
$delete_cache_db = OptimizerUtils::delete_all_cache_db();
OptimizerCacheStructure::flushAllCache();
$exclude_dir = null;
$two_critical_status = $TwoSettings->get_settings('two_critical_status');
if ($excludeCriticalRegeneration) {
$exclude_dir = 'critical';
}
$cache_file_delete_status = true;
if ($delete_files) {
$cache_file_delete_status = OptimizerUtils::delete_all_cache_file($dir, [$dir, $dir . 'css', $dir . 'js', $dir . 'critical'], $exclude_dir);
} else {
\TenWebOptimizer\WebPageCache\OptimizerWebPageCacheWP::get_instance()->delete_all_cache();
}
OptimizerUtils::purge_pagespeed_cache();
if ($delete_tenweb_manager_cache) {
do_action('tenweb_purge_all_caches', false);
}
if ($delete_cloudflare_cache) {
OptimizerUtils::flushCloudflareCache();
}
wp_cache_flush();
$success = false;
if ($cache_file_delete_status && $delete_cache_db) {
$success = true;
}
OptimizerUtils::clear_third_party_cache();
if (!$excludeCriticalRegeneration && $two_critical_status === 'true') {
OptimizerUtils::regenerate_critical($critical_regeneration_mode);
}
if ($clear_critical) {
self::clear_critical_cache($skip_home_critical_generation);
}
OptimizerLogger::add_clear_cache_log($is_json, $excludeCriticalRegeneration, $delete_tenweb_manager_cache, $delete_cloudflare_cache, $critical_regeneration_mode, $clear_critical);
if ($clear_two_cloudflare_cache) {
OptimizerUtils::clear_cloudflare_cache([], $clear_cache_from);
}
if ($warmup_cache) {
OptimizerUtils::warmup_cache();
}
//phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace, PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection
do_action('two_after_clear_cache', debug_backtrace());
if ($is_json) {
echo json_encode(['success' => $success]); // phpcs:ignore
die;
}
return $success;
}
public static function clear_critical_cache($skip_home_critical_generation = false)
{
global $TwoSettings;
$two_critical_pages = OptimizerUtils::getCriticalPages();
$home_critical = false;
if (is_array($two_critical_pages)) {
foreach ($two_critical_pages as $id => $page) {
if (!$home_critical && $id === 'front_page') {
$home_critical = true;
}
$two_critical_pages[$id]['status'] = 'not_started';
unset($two_critical_pages[$id]['critical_css'], $two_critical_pages[$id]['uncritical_css'], $two_critical_pages[$id]['critical_fonts'], $two_critical_pages[$id]['critical_bg'], $two_critical_pages[$id]['critical_date']);
}
$TwoSettings->update_setting('two_critical_pages', $two_critical_pages);
}
$prefix = 'critical/two_*.*';
OptimizerUtils::delete_files_by_prefix($prefix);
if ($home_critical && ! $skip_home_critical_generation) {
OptimizerCriticalCss::generate_critical_css_by_id('front_page');
}
}
public static function two_activate($networkwide)
{
$access_token = get_site_option(TENWEB_PREFIX . '_access_token', false);
if (!$access_token) {
update_option('two_plugin_activated_flow_init', '1');
}
if (function_exists('is_multisite') && is_multisite()) {
// Check if it is a network activation - if so, run the activation function for each blog id.
if ($networkwide) {
global $wpdb;
// Get all blog ids.
$blogids = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs"); // phpcs:ignore
foreach ($blogids as $blog_id) {
switch_to_blog($blog_id);
self::activate();
restore_current_blog();
}
return;
}
}
add_option('redirect_after_activation_option', true);
self::activate();
}
public static function activate()
{
global $TwoSettings;
$two_version = get_option('tw_optimize_version');
if ($two_version === false) {
$TwoSettings->set_default_settings();
}
self::set_additional_settings();
if (\Tenweb_Authorization\Login::get_instance()->check_logged_in()) {
$TwoSettings->update_setting('two_connected', '1');
$habit_version = '2.8.1';
if (version_compare($two_version, $habit_version, '<') && !TENWEB_SO_HOSTED_ON_10WEB) {
$nonce = uniqid('two_activate_score_check_', false);
update_option('two_activate_score_check_nonce_data', $nonce);
wp_remote_post(admin_url('admin-ajax.php'), [
'timeout' => 5, // phpcs:ignore
'redirection' => 5,
'httpversion' => '1.0',
'blocking' => false,
'body' => [
'action' => 'two_activate_score_check',
'nonce' => $nonce
],
'cookies' => []
]);
}
$TwoSettings->sync_configs_with_plugin_state();
} else {
$TwoSettings->update_setting('two_connected', '0');
}
$TwoSettings->update_setting('two_critical_url_args', 'PageSpeed=off&two_nooptimize=1&two_action=generating_critical_css');
OptimizerUtils::testWebPDelivery();
self::add_two_delayed_js_execution_list();
if (TENWEB_SO_HOSTED_ON_10WEB && strpos(get_site_url(), 'TENWEBLXC') === false) { //if hosted on 10web
// Set WebP delivery to on by default.
if (false === $TwoSettings->get_settings('two_enable_nginx_webp_delivery')) {
$TwoSettings->update_setting('two_enable_nginx_webp_delivery', 'on');
}
if (!$two_version || self::TENWEB_SO_REGENERATE_CRITICAL_ON_UPDATE) {
self::generateCriticalCssOnInit();
}
} elseif (!TENWEB_SO_HOSTED_ON_10WEB) { //connected website
if (\Tenweb_Authorization\Login::get_instance()->check_logged_in() && (!$two_version || self::TENWEB_SO_REGENERATE_CRITICAL_ON_UPDATE)) {
if (!empty(\TenWebOptimizer\OptimizerUtils::TWOConnected()) && empty(\TenWebOptimizer\OptimizerUtils::IOConnected())) {
self::generateCriticalCssOnInit();
}
} elseif (!$two_version) {
if (defined('TENWEB_SO_AUTOCONNECT') && TENWEB_SO_AUTOCONNECT) {
$two_php_not_compatible = defined('TWO_INCOMPATIBLE_ERROR') && TWO_INCOMPATIBLE_ERROR;
$two_connect_link = $two_php_not_compatible ? '' : OptimizerUtils::get_tenweb_connection_link();
OptimizerUtils::two_redirect($two_connect_link, false);
}
}
}
}
public static function generateCriticalCssOnInit($rightAfterConnect = false)
{
$two_version = get_option('tw_optimize_version');
$two_critical_pages = OptimizerUtils::getCriticalPages();
if (empty($two_critical_pages)) {
OptimizerCriticalCss::generate_critical_css_by_id('front_page', $rightAfterConnect);
} else {
if ($two_version === false || version_compare($two_version, '1.54.6', '<')) {
if (OptimizerUtils::is_wpml_active()) {
OptimizerUtils::add_wpml_home_pages_into_critical_pages($two_critical_pages, $two_critical_pages[ 'front_page' ][ 'url' ]);
}
}
if (TENWEB_SO_HOSTED_ON_10WEB) {
OptimizerUtils::regenerate_critical('all', $rightAfterConnect);
} elseif (\Tenweb_Authorization\Login::get_instance()->check_logged_in()) {
if ($rightAfterConnect) {
OptimizerUtils::update_critical_statuses($two_critical_pages, 'not_started');
OptimizerCriticalCss::generate_critical_css_by_id('front_page', $rightAfterConnect);
} else {
OptimizerUtils::regenerate_critical('front_page', $rightAfterConnect);
}
}
}
}
public function update()
{
$version = get_option('tw_optimize_version');
$new_version = TENWEB_SO_VERSION;
if (version_compare($version, $new_version, '<')) {
if (defined('TENWEB_CONNECTED_SPEED')
&& \Tenweb_Authorization\Login::get_instance()->check_logged_in()
&& \Tenweb_Authorization\Login::get_instance()->get_connection_type() == TENWEB_CONNECTED_SPEED
&& empty(get_option('two_first_connect', false))
&& version_compare($version, '2.19.49', '<')
&& empty(OptimizerUtils::IOConnected())) {
// this option also used to check booster real connection when IO is connected
// and if you connected your site before November 2022 you don't have this option
// so in WordPress admin you see Connection screen with Optimize button, to fix that we set that option
update_option('two_first_connect', time());
}
global $TwoSettings;
/* Update TW optimize version */
update_option('tw_optimize_version', $new_version);
self::add_two_delayed_js_execution_list();
self::fix_delayed_list_slashes();
self::set_additional_settings();
$two_critical_sizes = $TwoSettings->get_settings('two_critical_sizes');
if ($two_critical_sizes === false) {
$TwoSettings->set_critical_defaults();
}
if ($TwoSettings->get_settings('two_critical_status') === 'true' && $TwoSettings->get_settings('two_critical_font_status', null) === null) {
$TwoSettings->update_setting('two_critical_font_status', 'true');
}
if (!$TwoSettings->get_settings('two_page_cache_life_time')) {
$TwoSettings->update_setting('two_page_cache_life_time', $TwoSettings->get_default_setting('two_page_cache_life_time'));
}
\TenWebOptimizer\WebPageCache\OptimizerWebPageCacheWP::get_instance()->store_page_cache_configs();
if (TENWEB_SO_HOSTED_ON_10WEB
|| (\Tenweb_Authorization\Login::get_instance()->check_logged_in() && \TenWebOptimizer\OptimizerUtils::TWOConnected())) {
\Tenweb_Authorization\Helper::check_site_state(true);
self::clear_cache(false, !self::TENWEB_SO_REGENERATE_CRITICAL_ON_UPDATE);
}
}
}
public static function two_uninstall()
{
$site_options = [
TENWEB_PREFIX . '_is_available',
'two_flow_mode_select',
'two_conflicting_plugins',
'two_flow_speed',
TENWEB_PREFIX . '_client_referral_hash'];
$options = [
'two_first_connect',
'two_delayed_js_execution_list_updated',
'two_delayed_js_execution_list_updated_fix_slashes',
'two_active_plugins_list',
'two_optimized_date_front_page',
'two_optimization_notif_status',
'two_clear_cache_logs',
'two_default_mode',
'two_optimized_date',
'two_page_speed',
'two_critical_blocked',
'no_optimize_pages',
'two_triggerPostOptimizationTasks',
'two_flow_status',
'two-front-page-speed',
'two_mode_front_page',
'two_optimization_notif_status',
'two_triggerPostOptimizationTasks',
'two_flow_status',
'two_performance_requests_logs',
'two_clear_cache_logs',
'two_critical_css_logs',
'two_serve_not_optimized_page_logs',
'tw_optimize_version'
];
foreach ($site_options as $option) {
delete_site_option($option);
}
foreach ($options as $option) {
delete_option($option);
}
foreach (wp_load_alloptions() as $option => $value) {
if (0 === strpos($option, \TenWebWpTransients\OptimizerTransients::TRANSIENT_KEY) ||
0 === strpos($option, \TenWebWpTransients\OptimizerTransients::TRANSIENT_TIMEOUT_KEY)) {
delete_option($option);
}
}
}
public static function two_deactivate()
{
// Disable WebP delivery on plugin deactivation.
global $TwoSettings;
$two_critical_pages = OptimizerUtils::getCriticalPages();
if (is_array($two_critical_pages)) {
foreach ($two_critical_pages as $id => $page) {
if (isset($page['status']) && $page['status'] == 'in_progress') {
$page['status'] = 'not_started';
}
$critical_key = 'two_critical_' . $id;
$critical_in_progress_key = 'two_critical_in_progress_' . $id;
\TenWebWpTransients\OptimizerTransients::delete($critical_key);
\TenWebWpTransients\OptimizerTransients::delete($critical_in_progress_key);
}
$TwoSettings->update_setting('two_critical_pages', $two_critical_pages);
}
$timestamp = wp_next_scheduled('two_daily_cron_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'two_daily_cron_hook');
}
$TwoSettings->update_setting('two_enable_nginx_webp_delivery', '');
if (isset($_GET['two_disconnect'])) {
if (isset($_GET['nonce']) && wp_verify_nonce($_GET['nonce'], 'two_disconnect_nonce')) { //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
self::disconnect_from_tenweb(true);
}
}
self::clear_cache(false, true, true, true, 'front_page', false, true, false, true);
$TwoSettings->sync_configs_with_plugin_state('inactive');
//call IO deactivation hook
\TenWebIO\Init::deactivate();
\Tenweb_Authorization\Helper::check_site_state(true, null, null, ['tenweb-speed-optimizer' => 0]);
}
private static function add_two_delayed_js_execution_list()
{
global $TwoSettings;
$two_delayed_js_execution_list_updated = get_option('two_delayed_js_execution_list_updated');
if ($two_delayed_js_execution_list_updated != '1') {
$two_delayed_js_execution_list = $TwoSettings->get_settings('two_delayed_js_execution_list');
$default_data = self::TWO_DELAYED_DEFAULT_LIST;
if (isset($two_delayed_js_execution_list) && $two_delayed_js_execution_list && !empty($two_delayed_js_execution_list)) {
$default_data = $two_delayed_js_execution_list . ',' . $default_data;
}
$TwoSettings->update_setting(
'two_delayed_js_execution_list',
$default_data
);
update_option('two_delayed_js_execution_list_updated', '1');
}
}
public function get_posts_for_critical()
{
if (isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'two_ajax_nonce')) { // phpcs:ignore
die('Invalid nonce');
}
$return = [];
$two_critical_pages = OptimizerUtils::getCriticalPages();
$is_wpml_active = OptimizerUtils::is_wpml_active();
if (!isset($two_critical_pages[ 'front_page' ])) {
$flag_url = null;
if ($is_wpml_active) {
$flag_url = OptimizerUtils::get_wpml_post_flag_url('front_page');
}
$return[] = [ 'front_page', 'Home', site_url(), $flag_url];
}
if ($is_wpml_active) {
do_action('wpml_switch_language', 'all'); // to get translated posts to
}
add_filter('posts_where', [ $this, 'title_filter' ], 10, 2);
$search_params = [
'post_type' => 'any',
'post_status' => 'publish',
'posts_per_page' => 50 // phpcs:ignore
];
if (isset($_GET['q'])) {
$search_params[ 'search_post_title' ] = sanitize_text_field($_GET['q']);
}
$search_results = new WP_Query($search_params);
if ($search_results->have_posts()) {
while ($search_results->have_posts()) {
$search_results->the_post();
if (!isset($two_critical_pages[$search_results->post->ID])) {
if ('page' !== get_option('show_on_front')
|| !get_option('page_on_front') || get_option('page_on_front') != $search_results->post->ID
) {
// shorten the title a little
$title = (mb_strlen($search_results->post->post_title) > 50) ? mb_substr($search_results->post->post_title, 0, 49) . '...' : $search_results->post->post_title;
$flag_url = null;
if ($is_wpml_active) {
$flag_url = OptimizerUtils::get_wpml_post_flag_url($search_results->post->ID);
}
$return[] = [ $search_results->post->ID, $title, get_permalink($search_results->post->ID), $flag_url ];
}
}
}
}
remove_filter('posts_where', [ $this, 'title_filter' ]);
echo json_encode($return); // phpcs:ignore
die;
}
public static function title_filter($where, $wp_query)
{
global $wpdb;
if ($search_term = $wp_query->get('search_post_title')) {
$where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql($search_term) . '%\'';
}
return $where;
}
public function redirect_after_activation()
{
/* added to send site state after plugin activation as it was not working in two_activate function */
if (get_option('redirect_after_activation_option', false) && \Tenweb_Authorization\Login::get_instance()->check_logged_in()) {
\Tenweb_Authorization\Helper::check_site_state(true);
}
if (!TENWEB_SO_HOSTED_ON_10WEB && get_option('redirect_after_activation_option', false)
&& (!\Tenweb_Authorization\Login::get_instance()->check_logged_in()
|| (empty(\TenWebOptimizer\OptimizerUtils::TWOConnected())
&& !empty(\TenWebOptimizer\OptimizerUtils::IOConnected())))) {
delete_option('redirect_after_activation_option');
OptimizerUtils::two_redirect(admin_url('admin.php?page=two_settings_page&two_after_activation=true'));
}
delete_option('redirect_after_activation_option');
}
public static function two_deactivate_plugin()
{
if (isset($_POST['nonce'], $_POST['plugin_slug']) && wp_verify_nonce($_POST['nonce'], 'two_ajax_nonce') && current_user_can('deactivate_plugins')) { // phpcs:ignore
$two_incompatible_plugins = OptimizerUtils::get_conflicting_plugins();
$plugin_slug = sanitize_text_field($_POST['plugin_slug']);
if (array_key_exists($plugin_slug, $two_incompatible_plugins)) {
deactivate_plugins($plugin_slug);
}
}
}
public static function two_white_label()
{
if (isset($_POST['nonce'], $_POST['company_name'], $_POST['support_url']) && wp_verify_nonce($_POST['nonce'], 'two_ajax_nonce')) { // phpcs:ignore
$company_name = trim(sanitize_text_field($_POST['company_name']));
$support_url = trim(sanitize_url($_POST['support_url'])); // phpcs:ignore_
update_option('two_so_organization_name', $company_name);
update_option('two_so_organization_support_url', $support_url);
}
}
public static function set_global_mode($mode)
{
global $TwoSettings;
$mode_list = OptimizerUtils::get_modes();
$settings_names = $TwoSettings->settings_names;
foreach ($mode_list[$mode] as $key => $val) {
if ($key === 'two_delay_all_js_execution') {
if ($val) {
$TwoSettings->update_setting('two_delay_all_js_execution', 'on');
} else {
$TwoSettings->update_setting('two_delay_all_js_execution', '');
}
} elseif (isset($settings_names[$key])) {
$TwoSettings->update_setting($key, $val);
} elseif ($key === 'critical_enabled') {
if ($val) {
$TwoSettings->update_setting('two_critical_status', 'true');
} else {
$TwoSettings->update_setting('two_critical_status', '');
}
}
}
update_option('two_default_mode', $mode_list[$mode]);
}
private static function set_additional_settings()
{
global $TwoSettings;
if (!get_option('two_set_not_optimizable_and_turn_off_mode_settings_v2')) {
// This option 'two_set_not_disabled_pages' shouldn't be deleted in uninstall
$TwoSettings->update_setting('two_non_optimizable_speed_optimizer_pages', '/wp-admin/, /xmlrpc.php, wp-.*.php, \/feed(\/)*, index.php, sitemap(_index)?.xml, /store.*,/cart.*, /my-account.*, /checkout.*, /addons.*, well-known, acme-challenge');
$two_optimized_pages = \TenWebOptimizer\OptimizerUtils::getCriticalPages();
$args = [
'post_type' => 'page',
'meta_key' => 'two_mode',
];
$optimized_posts = new WP_Query($args);
if (isset($optimized_posts->posts)) {
foreach ($optimized_posts->posts as $post) {
if (isset($post->ID) && !isset($two_optimized_pages[$post->ID])) {
$two_optimized_pages[$post->ID] = [
'id' => $post->ID,
'url' => get_permalink($post->ID),
];
}
}
}
$so_pages_list = [];
if (is_array($two_optimized_pages)) {
foreach ($two_optimized_pages as $so_page) {
if (isset($so_page['id'], $so_page['url'])) {
$so_page_data = [
'page_id' => $so_page['id'],
'url' => $so_page['url'],
];
if ($so_page['id'] === 'front_page') {
$page_mode = get_option('two_mode_front_page');
} elseif (false !== strpos($so_page['id'], 'term_')) {
$so_page['id'] = (int) ltrim($so_page['id'], 'term_');
$so_page_data['page_id'] = 'term_' . (int) ltrim($so_page_data['page_id'], 'term_');
$page_mode = get_term_meta($so_page['id'], 'two_mode', true);
} elseif (false !== strpos($so_page['id'], 'user_')) {
$so_page['id'] = (int) ltrim($so_page['id'], 'user_');
$so_page_data['page_id'] = 'user_' . (int) ltrim($so_page_data['page_id'], 'user_');
$page_mode = get_user_meta($so_page['id'], 'two_mode', true);
} else {
$so_page['id'] = (int) $so_page['id'];
$so_page_data['page_id'] = (int) $so_page_data['page_id'];
$page_mode = get_post_meta($so_page['id'], 'two_mode', true);
}
if (is_array($page_mode) && isset($page_mode['mode']) && $page_mode['mode'] == 'no_optimize') {
$so_pages_list[$so_page_data['page_id']] = $so_page_data['url'];
}
}
}
$no_optimize_pages_list = get_option('no_optimize_pages');
if (is_array($no_optimize_pages_list)) {
foreach ($so_pages_list as $id) {
if (isset($no_optimize_pages_list[$id])) {
$so_pages_list[$id] = $no_optimize_pages_list[$id];
}
}
}
update_option('no_optimize_pages', $so_pages_list, false);
}
update_option('two_set_not_optimizable_and_turn_off_mode_settings_v2', 1, false);
}
if (!get_option('two_set_dispatch_events')) {
$TwoSettings->update_setting('two_events_after_load', ['DOMContentLoaded', 'Load', 'Click']);
update_option('two_set_dispatch_events', '1');
}
if (!get_option('two_set_generate_ccss_on_load')) {
if (TWO_ALWAYS_CRITICAL && !TENWEB_SO_HOSTED_ON_10WEB) {
$TwoSettings->update_setting('two_generate_ccss_on_load', ['page']);
} else {
$TwoSettings->update_setting('two_generate_ccss_on_load', []);
}
update_option('two_set_generate_ccss_on_load', '1');
}
$set_compress_html_default = get_option('two_set_compress_html_default');
if ($set_compress_html_default != '1') {
$TwoSettings->update_setting(
'two_serve_gzip',
'on'
);
update_option('two_set_compress_html_default', '1');
}
}
public function two_elementor_regenerate_ccss()
{
$two_critical_pages = OptimizerUtils::getCriticalPages();
if (!is_array($two_critical_pages)) {
$two_critical_pages = [];
}
global $TwoSettings;
$two_critical_status = $TwoSettings->get_settings('two_critical_status');
$return_data = [
'success' => false,
];
// phpcs:ignore
if (isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'two_elementor_regenerate_ccss')
&& $two_critical_status) {
$post_types = isset($_POST['allowed_post_types']) ? sanitize_text_field($_POST['allowed_post_types']) : '';
$allowed_post_types = explode(',', $post_types);
$page_id = isset($_POST['page_id']) ? sanitize_text_field($_POST['page_id']) : '';
if (in_array(get_post_type($page_id), $allowed_post_types)) {
if (get_option('page_on_front') == $page_id) {
$page_id = 'front_page';
}
foreach ($two_critical_pages as $critical_page) {
if (isset($critical_page['id']) && $critical_page['id'] == $page_id) {
OptimizerCriticalCss::generate_critical_css_by_id($page_id, false, 'auto_from_elementor_page_edit');
$return_data = [
'success' => true,
];
}
}
}
}
// phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_encode
echo json_encode($return_data);
die;
}
// get and set flow_id and notif_id for starting optimization flow
public static function setFlowIdNotificationId()
{
$nonce = isset($_POST['nonce']) ? sanitize_text_field($_POST['nonce']) : '';
if (!wp_verify_nonce($nonce, 'two_ajax_nonce') || !OptimizerUtils::check_admin_capabilities()) {
die('Permission Denied.');
}
$domain_id = (int) get_option(TENWEBIO_MANAGER_PREFIX . '_domain_id', 0);
if ($domain_id) {
$access_token = get_site_option(TENWEB_PREFIX . '_access_token');
$response = wp_remote_post(TENWEB_API_URL . '/domains/' . $domain_id . '/products/run-booster-flow', [
'method' => 'POST',
'timeout' => 1500, // phpcs:ignore
'headers' => [
'Authorization' => 'Bearer ' . $access_token,
'Accept' => 'application/x.10webmanager.v1+json'
],
]);
if (!is_wp_error($response) && isset($response['body'], $response['response']['code']) && $response['response']['code'] === 200) {
$response_body = json_decode($response['body'], true);
if ($response_body['data'] && $response_body['status'] == 'ok') {
if (isset($response_body['data']['flow_id'])) {
update_site_option(TENWEB_PREFIX . '_flow_id', $response_body['data']['flow_id']);
}
if (isset($response_body['data']['notification_id'])) {
update_site_option(TENWEB_PREFIX . '_notification_id', $response_body['data']['notification_id']);
}
}
} else {
//just for easy check if something went wrong
update_option('two_connection_after_io', [$response], false);
}
}
self::startTheFlow();
}
public static function startTheFlow()
{
$class_login = \Tenweb_Authorization\Login::get_instance();
if ($class_login->check_logged_in()) {
OptimizerUtils::add_log_for_score_check_flow('connect_to_tenweb', 'start init_flow_score_check=>true');
OptimizerUtils::init_flow_score_check(true);
$two_first_connect = get_option('two_first_connect', false);
$date = time();
if (!$two_first_connect) {
//this option also used to check booster real connection when IO is connected
update_option('two_first_connect', $date);
}
delete_option('two_triggerPostOptimizationTasks');
delete_option('incompatible_plugins_active_send');
global $TwoSettings;
\Tenweb_Authorization\Helper::remove_error_logs();
$TwoSettings->update_setting('two_connected', '1');
$TwoSettings->sync_configs_with_plugin_state();
/*set test mode and set global mode extreme*/
self::set_global_mode('extreme');
/*-----------------------------*/
delete_option('two_flow_critical_start');
self::generateCriticalCssOnInit(true);
$domain_id = get_site_option(TENWEB_PREFIX . '_domain_id');
$url = TENWEB_DASHBOARD . '/websites?optimizing_website=' . $domain_id . '&from_plugin=' . OptimizerUtils::FROM_PLUGIN . '&two_only_optimize=1';
$sign_up_from_free_plugin = !empty($_GET['sign_up_from_free_plugin']) ? rest_sanitize_boolean($_GET['sign_up_from_free_plugin']) : null; //phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
if (!empty($sign_up_from_free_plugin)) {
$url .= '&from_free_plugin=1';
}
wp_send_json_success($url);
}
}
}