- WP Super Cache enabled (PHP mode, gzip, Nginx compatible) - Autoptimize: CSS/HTML minification + deferred JS + Google Fonts optimization - Cookie Notice: GDPR/LOPD banner styled with brand colors (navy/burgundy/gold) - Legal pages: Aviso Legal, Política de Privacidad, Política de Cookies (ES) - MU-plugin: custom footer with legal links + Cloud Host credit - Footer: copyright, legal nav, Hosted & Maintained by Cloud Host (cloudhost.es) - Security: X-Frame-Options, X-Content-Type, Referrer-Policy headers - Security: XML-RPC disabled, REST user enumeration blocked - Performance: emoji scripts removed, post revisions limited to 3
250 lines
12 KiB
PHP
250 lines
12 KiB
PHP
<?php
|
|
/**
|
|
* JS code to manage queue.
|
|
*/
|
|
|
|
?>
|
|
// Hide object text box
|
|
var queueOriginEl = document.getElementById('ao-ccss-queue' );
|
|
if (queueOriginEl) {
|
|
queueOriginEl.style.display = 'none';
|
|
|
|
// Get queue object and call table renderer
|
|
jQuery(document).ready(function() {
|
|
// Instance and parse queue object
|
|
var aoCssQueueRaw = document.getElementById('ao-ccss-queue').value;
|
|
var aoCssQueue = aoCssQueueRaw.indexOf('{"') === 0 ?
|
|
JSON.parse(aoCssQueueRaw) :
|
|
"";
|
|
var aoCssQueueLog = aoCssQueue === "" ?
|
|
"empty" :
|
|
aoCssQueue;
|
|
<?php
|
|
if ( $ao_ccss_debug ) {
|
|
echo "console.log( 'Queue Object:', aoCssQueueLog );\n";
|
|
}
|
|
?>
|
|
|
|
// hook up "remove all jobs" button to the JS action.
|
|
jQuery("#removeAllJobs").click(function(){removeAllJobs();});
|
|
|
|
// Render queue table
|
|
drawQueueTable(aoCssQueue);
|
|
|
|
// Make queue table sortable if there are any elements
|
|
var queueBodyEl = jQuery('#queue > tr').length;
|
|
if (queueBodyEl > 0) {
|
|
jQuery('#queue-tbl').tablesorter({
|
|
sortList: [[0,0]],
|
|
headers: {6: {sorter: false}}
|
|
});
|
|
}
|
|
|
|
// unhide queuerunner button conditionally (we don't want people running the queue continuously) and attach event to it.
|
|
if (queueBodyEl > 4 || ( queueBodyEl > 0 && jQuery('#rules > tr').length < 1 ) ) {
|
|
jQuery('#queuerunner-container').show();
|
|
jQuery("#queuerunner").click(function(){queuerunner();});
|
|
}
|
|
});
|
|
}
|
|
|
|
// Render the queue in a table
|
|
function drawQueueTable(queue) {
|
|
jQuery('#queue').empty();
|
|
rowNumber=0;
|
|
jQuery.each(queue, function(path, keys) {
|
|
// Prepare commom job values
|
|
ljid = keys.ljid;
|
|
targetArr = keys.rtarget.split('|' );
|
|
target = targetArr[1];
|
|
type = keys.ptype;
|
|
ctime = EpochToDate(keys.jctime);
|
|
rbtn = false;
|
|
dbtn = false;
|
|
hbtn = false;
|
|
|
|
// don't list jobs that don't have a type, they are irrelevant and this also avoids "type.replace is not a function".
|
|
if ( type == false ) {
|
|
return;
|
|
}
|
|
|
|
// Prepare job statuses
|
|
if (keys.jqstat === 'NEW') {
|
|
// Status: NEW (N, sort order 1)
|
|
status = '<span class="hidden">1</span>N';
|
|
statusClass = 'new';
|
|
title = '<?php esc_html_e( 'New', 'autoptimize' ); ?> (' + ljid + ')';
|
|
buttons = '<?php esc_html_e( 'None', 'autoptimize' ); ?>';
|
|
} else if (keys.jqstat === 'JOB_QUEUED' || keys.jqstat === 'JOB_ONGOING') {
|
|
// Status: PENDING (P, sort order 2)
|
|
status = '<span class="hidden">2</span>P';
|
|
statusClass = 'pending';
|
|
title = '<?php esc_html_e( 'PENDING', 'autoptimize' ); ?> (' + ljid + ')';
|
|
buttons = '<?php esc_html_e( 'None', 'autoptimize' ); ?>';
|
|
} else if (keys.jqstat === 'JOB_DONE' && keys.jrstat === 'GOOD' && (keys.jvstat === 'WARN' || keys.jvstat === 'BAD')) {
|
|
// Status: REVIEW (R, sort order 5)
|
|
status = '<span class="hidden">5</span>R';
|
|
statusClass = 'review';
|
|
title = "<?php esc_html_e( 'REVIEW', 'autoptimize' ); ?> (" + ljid + ")\n<?php esc_html_e( 'Info from criticalcss.com:', 'autoptimize' ); ?>\n<?php esc_html_e( '- Job ID: ', 'autoptimize' ); ?>" + keys.jid + "\n<?php esc_html_e( '- Status: ', 'autoptimize' ); ?>" + keys.jqstat + "\n<?php esc_html_e( '- Result: ', 'autoptimize' ); ?>" + keys.jrstat + "\n<?php esc_html_e( '- Validation: ', 'autoptimize' ); ?>" + keys.jvstat;
|
|
buttons = '<span class="button-secondary" id="' + ljid + '_remove" title="<?php esc_html_e( 'Delete Job', 'autoptimize' ); ?>"><span class="dashicons dashicons-trash"></span></span>';
|
|
dbtn = true;
|
|
} else if (keys.jqstat === 'JOB_DONE') {
|
|
// Status: DONE (D, sort order 6)
|
|
status = '<span class="hidden">6</span>D';
|
|
statusClass = 'done';
|
|
title = '<?php esc_html_e( 'DONE', 'autoptimize' ); ?> (' + ljid + ')';
|
|
buttons = '<span class="button-secondary" id="' + ljid + '_remove" title="<?php esc_html_e( 'Delete Job', 'autoptimize' ); ?>"><span class="dashicons dashicons-trash"></span></span>';
|
|
dbtn = true;
|
|
} else if (keys.jqstat === 'JOB_FAILED' || keys.jqstat === 'STATUS_JOB_BAD' || keys.jqstat === 'INVALID_JWT_TOKEN' || keys.jqstat === 'NO_CSS' || keys.jqstat === 'NO_RESPONSE') {
|
|
// Status: ERROR (E, sort order 4)
|
|
status = '<span class="hidden">4</span>E';
|
|
statusClass = 'error';
|
|
title = "<?php esc_html_e( 'ERROR', 'autoptimize' ); ?> (" + ljid + ")\n<?php esc_html_e( 'Info from criticalcss.com:', 'autoptimize' ); ?>\n<?php esc_html_e( '- Job ID: ', 'autoptimize' ); ?>" + keys.jid + "\n<?php esc_html_e( '- Status: ', 'autoptimize' ); ?>" + keys.jqstat + "\n<?php esc_html_e( '- Result: ', 'autoptimize' ); ?>" + keys.jrstat + "\n<?php esc_html_e( '- Validation: ', 'autoptimize' ); ?>" + keys.jvstat;
|
|
buttons = '<span class="button-secondary" id="' + ljid + '_retry" title="<?php esc_html_e( 'Retry Job', 'autoptimize' ); ?>"><span class="dashicons dashicons-update"></span></span><span class="button-secondary to-right" id="' + ljid + '_remove" title="<?php esc_html_e( 'Delete Job', 'autoptimize' ); ?>"><span class="dashicons dashicons-trash"></span></span><span class="button-secondary to-right" id="' + ljid + '_help" title="<?php esc_html_e( 'Get Help', 'autoptimize' ); ?>"><span class="dashicons dashicons-sos"></span></span>';
|
|
rbtn = true;
|
|
dbtn = true;
|
|
hbtn = true;
|
|
} else {
|
|
// Status: UNKNOWN (U, sort order 5)
|
|
status = '<span class="hidden">5</span>U';
|
|
statusClass = 'unknown';
|
|
title = "<?php esc_html_e( 'UNKNOWN', 'autoptimize' ); ?> (" + ljid + ")\n<?php esc_html_e( 'Info from criticalcss.com:', 'autoptimize' ); ?>\n<?php esc_html_e( '- Job ID: ', 'autoptimize' ); ?>" + keys.jid + "\n<?php esc_html_e( '- Status: ', 'autoptimize' ); ?>" + keys.jqstat + "\n<?php esc_html_e( '- Result: ', 'autoptimize' ); ?>" + keys.jrstat + "\n<?php esc_html_e( '- Validation: ', 'autoptimize' ); ?>" + keys.jvstat;
|
|
buttons = '<span class="button-secondary" id="' + ljid + '_remove" title="<?php esc_html_e( 'Delete Job', 'autoptimize' ); ?>"><span class="dashicons dashicons-trash"></span></span><span class="button-secondary to-right" id="' + ljid + '_help" title="<?php esc_html_e( 'Get Help', 'autoptimize' ); ?>"><span class="dashicons dashicons-sos"></span></span>';
|
|
dbtn = true;
|
|
hbtn = true;
|
|
}
|
|
|
|
// Prepare job finish time
|
|
if (keys.jftime === null) {
|
|
ftime = '<?php esc_html_e( 'N/A', 'autoptimize' ); ?>';
|
|
} else {
|
|
ftime = EpochToDate(keys.jftime);
|
|
}
|
|
|
|
// Append job entry
|
|
jQuery("#queue").append("<tr id='" + ljid + "' class='job " + statusClass + "'><td class='status'><span class='badge " + statusClass + "' title='<?php esc_html_e( 'Job status is ', 'autoptimize' ); ?>" + title + "'>" + status + "</span></td><td>" + target.replace(/(woo_|template_|custom_post_|edd_|bp_|bbp_)/,'') + "</td><td>" + path + "</td><td>" + type.replace(/(woo_|template_|custom_post_|edd_|bp_|bbp_)/,'') + "</td><td>" + ctime + "</td><td>" + ftime + "</td><td class='btn'>" + buttons + "</td></tr>");
|
|
|
|
// Attach button actions
|
|
if (rbtn) {
|
|
jQuery('#' + ljid + '_retry').click(function(){retryJob(queue, this.id, path);});
|
|
}
|
|
if (dbtn) {
|
|
jQuery('#' + ljid + '_remove').click(function(){delJob(queue, this.id, path);});
|
|
}
|
|
if (hbtn) {
|
|
jQuery('#' + ljid + '_help').click(function(){jid=this.id.split('_' );window.open('https://criticalcss.com/faq?aoid=' + jid[0], '_blank' );});
|
|
}
|
|
});
|
|
}
|
|
|
|
// Delete a job from the queue
|
|
function delJob(queue, jid, jpath) {
|
|
jid = jid.split('_' );
|
|
jQuery('#queue-confirm-rm').dialog({
|
|
resizable: false,
|
|
height: 180,
|
|
modal: true,
|
|
buttons: {
|
|
"<?php esc_html_e( 'Delete', 'autoptimize' ); ?>": function() {
|
|
delete queue[jpath];
|
|
updateQueue(queue);
|
|
jQuery(this).dialog('close' );
|
|
},
|
|
"<?php esc_html_e( 'Cancel', 'autoptimize' ); ?>": function() {
|
|
jQuery(this).dialog('close' );
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function removeAllJobs() {
|
|
jQuery( "#queue-confirm-rm-all" ).dialog({
|
|
resizable: false,
|
|
height:235,
|
|
modal: true,
|
|
buttons: {
|
|
"<?php esc_html_e( 'Delete all jobs?', 'autoptimize' ); ?>": function() {
|
|
queue=[];
|
|
updateQueue(queue);
|
|
jQuery( this ).dialog( "close" );
|
|
},
|
|
"<?php esc_html_e( 'Cancel', 'autoptimize' ); ?>": function() {
|
|
jQuery( this ).dialog( "close" );
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
// Retry jobs with error
|
|
function retryJob(queue, jid, jpath) {
|
|
jid = jid.split('_' );
|
|
jQuery('#queue-confirm-retry').dialog({
|
|
resizable: false,
|
|
height: 180,
|
|
modal: true,
|
|
buttons: {
|
|
"<?php esc_html_e( 'Retry', 'autoptimize' ); ?>": function() {
|
|
<?php
|
|
if ( $ao_ccss_debug ) {
|
|
echo "console.log( 'SHOULD retry job:', jid[0], jpath );\n";
|
|
}
|
|
?>
|
|
queue[jpath].jid = null;
|
|
queue[jpath].jqstat = 'NEW';
|
|
queue[jpath].jrstat = null;
|
|
queue[jpath].jvstat = null;
|
|
queue[jpath].jctime = (new Date).getTime() / 1000;
|
|
queue[jpath].jftime = null;
|
|
updateQueue(queue);
|
|
jQuery(this).dialog('close' );
|
|
},
|
|
"<?php esc_html_e( 'Cancel', 'autoptimize' ); ?>": function() {
|
|
jQuery(this).dialog('close' );
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
// Refresh queue
|
|
function updateQueue(queue) {
|
|
document.getElementById('ao-ccss-queue').value=JSON.stringify(queue);
|
|
drawQueueTable(queue);
|
|
jQuery('#unSavedWarning').show();
|
|
document.getElementById('ao_title_and_button').scrollIntoView();
|
|
<?php
|
|
if ( $ao_ccss_debug ) {
|
|
echo "console.log('Updated Queue Object:', queue);\n";
|
|
}
|
|
?>
|
|
}
|
|
|
|
// Run the queue manually (in case of cron issues/ impatient users).
|
|
function queuerunner() {
|
|
var data = {
|
|
'action': 'ao_ccss_queuerunner',
|
|
'ao_ccss_queuerunner_nonce': '<?php echo wp_create_nonce( 'ao_ccss_queuerunner_nonce' ); ?>',
|
|
};
|
|
|
|
jQuery.post(ajaxurl, data, function(response) {
|
|
response_array=JSON.parse(response);
|
|
if (response_array['code'] == 200) {
|
|
displayNotice( '<?php esc_html_e( 'Queue processed, reloading page.', 'autoptimize' ); ?>', 'success' )
|
|
setTimeout(window.location.reload.bind(window.location), 1.5*1000);
|
|
} else if ( response_array['code'] == 302 ) {
|
|
displayNotice( '<?php esc_html_e( 'The queue is locked, retry in a couple of minutes. If this problem persists and the queue is not moving at all remove the <code>wp-content/uploads/ao_ccss/queue.lock</code> file.', 'autoptimize' ); ?>', 'warning' )
|
|
} else {
|
|
displayNotice( '<?php esc_html_e( 'Could not process queue.', 'autoptimize' ); ?>', 'error' )
|
|
}
|
|
});
|
|
}
|
|
|
|
// Convert epoch to date for job times
|
|
function EpochToDate(epoch) {
|
|
if (epoch < 10000000000)
|
|
epoch *= 1000;
|
|
var epoch = epoch + (new Date().getTimezoneOffset() * -1); //for timeZone
|
|
var sdate = new Date(epoch);
|
|
var ldate = sdate.toLocaleString();
|
|
return ldate;
|
|
}
|