/home/idolaotomotif/webcool.biz/wp-content/plugins/w3-total-cache/pub/js/setup-guide.js
/**
* File: setup-guide.js
*
* JavaScript for the Setup Guide page.
*
* @since 2.0.0
*
* @global W3TC-setup-guide Localized array variable.
*/
var w3tc_enable_ga;
var w3tcTestHistory = {
pgcache: {},
dbcache: {},
objcache: {}
};
var w3tcWizardSlideStepMap = {
'w3tc-wizard-slide-pc1': 'pgcache',
'w3tc-wizard-slide-dbc1': 'dbcache',
'w3tc-wizard-slide-oc1': 'objectcache',
'w3tc-wizard-slide-io1': 'imageservice',
'w3tc-wizard-slide-ll1': 'lazyload',
'w3tc-wizard-slide-complete': 'more'
};
var w3tcWizardSlidesWithTests = [
'w3tc-wizard-slide-pc1',
'w3tc-wizard-slide-dbc1',
'w3tc-wizard-slide-oc1'
];
jQuery(function() {
var $container = jQuery( '#w3tc-wizard-container'),
$nextButton = $container.find( '#w3tc-wizard-next '),
$tosNotice = $container.find( '#w3tc-licensing-terms' );
w3tc_enable_ga = !!( 'accept' === W3TC_SetupGuide.tos_choice && W3TC_SetupGuide.track_usage && window.w3tc_ga );
// GA.
if ( w3tc_enable_ga ) {
w3tc_ga(
'event',
'button',
{
eventCategory: 'w3tc_setup_guide',
eventLabel: 'w3tc-wizard-step-welcome'
}
);
}
// Handle the terms of service notice.
if ( $tosNotice.length ) {
$nextButton.prop( 'disabled', true );
$container.find( '.dashicons-yes' ).hide();
$tosNotice.find( '.button' ).on( 'click', function() {
var $this = jQuery( this ),
choice = $this.data( 'choice' );
jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: $container.find( '[name="_wpnonce"]' ).val(),
action: "w3tc_tos_choice",
choice: choice
}
})
.done(function( response ) {
$tosNotice.hide();
$nextButton.prop( 'disabled', false );
$container.find( '#w3tc-welcome' ).show();
$container.find( '.dashicons-yes' ).show();
})
.fail(function() {
$this.text( 'Error with Ajax; reloading page...' );
location.reload();
});
if ( 'accept' === choice ) {
W3TC_SetupGuide.tos_choice = choice;
var gaScript = document.createElement( 'script' );
gaScript.type = 'text/javascript';
gaScript.setAttribute( 'async', 'true' );
gaScript.setAttribute( 'src', 'https://www.googletagmanager.com/gtag/js?id=' + W3TC_SetupGuide.ga_profile );
document.documentElement.firstChild.appendChild( gaScript );
window.dataLayer = window.dataLayer || [];
window.w3tc_ga = function() { dataLayer.push( arguments ); }
w3tc_enable_ga = true;
w3tc_ga( 'js', new Date() );
w3tc_ga( 'config', W3TC_SetupGuide.ga_profile, {
'user_properties': {
'plugin': 'w3-total-cache',
'w3tc_version': W3TC_SetupGuide.w3tc_version,
'wp_version': W3TC_SetupGuide.wp_version,
'php_version': W3TC_SetupGuide.php_version,
'server_software': W3TC_SetupGuide.server_software,
'wpdb_version': W3TC_SetupGuide.db_version,
'home_url': W3TC_SetupGuide.home_url_host,
'w3tc_install_version': W3TC_SetupGuide.install_version,
'w3tc_edition': W3TC_SetupGuide.w3tc_edition,
'w3tc_widgets': W3TC_SetupGuide.list_widgets,
'page': W3TC_SetupGuide.page,
'w3tc_install_date': W3TC_SetupGuide.w3tc_install_date,
'w3tc_pro': W3TC_SetupGuide.w3tc_pro,
'w3tc_has_key': W3TC_SetupGuide.w3tc_has_key,
'w3tc_pro_c': W3TC_SetupGuide.w3tc_pro_c,
'w3tc_enterprise_c': W3TC_SetupGuide.w3tc_enterprise_c,
'w3tc_plugin_type': W3TC_SetupGuide.plugin_type,
}
});
w3tc_ga(
'event',
'button',
{
eventCategory: 'w3tc_setup_guide',
eventLabel: 'w3tc-wizard-step-welcome'
}
);
}
});
}
});
jQuery( '#w3tc-wizard-step-welcome' )
.addClass( 'is-active' );
/**
* Record a test result for later averaging.
*
* @since 2.8.8
*
* @param string type Cache type key.
* @param string engine Engine slug.
* @param number value Result value in seconds.
*/
function w3tcRecordTestResult( type, engine, value ) {
if ( ! w3tcTestHistory[ type ] ) {
w3tcTestHistory[ type ] = {};
}
if ( ! w3tcTestHistory[ type ][ engine ] ) {
w3tcTestHistory[ type ][ engine ] = [];
}
w3tcTestHistory[ type ][ engine ].push( value );
}
/**
* Get an average result (seconds) for a cache engine.
*
* @since 2.8.8
*
* @param string type Cache type key.
* @param string engine Engine slug.
* @return float|null
*/
function w3tcGetAverageResult( type, engine ) {
var history = w3tcTestHistory[ type ] && w3tcTestHistory[ type ][ engine ] ? w3tcTestHistory[ type ][ engine ] : null;
if ( ! history || ! history.length ) {
return null;
}
return history.reduce( function( total, value ) {
return total + value;
}, 0 ) / history.length;
}
/**
* Calculate the percent change using averaged results.
*
* @since 2.8.8
*
* @param string type Cache type key.
* @param string engine Cache engine slug.
* @return string|null
*/
function w3tcGetAveragePercentChange( type, engine ) {
var average = w3tcGetAverageResult( type, engine ),
baseline = w3tcGetAverageResult( type, 'none' );
if ( null === average || null === baseline || 0 === baseline || 'none' === engine ) {
return null;
}
return ( ( average - baseline ) / baseline * 100 ).toFixed( 2 );
}
/**
* Format a seconds value as milliseconds.
*
* @since 2.8.8
*
* @param float|null seconds Value in seconds.
* @return string|null
*/
function w3tcFormatMs( seconds ) {
if ( null === seconds ) {
return null;
}
return ( seconds * 1000 ).toFixed( 2 );
}
/**
* Toggle the completion checkmark for a step.
*
* @since 2.0.0
*
* @param string stepId The step slug (matches the ID suffix).
* @param bool complete Whether the step should show as complete.
*/
function toggleStepComplete( stepId, complete ) {
var excludedSteps = [ 'welcome', 'more' ],
$step = jQuery( '#w3tc-wizard-step-' + stepId );
if ( -1 !== excludedSteps.indexOf( stepId ) ) {
return;
}
if ( complete && ! $step.find( '.dashicons-yes' ).length ) {
$step.append( '<span class="dashicons dashicons-yes"></span>' );
}
}
/**
* Flag a slide as having completed its tests.
*
* @since 2.10.0
*
* @param string slideId The current slide ID.
*/
function w3tc_mark_slide_tests_complete( slideId ) {
jQuery( '#' + slideId ).data( 'testsComplete', true );
}
/**
* Mark a step complete when navigating away from a slide.
*
* @since 2.10.0
*
* @param string slideId The slide being left.
*/
function w3tc_mark_step_complete_on_leave( slideId ) {
var stepId = w3tcWizardSlideStepMap[ slideId ],
requiresTests = -1 !== w3tcWizardSlidesWithTests.indexOf( slideId );
if ( ! stepId ) {
return;
}
if ( requiresTests && ! jQuery( '#' + slideId ).data( 'testsComplete' ) ) {
return;
}
toggleStepComplete( stepId, true );
}
/**
* Display a disk warning.
*
* Used for dbcache and objectcache.
*
* @since 2.8.1
*
* @param bool show Print the warning or not.
*/
function w3tc_disk_warning( show = true ) {
if (show) {
jQuery( '#w3tc-wizard-container .w3tc-wizard-slides:visible' ).append(
'<div class="notice notice-warning w3tc-disk-warning"><p><strong>' +
W3TC_SetupGuide.warning_disk +
'</strong></p></div>'
);
} else {
jQuery( '#w3tc-wizard-container .w3tc-wizard-slides:visible .w3tc-disk-warning').remove();
}
}
/**
* Wizard actions.
*
* @since 2.0.0
*
* @param object $slide The div of the slide displayed.
* @param object $previousSlide The slide being left before showing the new one.
*/
function w3tc_wizard_actions( $slide, $previousSlide ) {
var configSuccess = false,
pgcacheSettings = {
enabled: null,
engine: null
},
dbcacheSettings = {
enabled: null,
engine: null
},
objcacheSettings = {
enabled: null,
engine: null
},
imageserviceSettings = {
enabled: null,
settings: {
webp: true,
avif: true,
compression: 'lossy',
auto: 'enabled',
visibility: 'never'
}
},
lazyloadSettings = {
enabled: null
},
slideId = $slide.prop( 'id' ),
previousSlideId = $previousSlide && $previousSlide.length ? $previousSlide.prop( 'id' ) : null,
$container = jQuery( '#w3tc-wizard-container' ),
nonce = $container.find( '[name="_wpnonce"]' ).val(),
$nextButton = $container.find( '#w3tc-wizard-next' ),
$prevButton = $container.find( '#w3tc-wizard-previous' ),
$skipButton = $container.find( '#w3tc-wizard-skip' ),
$dashboardButton = $container.find( '#w3tc-wizard-dashboard' ),
$objcacheEngine = $container.find( 'input[name="objcache_engine"]' );
/**
* Configure Page Cache.
*
* @since 2.0.0
*
* @param int enable Enable Page Cache.
* @param string engine Page Cache storage engine.
* @return jqXHR
*/
function configPgcache( enable, engine = '' ) {
var $jqXHR = jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: nonce,
action: 'w3tc_config_pgcache',
enable: enable,
engine: engine
}
});
configSuccess = null;
$jqXHR.done(function( response ) {
configSuccess = response.data.success;
});
return $jqXHR;
}
/**
* Get Page Cache settings.
*
* @since 2.0.0
*
* @return jqXHR
*/
function getPgcacheSettings() {
return jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: nonce,
action: 'w3tc_get_pgcache_settings'
}
})
.done(function( response ) {
pgcacheSettings = response.data;
});
}
/**
* Configure Database Cache.
*
* @since 2.0.0
*
* @param int enable Enable database cache.
* @param string engine Database cache storage engine.
* @return jqXHR
*/
function configDbcache( enable, engine = '' ) {
var $jqXHR = jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: nonce,
action: 'w3tc_config_dbcache',
enable: enable,
engine: engine
}
});
configSuccess = null;
$jqXHR.done(function( response ) {
configSuccess = response.data.success;
});
return $jqXHR;
}
/**
* Get Database Cache settings.
*
* @since 2.0.0
*
* @return jqXHR
*/
function getDbcacheSettings() {
return jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: nonce,
action: 'w3tc_get_dbcache_settings'
}
})
.done(function( response ) {
dbcacheSettings = response.data;
});
}
/**
* Configure Object Cache.
*
* @since 2.0.0
*
* @param int enable Enable cache.
* @param string engine Cache storage engine.
* @return jqXHR
*/
function configObjcache( enable, engine = '' ) {
var $jqXHR = jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: nonce,
action: 'w3tc_config_objcache',
enable: enable,
engine: engine
}
});
configSuccess = null;
$jqXHR.done(function( response ) {
configSuccess = response.data.success;
});
return $jqXHR;
}
/**
* Get Object Cache settings.
*
* @since 2.0.0
*
* @return jqXHR
*/
function getObjcacheSettings() {
return jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: nonce,
action: 'w3tc_get_objcache_settings'
}
})
.done(function( response ) {
objcacheSettings = response.data;
});
}
/**
* Configure Image Service.
*
* @since 2.3.4
*
* @param int enable Enable image converter.
* @param object settings Settings payload.
* @return jqXHR
*/
function configImageservice( enable, settings = {} ) {
configSuccess = null;
return jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: nonce,
action: 'w3tc_config_imageservice',
enable: enable,
settings: settings
}
})
.done(function( response ) {
configSuccess = response.data.success;
});
}
/**
* Gather Image Service form settings with defaults.
*
* @since 2.10.0
*
* @return object
*/
function getImageserviceFormSettings() {
return {
compression: 'lossy',
auto: 'enabled',
visibility: 'never',
webp: $container.find( '#imageservice-webp' ).is( ':checked' ) ? 1 : 0,
avif: $container.find( '#imageservice-avif' ).is( ':checked' ) ? 1 : 0
};
}
/**
* Get Image Service settings.
*
* @since 2.3.4
*
* @return jqXHR
*/
function getImageserviceSettings() {
return jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: nonce,
action: 'w3tc_get_imageservice_settings'
}
})
.done(function( response ) {
imageserviceSettings = response.data;
imageserviceSettings.settings = jQuery.extend(
{},
{
webp: true,
avif: true,
compression: 'lossy',
auto: 'enabled',
visibility: 'never'
},
imageserviceSettings.settings || {}
);
});
}
/**
* Configure Lazy Load.
*
* @since 2.0.0
*
* @param int enable Enable lazyload.
* @return jqXHR
*/
function configLazyload( enable ) {
configSuccess = null;
return jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: nonce,
action: 'w3tc_config_lazyload',
enable: enable
}
})
.done(function( response ) {
configSuccess = response.data.success;
});
}
/**
* Get Lazt Load settings.
*
* @since 2.0.0
*
* @return jqXHR
*/
function getLazyloadSettings() {
return jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: nonce,
action: 'w3tc_get_lazyload_settings'
}
})
.done(function( response ) {
lazyloadSettings = response.data;
});
}
/**
* Persist settings when leaving a slide.
*
* @since 2.10.0
*/
function savePreviousSlideSettings() {
if ( ! previousSlideId ) {
return;
}
switch ( previousSlideId ) {
case 'w3tc-wizard-slide-pc1':
var $pgcacheEngine = $container.find( 'input:checked[name="pgcache_engine"]' ),
pgcacheEngine;
if ( $pgcacheEngine.length ) {
pgcacheEngine = $pgcacheEngine.val();
configPgcache( ( 'none' === pgcacheEngine ? 0 : 1 ), 'none' === pgcacheEngine ? '' : pgcacheEngine )
.fail( function() {
$slide.append(
'<div class="notice notice-error"><p><strong>' +
W3TC_SetupGuide.config_error_msg +
'</strong></p></div>'
);
});
}
break;
case 'w3tc-wizard-slide-dbc1':
var $dbcEngine = $container.find( 'input:checked[name="dbcache_engine"]' ),
dbcEngine;
if ( $dbcEngine.length ) {
dbcEngine = $dbcEngine.val();
configDbcache( ( 'none' === dbcEngine ? 0 : 1 ), 'none' === dbcEngine ? '' : dbcEngine )
.fail( function() {
$slide.append(
'<div class="notice notice-error"><p><strong>' +
W3TC_SetupGuide.config_error_msg +
'</strong></p></div>'
);
});
}
break;
case 'w3tc-wizard-slide-oc1':
var $objcacheEngine = $container.find( 'input:checked[name="objcache_engine"]' ),
objcacheEngine;
if ( $objcacheEngine.length ) {
objcacheEngine = $objcacheEngine.val();
configObjcache( ( 'none' === objcacheEngine ? 0 : 1 ), 'none' === objcacheEngine ? '' : objcacheEngine )
.fail( function() {
$slide.append(
'<div class="notice notice-error"><p><strong>' +
W3TC_SetupGuide.config_error_msg +
'</strong></p></div>'
);
});
}
break;
case 'w3tc-wizard-slide-bc1':
var $browsercacheSelection = $container.find( 'input:checked[name="browsercache_enable"]' ),
browsercacheEnabled;
if ( $browsercacheSelection.length ) {
browsercacheEnabled = $browsercacheSelection.val();
configBrowsercache( ( '1' === browsercacheEnabled ? 1 : 0 ) )
.fail( function() {
$slide.append(
'<div class="notice notice-error"><p><strong>' +
W3TC_SetupGuide.config_error_msg +
'</strong></p></div>'
);
});
}
break;
case 'w3tc-wizard-slide-io1':
var imageserviceEnabled = $container.find( 'input:checked#imageservice-enable' ).val(),
imageserviceSettings = getImageserviceFormSettings();
configImageservice( ( '1' === imageserviceEnabled ? 1 : 0 ), imageserviceSettings )
.fail( function() {
$slide.append(
'<div class="notice notice-error"><p><strong>' +
W3TC_SetupGuide.config_error_msg +
'</strong></p></div>'
);
});
break;
case 'w3tc-wizard-slide-ll1':
var lazyloadEnabled = $container.find( 'input#lazyload-enable' ).is( ':checked' );
configLazyload( lazyloadEnabled ? 1 : 0 )
.fail( function() {
$slide.append(
'<div class="notice notice-error"><p><strong>' +
W3TC_SetupGuide.config_error_msg +
'</strong></p></div>'
);
});
break;
default:
break;
}
}
/**
* Configuration failed.
*
* @since 2.0.0
*/
function configFailed() {
$slide.append(
'<div class="notice notice-error"><p><strong>' +
W3TC_SetupGuide.config_error_msg +
'</strong></p></div>'
);
$nextButton.closest( 'span' ).hide();
$prevButton.closest( 'span' ).hide();
$skipButton.closest( 'span' ).show();
}
/**
* Test failed.
*
* @since 2.0.0
*/
function testFailed() {
$slide.append(
'<div class="notice notice-error"><p><strong>' +
W3TC_SetupGuide.config_error_msg +
'</strong></p></div>'
);
$nextButton.closest( 'span' ).hide();
$prevButton.closest( 'span' ).hide();
$skipButton.closest( 'span' ).show();
}
// Save selections when navigating away from the previous slide.
savePreviousSlideSettings();
// GA.
if ( w3tc_enable_ga ) {
w3tc_ga(
'event',
'button',
{
eventCategory: 'w3tc_setup_guide',
eventLabel: slideId
}
);
}
switch ( slideId ) {
case 'w3tc-wizard-slide-welcome':
$container.find( '#w3tc-options-menu li' ).removeClass( 'is-active' );
$container.find( '#w3tc-wizard-step-welcome' ).addClass( 'is-active' );
break;
case 'w3tc-wizard-slide-pc1':
// Test Page Cache.
$container.find( '#w3tc-options-menu li' ).removeClass( 'is-active' );
$container.find( '#w3tc-wizard-step-pgcache' ).addClass( 'is-active' );
$slide.find( '#w3tc-test-pgcache' ).off('click').on('click', function () {
var $spinnerParent = $slide.find( '.spinner' ).addClass( 'is-active' ).parent(),
$this = jQuery( this );
$this.prop( 'disabled', 'disabled' );
$slide.find( '.notice-error' ).remove();
$container.find( '#w3tc-pgcache-table tbody' ).empty();
$prevButton.prop( 'disabled', 'disabled' );
$nextButton.prop( 'disabled', 'disabled' );
$spinnerParent.show();
/**
* Add a test result table row.
*
* @since 2.0.0
*
* @param object testResponse Data.
* @param string engine Cache storage engine.
* @param string label Text label for the engine.
*/
function addResultRow( testResponse, engine, label ) {
var results = '<tr',
percentChange,
changeLabelType,
changeLabel,
averageSeconds,
averageMs,
isCurrentSetting = ( ! pgcacheSettings.enabled && 'none' === engine ) ||
( pgcacheSettings.enabled && pgcacheSettings.engine === engine );
if ( ! configSuccess ) {
results += ' class="w3tc-option-disabled"';
}
results += '><td><input type="radio" id="pgcache-engine-' +
engine +
'" name="pgcache_engine" value="' +
engine +
'"';
if ( ! configSuccess ) {
results += ' disabled="disabled"';
}
if ( isCurrentSetting ) {
results += ' checked';
}
if ( configSuccess && 'file_generic' === engine ) {
label += '<br /><span class="w3tc-option-recommended">(Recommended)</span>';
}
results += '>';
if ( isCurrentSetting ) {
results += '<span class="dashicons dashicons-admin-settings" title="Original Setting"></span>';
}
results += '</td><td><label for="pgcache-engine-' +
engine +
'">' +
label +
'</label></td><td>';
if ( testResponse.success ) {
w3tcRecordTestResult( 'pgcache', engine, testResponse.data.ttfb );
averageSeconds = w3tcGetAverageResult( 'pgcache', engine );
averageMs = w3tcFormatMs( averageSeconds );
results += ( testResponse.data.ttfb * 1000 ).toFixed( 2 );
results += '</td><td>';
if ( null !== averageMs ) {
results += averageMs;
if ( 'none' !== engine ) {
percentChange = w3tcGetAveragePercentChange( 'pgcache', engine );
if ( null !== percentChange ) {
changeLabelType = percentChange < 0 ? 'w3tc-label-success' : 'w3tc-label-danger';
changeLabel = '<span class="w3tc-label ' + changeLabelType + '">' + percentChange + '%</span>';
$container.find( '#test-results' ).data( 'pgcacheDiffPercent-' + engine, percentChange );
results += ' ' + changeLabel;
}
}
} else {
results += W3TC_SetupGuide.unavailable_text;
}
} else {
results += W3TC_SetupGuide.unavailable_text + '</td><td>' + W3TC_SetupGuide.unavailable_text;
}
results += '</td></tr>';
$container.find( '#w3tc-pgcache-table tbody' ).append( results );
$container.find( '#w3tc-pgcache-table' ).show();
}
/**
* Test Page Cache.
*
* @since 2.0.0
*
* @param string engine Cache storage engine.
* @param string label Text label for the engine.
* @return jqXHR
*/
function testPgcache( engine, label ) {
if ( configSuccess ) {
return jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: nonce,
action: 'w3tc_test_pgcache'
}
})
.done(function( testResponse ) {
$container.find( '#test-results' ).data( 'pgcache-' + engine, testResponse.data );
addResultRow( testResponse, engine, label );
});
} else {
addResultRow( { success: false }, engine, label );
}
}
// Run config and tests.
getPgcacheSettings()
.then( function() {
return configPgcache( 0 );
}, configFailed )
.then( function() {
return testPgcache( 'none', W3TC_SetupGuide.none );
}, configFailed )
.then( function() {
return configPgcache( 1, 'file' );
} , testFailed )
.then( function() {
return testPgcache( 'file', W3TC_SetupGuide.disk_basic );
}, configFailed )
.then( function() {
return configPgcache( 1, 'file_generic' );
} , testFailed )
.then( function() {
return testPgcache( 'file_generic', W3TC_SetupGuide.disk_enhanced );
}, configFailed )
.then( function() {
return configPgcache( 1, 'redis' );
}, testFailed )
.then( function() {
return testPgcache( 'redis', 'Redis' );
}, configFailed )
.then( function() {
return configPgcache( 1, 'memcached' );
}, testFailed )
.then( function() {
return testPgcache( 'memcached', 'Memcached' );
}, configFailed )
.then( function() {
return configPgcache( 1, 'apc' );
}, testFailed )
.then( function() {
return testPgcache( 'apc', 'APC' );
}, configFailed )
.then( function() {
return configPgcache( 1, 'eaccelerator' );
}, testFailed )
.then( function() {
return testPgcache( 'eaccelerator', 'eAccelerator' );
}, configFailed )
.then( function() {
return configPgcache( 1, 'xcache' );
}, testFailed )
.then( function() {
return testPgcache( 'xcache', 'XCache' );
}, configFailed )
.then( function() {
return configPgcache( 1, 'wincache' );
}, testFailed )
.then( function() {
return testPgcache( 'wincache', 'WinCache' );
}, configFailed )
.then(function() {
$spinnerParent.hide();
$this.prop( 'disabled', false );
$prevButton.prop( 'disabled', false );
$nextButton.prop( 'disabled', false );
return true;
}, testFailed )
.then( function() {
w3tc_mark_slide_tests_complete( slideId );
return true;
} )
// Restore the original database cache settings.
.then( function() {
return configPgcache( ( pgcacheSettings.enabled ? 1 : 0 ), pgcacheSettings.engine );
},
function() {
$spinnerParent.hide();
return configFailed();
});
});
break;
case 'w3tc-wizard-slide-dbc1':
// Present the Database Cache slide.
$container.find( '#w3tc-options-menu li' ).removeClass( 'is-active' );
$container.find( '#w3tc-wizard-step-dbcache' ).addClass( 'is-active' );
$slide.find( '#w3tc-test-dbcache' ).off('click').on('click', function () {
var $spinnerParent = $slide.find( '.spinner' ).addClass( 'is-active' ).parent(),
$this = jQuery( this );
$this.prop( 'disabled', 'disabled' );
$slide.find( '.notice-error' ).remove();
$container.find( '#w3tc-dbc-table tbody' ).empty();
$container.find( '#w3tc-dbcache-recommended' ).hide();
$prevButton.prop( 'disabled', 'disabled' );
$nextButton.prop( 'disabled', 'disabled' );
// Hide disk warning if using file.
w3tc_disk_warning(false);
// Show spinner.
$spinnerParent.show();
/**
* Add a test result table row.
*
* @since 2.0.0
*
* @param object testResponse Data.
* @param string engine Cache storage engine.
* @param string label Text label for the engine.
*/
function addResultRow( testResponse, engine, label ) {
var results = '<tr',
percentChange,
changeLabelType,
changeLabel,
averageSeconds,
averageMs,
isCurrentSetting = ( ! dbcacheSettings.enabled && 'none' === engine ) ||
( dbcacheSettings.enabled && dbcacheSettings.engine === engine );
if ( ! configSuccess ) {
results += ' class="w3tc-option-disabled"';
}
results += '><td><input type="radio" id="dbcache-engine-' +
engine +
'" name="dbcache_engine" value="' +
engine +
'"';
if ( ! configSuccess ) {
results += ' disabled="disabled"';
}
if ( isCurrentSetting ) {
results += ' checked';
}
results += '>';
if ( isCurrentSetting ) {
results += '<span class="dashicons dashicons-admin-settings" title="Original Setting"></span>';
}
results += '</td><td><label for="dbcache-engine-' +
engine +
'">' +
label +
'</label></td><td>';
if ( testResponse.success ) {
w3tcRecordTestResult( 'dbcache', engine, testResponse.data.elapsed );
averageSeconds = w3tcGetAverageResult( 'dbcache', engine );
averageMs = w3tcFormatMs( averageSeconds );
results += w3tcFormatMs( testResponse.data.elapsed );
results += '</td><td>';
if ( null !== averageMs ) {
results += averageMs;
if ( 'none' !== engine ) {
percentChange = w3tcGetAveragePercentChange( 'dbcache', engine );
if ( null !== percentChange ) {
changeLabelType = percentChange < 0 ? 'w3tc-label-success' : 'w3tc-label-danger';
changeLabel = '<span class="w3tc-label ' + changeLabelType + '">'+ percentChange + '%</span>';
results += ' ' + changeLabel;
}
}
} else {
results += W3TC_SetupGuide.unavailable_text;
}
} else {
results += W3TC_SetupGuide.unavailable_text + '</td><td>' + W3TC_SetupGuide.unavailable_text;
}
results += '</td></tr>';
$container.find( '#w3tc-dbc-table tbody' ).append( results );
$container.find( '#w3tc-dbc-table' ).show();
}
/**
* Test database cache.
*
* @since 2.0.0
*
* @param string engine Cache storage engine.
* @param string label Text label for the engine.
* @return jqXHR
*/
function testDbcache( engine, label ) {
if ( configSuccess ) {
return jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: nonce,
action: 'w3tc_test_dbcache'
}
})
.done(function( testResponse ) {
$container.find( '#test-results' ).data( 'dbc-' + engine, testResponse.data );
addResultRow( testResponse, engine, label );
});
} else {
addResultRow( { success: false }, engine, label );
}
}
// Run config and tests.
getDbcacheSettings()
.then( function() {
return configDbcache( 0 );
}, configFailed )
.then( function() {
return testDbcache( 'none', W3TC_SetupGuide.none );
}, configFailed )
.then( function() {
return configDbcache( 1, 'file' );
} , testFailed )
.then( function() {
return testDbcache( 'file', W3TC_SetupGuide.disk );
}, configFailed )
.then( function() {
return configDbcache( 1, 'redis' );
}, testFailed )
.then( function() {
return testDbcache( 'redis', 'Redis' );
}, configFailed )
.then( function() {
return configDbcache( 1, 'memcached' );
}, testFailed )
.then( function() {
return testDbcache( 'memcached', 'Memcached' );
}, configFailed )
.then( function() {
return configDbcache( 1, 'apc' );
}, testFailed )
.then( function() {
return testDbcache( 'apc', 'APC' );
}, configFailed )
.then( function() {
return configDbcache( 1, 'eaccelerator' );
}, testFailed )
.then( function() {
return testDbcache( 'eaccelerator', 'eAccelerator' );
}, configFailed )
.then( function() {
return configDbcache( 1, 'xcache' );
}, testFailed )
.then( function() {
return testDbcache( 'xcache', 'XCache' );
}, configFailed )
.then( function() {
return configDbcache( 1, 'wincache' );
}, testFailed )
.then( function() {
return testDbcache( 'wincache', 'WinCache' );
}, configFailed )
.then(function() {
$spinnerParent.hide();
$this.prop( 'disabled', false );
$prevButton.prop( 'disabled', false );
$nextButton.prop( 'disabled', false );
return true;
}, testFailed )
// Show disk warning if using file.
.then( function() {
$container.find( '#w3tc-dbcache-recommended' ).show();
var $dbcacheEngine = $container.find( 'input[name="dbcache_engine"]' );
if ( $dbcacheEngine.parent().find(':checked').val() === 'file' ) {
$container.find('#w3tc-dbcache-recommended').hide();
w3tc_disk_warning();
}
$dbcacheEngine.on('change', function () {
const $this = jQuery(this),
isFile = $this.is(':checked') && $this.val() === 'file';
$container.find('#w3tc-dbcache-recommended').toggle(! isFile);
w3tc_disk_warning(isFile);
});
return true;
})
.then( function() {
w3tc_mark_slide_tests_complete( slideId );
return true;
} )
.then( function() {
// Restore the original database cache settings.
return configDbcache( ( dbcacheSettings.enabled ? 1 : 0 ), dbcacheSettings.engine );
},
function() {
$spinnerParent.hide();
return configFailed();
});
});
break;
case 'w3tc-wizard-slide-oc1':
// Present the Object Cache slide.
$container.find( '#w3tc-options-menu li' ).removeClass( 'is-active' );
$container.find( '#w3tc-wizard-step-objectcache' ).addClass( 'is-active' );
$slide.find( '#w3tc-test-objcache' ).off('click').on('click', function () {
var $spinnerParent = $slide.find( '.spinner' ).addClass( 'is-active' ).parent(),
$this = jQuery( this );
$this.prop( 'disabled', 'disabled' );
$slide.find( '.notice-error' ).remove();
$container.find( '#w3tc-objcache-table tbody' ).empty();
$prevButton.prop( 'disabled', 'disabled' );
$nextButton.prop( 'disabled', 'disabled' );
// Hide disk warning if using file.
w3tc_disk_warning(false);
// Show spinner.
$spinnerParent.show();
/**
* Add a test result table row.
*
* @since 2.0.0
*
* @param object testResponse Data.
* @param string engine Cache storage engine.
* @param string label Text label for the engine.
*/
function addResultRow( testResponse, engine, label ) {
var results = '<tr',
percentChange,
changeLabelType,
changeLabel,
averageSeconds,
averageMs,
isCurrentSetting = ( ! objcacheSettings.enabled && 'none' === engine ) ||
( objcacheSettings.enabled && objcacheSettings.engine === engine );
if ( ! configSuccess ) {
results += ' class="w3tc-option-disabled"';
}
results += '><td><input type="radio" id="objcache-engine-' +
engine +
'" name="objcache_engine" value="' +
engine +
'"';
if ( ! configSuccess ) {
results += ' disabled="disabled"';
}
if ( isCurrentSetting ) {
results += ' checked';
}
results += '>';
if ( isCurrentSetting ) {
results += '<span class="dashicons dashicons-admin-settings" title="Original Setting"></span>';
}
results += '</td><td><label for="objcache-engine-' +
engine +
'">' +
label +
'</label></td><td>';
if ( testResponse.success ) {
w3tcRecordTestResult( 'objcache', engine, testResponse.data.elapsed );
averageSeconds = w3tcGetAverageResult( 'objcache', engine );
averageMs = w3tcFormatMs( averageSeconds );
results += ( testResponse.data.elapsed * 1000 ).toFixed( 2 );
results += '</td><td>';
if ( null !== averageMs ) {
results += averageMs;
if ( 'none' !== engine ) {
percentChange = w3tcGetAveragePercentChange( 'objcache', engine );
if ( null !== percentChange ) {
changeLabelType = percentChange < 0 ? 'w3tc-label-success' : 'w3tc-label-danger';
changeLabel = '<span class="w3tc-label ' + changeLabelType + '">' + percentChange + '%</span>';
results += ' ' + changeLabel;
}
}
} else {
results += W3TC_SetupGuide.unavailable_text;
}
} else {
results += W3TC_SetupGuide.unavailable_text + '</td><td>' + W3TC_SetupGuide.unavailable_text;
}
results += '</td></tr>';
$container.find( '#w3tc-objcache-table tbody' ).append( results );
$container.find( '#w3tc-objcache-table' ).show();
}
/**
* Test object cache cache.
*
* @since 2.0.0
*
* @param string engine Cache storage engine.
* @param string label Text label for the engine.
* @return jqXHR
*/
function testObjcache( engine, label ) {
if ( configSuccess ) {
return jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: nonce,
action: 'w3tc_test_objcache'
}
})
.done(function( testResponse ) {
$container.find( '#test-results' ).data( 'oc-' + engine, testResponse.data );
addResultRow( testResponse, engine, label );
});
} else {
addResultRow( { success: false }, engine, label );
}
}
// Run config and tests.
getObjcacheSettings()
.then( function() {
return configObjcache( 0 );
}, configFailed )
.then( function() {
return testObjcache( 'none', W3TC_SetupGuide.none );
}, configFailed )
.then( function() {
return configObjcache( 1, 'file' );
} , testFailed )
.then( function() {
return testObjcache( 'file', W3TC_SetupGuide.disk );
}, configFailed )
.then( function() {
return configObjcache( 1, 'redis' );
}, testFailed )
.then( function() {
return testObjcache( 'redis', 'Redis' );
}, configFailed )
.then( function() {
return configObjcache( 1, 'memcached' );
}, testFailed )
.then( function() {
return testObjcache( 'memcached', 'Memcached' );
}, configFailed )
.then( function() {
return configObjcache( 1, 'apc' );
}, testFailed )
.then( function() {
return testObjcache( 'apc', 'APC' );
}, configFailed )
.then( function() {
return configObjcache( 1, 'eaccelerator' );
}, testFailed )
.then( function() {
return testObjcache( 'eaccelerator', 'eAccelerator' );
}, configFailed )
.then( function() {
return configObjcache( 1, 'xcache' );
}, testFailed )
.then( function() {
return testObjcache( 'xcache', 'XCache' );
}, configFailed )
.then( function() {
return configObjcache( 1, 'wincache' );
}, testFailed )
.then( function() {
return testObjcache( 'wincache', 'WinCache' );
}, configFailed )
.then(function() {
$spinnerParent.hide();
$this.prop( 'disabled', false );
$prevButton.prop( 'disabled', false );
$nextButton.prop( 'disabled', false );
return true;
}, testFailed )
// Show disk warning if using file.
.then( function() {
var $objcacheEngine = $container.find( 'input[name="objcache_engine"]' );
if ( $objcacheEngine.parent().find(':checked').val() === 'file' ) {
w3tc_disk_warning();
}
$objcacheEngine.on('change', function () {
const $this = jQuery(this);
w3tc_disk_warning(( $this.is(':checked') && $this.val() === 'file' ));
});
return true;
})
.then( function() {
w3tc_mark_slide_tests_complete( slideId );
return true;
} )
// Restore the original object cache settings.
.then( function() {
return configObjcache( ( objcacheSettings.enabled ? 1 : 0 ), objcacheSettings.engine );
},
function() {
$spinnerParent.hide();
return configFailed();
});
});
break;
case 'w3tc-wizard-slide-bc1':
// Present the Browser Cache slide.
$container.find( '#w3tc-options-menu li' ).removeClass( 'is-active' );
$container.find( '#w3tc-wizard-step-browsercache' ).addClass( 'is-active' );
$slide.find( '#w3tc-test-browsercache' ).off('click').on('click', function () {
var bcEnabled,
$spinnerParent = $slide.find( '.spinner' ).addClass( 'is-active' ).parent(),
$this = jQuery( this );
$this.prop( 'disabled', 'disabled' );
$slide.find( '.notice-error' ).remove();
$container.find( '#w3tc-browsercache-table tbody' ).empty();
$prevButton.prop( 'disabled', 'disabled' );
$nextButton.prop( 'disabled', 'disabled' );
$spinnerParent.show();
/**
* Add a Browser Cache test result table row.
*
* @since 2.0.0
*
* @param object testResponse An object (success, data) containing a data array of objects
* (url, filename, header, headers).
*/
function addResultRow( testResponse ) {
var label = bcEnabled ? W3TC_SetupGuide.enabled : W3TC_SetupGuide.notEnabled,
results = '<tr',
isCurrentSetting = bcEnabled == browsercacheSettings.enabled;
if ( ! configSuccess ) {
results += ' class="w3tc-option-disabled"';
}
results += '><td><input type="radio" id="browsercache-enable-' +
label +
'" name="browsercache_enable" value="' +
bcEnabled +
'"';
if ( ! configSuccess ) {
results += ' disabled="disabled"';
}
if ( isCurrentSetting ) {
results += ' checked';
}
results += '> <label for="browsercache-enable-' +
label +
'">' +
label +
'</label>';
if ( isCurrentSetting ) {
results += ' <span class="dashicons dashicons-admin-settings" title="Original Setting"></span>';
}
results += '</td>';
if ( testResponse.success ) {
results += '<td>';
testResponse.data.forEach( function( item, index ) {
results += '<a href="' +
item.url +
'">' +
item.filename +
'</a></td><td>' +
item.header +
'</td></tr>';
// If not the last entry, then start the next row.
if ( index !== ( testResponse.data.length - 1 ) ) {
results += '<tr><td></td><td>';
}
} );
} else {
results = '<td colspan="2">' +
W3TC_SetupGuide.test_error_msg +
'</td></tr>';
}
$container.find( '#w3tc-browsercache-table > tbody' ).append( results );
$container.find( '#w3tc-browsercache-table' ).show();
}
/**
* Test browser cache.
*
* @since 2.0.0
*
* @return jqXHR
*/
function testBrowsercache() {
if ( configSuccess ) {
return jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: nonce,
action: 'w3tc_test_browsercache'
}
})
.done(function( testResponse ) {
var enabled = bcEnabled ? 'on' : 'off';
$container.find( '#test-results' ).data( 'bc-' + enabled, testResponse.data );
addResultRow( testResponse );
});
} else {
addResultRow( { success: false } );
}
}
// Run config and tests.
getBrowsercacheSettings()
.then( function() {
bcEnabled = 0;
return configBrowsercache( bcEnabled );
}, configFailed )
.then( testBrowsercache, configFailed )
.then( function() {
bcEnabled = 1;
return configBrowsercache( bcEnabled );
} , testFailed )
.then( testBrowsercache, configFailed )
.then(function() {
$spinnerParent.hide();
$this.prop( 'disabled', false );
$prevButton.prop( 'disabled', false );
$nextButton.prop( 'disabled', false );
return true;
}, testFailed )
.then( function() {
w3tc_mark_slide_tests_complete( slideId );
return true;
} )
// Restore the original browser cache settings.
.then( function() {
return configBrowsercache( ( browsercacheSettings.enabled ? 1 : 0 ) );
},
function() {
$spinnerParent.hide();
return configFailed();
});
});
break;
case 'w3tc-wizard-slide-io1':
// Save the object cache engine setting from the previous slide.
var $objcacheEngine = $container.find( 'input:checked[name="objcache_engine"]' ),
objcacheEngine;
if ( $objcacheEngine.length ) {
objcacheEngine = $objcacheEngine.val();
configObjcache( ( 'none' === objcacheEngine ? 0 : 1 ), 'none' === objcacheEngine ? '' : objcacheEngine )
.fail( function() {
$slide.append(
'<div class="notice notice-error"><p><strong>' +
W3TC_SetupGuide.config_error_msg +
'</strong></p></div>'
);
});
}
// Present the Image Service slide.
$container.find( '#w3tc-options-menu li' ).removeClass( 'is-active' );
$container.find( '#w3tc-wizard-step-imageservice' ).addClass( 'is-active' );
$dashboardButton.closest( 'span' ).hide();
$nextButton.closest( 'span' ).show();
$nextButton.prop( 'disabled', 'disabled' );
var defaultImageserviceSettings = {
webp: true,
avif: true,
compression: 'lossy',
auto: 'enabled',
visibility: 'never'
},
$imageserviceEnable = $container.find( 'input#imageservice-enable' ),
$imageserviceOptions = $container.find( '#imageservice-options' );
function toggleImageserviceOptions() {
var enabled = $imageserviceEnable.is( ':checked' );
$imageserviceOptions.toggleClass( 'hidden', ! enabled );
$imageserviceOptions.find( 'input[type="checkbox"]' ).prop( 'disabled', ! enabled );
}
$imageserviceEnable.off( 'change' ).on( 'change', toggleImageserviceOptions );
// Update the Image Service enable checkbox from saved config.
getImageserviceSettings()
.then( function() {
var settings = jQuery.extend(
{},
defaultImageserviceSettings,
imageserviceSettings.settings || {}
);
$imageserviceEnable.prop( 'checked', imageserviceSettings.enabled );
$container.find( '#imageservice-webp' ).prop( 'checked', !! settings.webp );
$container.find( '#imageservice-avif' ).prop( 'checked', !! settings.avif );
toggleImageserviceOptions();
$nextButton.prop( 'disabled', false );
}, configFailed );
break;
case 'w3tc-wizard-slide-ll1':
// Save the image service setting from the previous slide.
var imageserviceEnabled = $container.find( 'input#imageservice-enable' ).is( ':checked' ),
imageserviceSettings = getImageserviceFormSettings();
configImageservice( ( imageserviceEnabled ? 1 : 0 ), imageserviceSettings )
.fail( function() {
$slide.append(
'<div class="notice notice-error"><p><strong>' +
W3TC_SetupGuide.config_error_msg +
'</strong></p></div>'
);
});
// Present the Lazy Load slide.
$container.find( '#w3tc-options-menu li' ).removeClass( 'is-active' );
$container.find( '#w3tc-wizard-step-lazyload' ).addClass( 'is-active' );
$dashboardButton.closest( 'span' ).hide();
$nextButton.closest( 'span' ).show();
$nextButton.prop( 'disabled', 'disabled' );
// Update the lazy load enable checkbox from saved config.
getLazyloadSettings()
.then( function() {
$container.find( 'input#lazyload-enable' ).prop( 'checked', lazyloadSettings.enabled );
$nextButton.prop( 'disabled', false );
}, configFailed );
break;
case 'w3tc-wizard-slide-complete':
var html,
$pgcacheSelection = $container.find( 'input:checked[name="pgcache_engine"]' ),
pgcacheEngine = $pgcacheSelection.val(),
pgcacheEngineLabel = $pgcacheSelection.closest('td').next('td').text() || W3TC_SetupGuide.none,
pgcacheDiffPercent = $container.find( '#test-results' )
.data( 'pgcacheDiffPercent-' + pgcacheEngine ),
$dbcacheSelection = $container.find( 'input:checked[name="dbcache_engine"]' ),
dbcacheEngineLabel = $dbcacheSelection.closest('td').next('td').text() || W3TC_SetupGuide.none,
$objcacheSelection = $container.find( 'input:checked[name="objcache_engine"]' ),
objcacheEngineLabel = $objcacheSelection.closest('td').next('td').text() || W3TC_SetupGuide.none,
imageserviceEnabled = $container.find( 'input#imageservice-enable' ).is( ':checked' ),
lazyloadEnabled = $container.find( 'input#lazyload-enable' ).is( ':checked' );
// Prevent leave page alert.
jQuery( window ).off( 'beforeunload' );
// Present the Setup Complete slide.
$container.find( '#w3tc-options-menu li' ).removeClass( 'is-active' );
$container.find( '#w3tc-options-menu li' ).last().addClass( 'is-active' );
html = pgcacheDiffPercent !== undefined ?
( pgcacheDiffPercent > 0 ? '+' : '' ) +
parseFloat( pgcacheDiffPercent ).toFixed( 2 ) +
'%' : '0.00%';
$container.find( '#w3tc-ttfb-diff' ).html( html );
$container.find( '#w3tc-pgcache-engine' ).html( pgcacheEngineLabel );
$container.find( '#w3tc-dbcache-engine' ).html( dbcacheEngineLabel );
$container.find( '#w3tc-objcache-engine' ).html( objcacheEngineLabel );
$container.find( '#w3tc-imageservice-setting' ).html(
imageserviceEnabled ? W3TC_SetupGuide.enabled : W3TC_SetupGuide.notEnabled
);
$container.find( '#w3tc-lazyload-setting' ).html(
lazyloadEnabled ? W3TC_SetupGuide.enabled : W3TC_SetupGuide.notEnabled
);
if ( ! jQuery( '#test-results' ).data( 'completed' ) ) {
jQuery.ajax({
method: 'POST',
url: ajaxurl,
data: {
_wpnonce: nonce,
action: "w3tc_wizard_skip"
}
})
.done(function () {
$container.find( '#test-results' ).data( 'completed', true );
});
}
$nextButton.closest( 'span' ).hide();
$dashboardButton.closest( 'span' ).show();
break;
default:
break;
}
};