361 lines
17 KiB
PHP
361 lines
17 KiB
PHP
<?php
|
|
namespace ShortPixel;
|
|
use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
|
|
use ShortPixel\Controller\ApiKeyController as ApiKeyController;
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit; // Exit if accessed directly.
|
|
}
|
|
/**
|
|
* User: simon
|
|
* Date: 11.04.2018
|
|
* @todo This whole thing needs redoing.
|
|
*/
|
|
class ShortPixelFeedback {
|
|
|
|
private $key;
|
|
private $ctrl;
|
|
private $plugin_file = '';
|
|
private $plugin_name = '';
|
|
|
|
function __construct( $_plugin_file, $slug) {
|
|
|
|
$this->plugin_file = $_plugin_file;
|
|
$this->plugin_name = $slug; //for translations
|
|
|
|
$apiControl = ApiKeyController::getInstance();
|
|
$this->key = $apiControl->forceGetApiKey();
|
|
|
|
// Skip the feedback when constant.
|
|
if (defined('SHORTPIXEL_SKIP_FEEDBACK') && true == SHORTPIXEL_SKIP_FEEDBACK)
|
|
{
|
|
return false;
|
|
}
|
|
// Deactivation
|
|
add_filter( 'plugin_action_links_' . plugin_basename( $this->plugin_file ), array( $this, 'filterActionLinks') );
|
|
add_filter('network_admin_plugin_action_links_' . plugin_basename( $this->plugin_file ), array( $this, 'filterActionLinks'));
|
|
add_action( 'admin_footer-plugins.php', array( $this, 'goodbyeAjax') );
|
|
add_action( 'wp_ajax_shortpixel_deactivate_plugin', array( $this, 'deactivatePluginCallback') );
|
|
|
|
}
|
|
|
|
/**
|
|
* Filter the deactivation link to allow us to present a form when the user deactivates the plugin
|
|
* @since 1.0.0
|
|
*/
|
|
public function filterActionLinks( $links ) {
|
|
|
|
if( isset( $links['deactivate'] ) ) {
|
|
|
|
$deactivation_link = $links['deactivate'];
|
|
// Insert an onClick action to allow form before deactivating
|
|
$deactivation_link = str_replace( '<a ',
|
|
'<div class="shortpixel-deactivate-form-wrapper">
|
|
<span class="shortpixel-deactivate-form" id="shortpixel-deactivate-form-' . esc_attr( $this->plugin_name ) . '"></span>
|
|
</div><a id="shortpixel-deactivate-link-' . esc_attr( $this->plugin_name ) . '" ', $deactivation_link );
|
|
$links['deactivate'] = $deactivation_link;
|
|
}
|
|
return $links;
|
|
}
|
|
|
|
/**
|
|
* Form text strings
|
|
* These can be filtered
|
|
* @since 1.0.0
|
|
*/
|
|
public function goodbyeAjax() {
|
|
// Get our strings for the form
|
|
$form = $this->getFormInfo();
|
|
|
|
// Build the HTML to go in the form
|
|
$html = '<div class="shortpixel-deactivate-form-head"><strong>' . esc_html( $form['heading'] ) . '</strong></div>';
|
|
$html .= '<div class="shortpixel-deactivate-form-body">';
|
|
if( is_array( $form['options'] ) ) {
|
|
$html .= '<div class="shortpixel-deactivate-options">';
|
|
$html .= '<p><strong>' . esc_html( $form['body'] ) . '</strong></p><p>';
|
|
foreach( $form['options'] as $key => $option ) {
|
|
$html .= '<input type="radio" name="shortpixel-deactivate-reason" id="' . esc_attr( $key ) . '" value="' . esc_attr( $key ) . '"> <label for="' . esc_attr( $key ) . '">' . esc_attr( $option ) . '</label><br>';
|
|
}
|
|
$html .= '</p><label id="shortpixel-deactivate-details-label" for="shortpixel-deactivate-reasons"><strong>' . esc_html( $form['details'] ) .'</strong></label><textarea name="shortpixel-deactivate-details" id="shortpixel-deactivate-details" rows="2" style="width:100%"></textarea>';
|
|
$html .= '</div><!-- .shortpixel-deactivate-options -->';
|
|
}
|
|
$html .= '<hr/>';
|
|
$html .= '<span title="' . __( 'Un-check this if you don\\\'t plan to use ShortPixel in the future on this website. You might also want to run a Bulk Delete SP Metadata before removing the plugin (Media Library -> Bulk ShortPixel).', 'shortpixel-image-optimiser' )
|
|
. '">'
|
|
. sprintf(__( 'If you want to completely uninstall ShortPIxel from your site, please go to %s Settings → ShortPixel → Tools %s.', 'shortpixel-image-optimiser' ),'<a href="' . esc_url(admin_url('/options-general.php?page=wp-shortpixel-settings&part=tools')) . '">', '</a>') . '</span><br>';
|
|
$html .= '<hr/>';
|
|
$html .= '</div><!-- .shortpixel-deactivate-form-body -->';
|
|
$html .= '<p class="deactivating-spinner"><span class="spinner"></span> ' . __( 'Submitting form', 'shortpixel-image-optimiser' ) . '</p>';
|
|
$html .= '<div class="shortpixel-deactivate-form-footer"><p>';
|
|
$html .= '<label for="anonymous" title="'
|
|
. __("If you UNCHECK this then your email address will be sent along with your feedback. This can be used by ShortPixel to get back to you for more info or a solution.",'shortpixel-image-optimiser')
|
|
. '"><input type="checkbox" name="shortpixel-deactivate-tracking" checked="checked" id="anonymous" value="1"> ' . esc_html__( 'Send anonymous', 'shortpixel-image-optimiser' ) . '</label><br>';
|
|
$html .= '<a id="shortpixel-deactivate-submit-form" class="button button-primary" href="#">'
|
|
. __( '<span>Submit and </span>Deactivate', 'shortpixel-image-optimiser' )
|
|
. '</a>';
|
|
$html .= '</p></div>';
|
|
?>
|
|
<div class="shortpixel-deactivate-form-bg"></div>
|
|
<style type="text/css">
|
|
.shortpixel-deactivate-form-active .shortpixel-deactivate-form-bg {
|
|
background: rgba( 0, 0, 0, .5 );
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
.shortpixel-deactivate-form-wrapper {
|
|
position: relative;
|
|
z-index: 999;
|
|
display: none;
|
|
}
|
|
.shortpixel-deactivate-form-active .shortpixel-deactivate-form-wrapper {
|
|
display: block;
|
|
}
|
|
.shortpixel-deactivate-form {
|
|
display: none;
|
|
}
|
|
.shortpixel-deactivate-form-active .shortpixel-deactivate-form {
|
|
position: absolute;
|
|
bottom: 30px;
|
|
left: 0;
|
|
max-width: 500px;
|
|
min-width: 360px;
|
|
background: #fff;
|
|
white-space: normal;
|
|
}
|
|
.shortpixel-deactivate-form-head {
|
|
background: #4bbfcc;
|
|
color: #fff;
|
|
padding: 8px 18px;
|
|
}
|
|
.shortpixel-deactivate-form-body {
|
|
padding: 8px 18px 0;
|
|
color: #444;
|
|
}
|
|
.shortpixel-deactivate-form-body label[for="shortpixel-remove-settings"] {
|
|
font-weight: bold;
|
|
}
|
|
.deactivating-spinner {
|
|
display: none;
|
|
}
|
|
.deactivating-spinner .spinner {
|
|
float: none;
|
|
margin: 4px 4px 0 18px;
|
|
vertical-align: bottom;
|
|
visibility: visible;
|
|
}
|
|
.shortpixel-deactivate-form-footer {
|
|
padding: 0 18px 8px;
|
|
}
|
|
.shortpixel-deactivate-form-footer label[for="anonymous"] {
|
|
visibility: hidden;
|
|
}
|
|
.shortpixel-deactivate-form-footer p {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
margin: 0;
|
|
}
|
|
#shortpixel-deactivate-submit-form span {
|
|
display: none;
|
|
}
|
|
.shortpixel-deactivate-form.process-response .shortpixel-deactivate-form-body,
|
|
.shortpixel-deactivate-form.process-response .shortpixel-deactivate-form-footer {
|
|
position: relative;
|
|
}
|
|
.shortpixel-deactivate-form.process-response .shortpixel-deactivate-form-body:after,
|
|
.shortpixel-deactivate-form.process-response .shortpixel-deactivate-form-footer:after {
|
|
content: "";
|
|
display: block;
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
background-color: rgba( 255, 255, 255, .5 );
|
|
}
|
|
</style>
|
|
<script>
|
|
jQuery(document).ready(function($){
|
|
var deactivateURL = $("#shortpixel-deactivate-link-<?php echo esc_attr( $this->plugin_name ); ?>"),
|
|
formID = '#shortpixel-deactivate-form-<?php echo esc_attr( $this->plugin_name ); ?>',
|
|
formContainer = $(formID),
|
|
deactivated = true,
|
|
detailsStrings = {
|
|
'setup' : '<?php esc_html_e( 'What was the dificult part ?', 'shortpixel-image-optimiser') ?>',
|
|
'docs' : '<?php esc_html_e( 'What can we describe more ?', 'shortpixel-image-optimiser' ) ?>',
|
|
'features' : '<?php esc_html_e( 'How could we improve ?', 'shortpixel-image-optimiser' ) ?>',
|
|
'better-plugin' : '<?php esc_html_e( 'Can you mention it ?', 'shortpixel-image-optimiser' ) ?>',
|
|
'incompatibility' : '<?php esc_html_e( 'With what plugin or theme is incompatible ?', 'shortpixel-image-optimiser' ) ?>',
|
|
'maintenance' : '<?php esc_html_e( 'Please specify', 'shortpixel-image-optimiser') ?>',
|
|
'temporary' : '',
|
|
};
|
|
|
|
$( deactivateURL).attr('onclick', "javascript:event.preventDefault();");
|
|
$( deactivateURL ).on("click", function(){
|
|
|
|
var SubmitFeedback = function(data, formContainer){
|
|
data['action'] = 'shortpixel_deactivate_plugin';
|
|
data['security'] = '<?php echo sanitize_key(wp_create_nonce("shortpixel_deactivate_plugin" )); ?>';
|
|
data['dataType'] = 'json';
|
|
data['keep-settings'] = formContainer.find('#shortpixel-keep-settings:checked').length;
|
|
|
|
// As soon as we click, the body of the form should disappear
|
|
formContainer.addClass( 'process-response' );
|
|
|
|
// Fade in spinner
|
|
formContainer.find(".deactivating-spinner").fadeIn();
|
|
|
|
$.post(
|
|
ajaxurl,
|
|
data,
|
|
function(response){
|
|
// Redirect to original deactivation URL
|
|
window.location.href = url;
|
|
}
|
|
);
|
|
}
|
|
|
|
// We'll send the user to this deactivation link when they've completed or dismissed the form
|
|
var url = deactivateURL.attr( 'href' );
|
|
|
|
$('body').toggleClass('shortpixel-deactivate-form-active');
|
|
formContainer.fadeIn({complete: function(){
|
|
var offset = formContainer.offset();
|
|
if( offset.top < 50) {
|
|
$(this).parent().css('top', (50 - offset.top) + 'px')
|
|
}
|
|
$('html,body').animate({ scrollTop: Math.max(0, offset.top - 50) });
|
|
}});
|
|
formContainer.html( '<?php echo $html; ?>');
|
|
|
|
formContainer.on( 'change', 'input[type=radio]', function(){
|
|
|
|
var detailsLabel = formContainer.find( '#shortpixel-deactivate-details-label strong' ),
|
|
anonymousLabel = formContainer.find( 'label[for="anonymous"]' )[0],
|
|
submitSpan = formContainer.find( '#shortpixel-deactivate-submit-form span' )[0],
|
|
value = formContainer.find( 'input[name="shortpixel-deactivate-reason"]:checked' ).val();
|
|
commentBox = formContainer.find('textarea[name="shortpixel-deactivate-details"]');
|
|
|
|
// console.log(detailsLabel);
|
|
// console.log(commentBox);
|
|
var the_detail = detailsStrings[ value ];
|
|
// console.log(the_detail);
|
|
if (the_detail == '')
|
|
{
|
|
detailsLabel.css('visibility','hidden');
|
|
commentBox.css('visibility','hidden');
|
|
}
|
|
else
|
|
{
|
|
detailsLabel.css('visibility','visible');
|
|
commentBox.css('visibility','visible');
|
|
|
|
}
|
|
|
|
detailsLabel.text( the_detail );
|
|
anonymousLabel.style.visibility = "visible";
|
|
submitSpan.style.display = "inline-block";
|
|
if(deactivated) {
|
|
deactivated = false;
|
|
$('#shortpixel-deactivate-submit-form').removeAttr("disabled");
|
|
formContainer.off('click', '#shortpixel-deactivate-submit-form');
|
|
formContainer.on('click', '#shortpixel-deactivate-submit-form', function(e){
|
|
e.preventDefault();
|
|
var data = {
|
|
reason: formContainer.find('input[name="shortpixel-deactivate-reason"]:checked').val(),
|
|
details: formContainer.find('#shortpixel-deactivate-details').val()
|
|
//anonymous: formContainer.find('#anonymous:checked').length,
|
|
};
|
|
if (formContainer.find('#anonymous').is(':checked'))
|
|
data['anonymous'] = 1;
|
|
else
|
|
data['anonymous'] = 0;
|
|
|
|
SubmitFeedback(data, formContainer);
|
|
});
|
|
}
|
|
});
|
|
|
|
formContainer.on('click', '#shortpixel-deactivate-submit-form', function(e){
|
|
e.preventDefault();
|
|
// if( formContainer.find('#shortpixel-keep-settings:checked').length ) {
|
|
window.location.href = url;
|
|
/* } else {
|
|
SubmitFeedback({}, formContainer);
|
|
} */
|
|
});
|
|
|
|
// If we click outside the form, the form will close
|
|
$('.shortpixel-deactivate-form-bg').on('click',function(){
|
|
formContainer.fadeOut();
|
|
$('body').removeClass('shortpixel-deactivate-form-active');
|
|
});
|
|
});
|
|
});
|
|
|
|
</script>
|
|
<?php }
|
|
|
|
/*
|
|
* Form text strings
|
|
* These are non-filterable and used as fallback in case filtered strings aren't set correctly
|
|
* @since 1.0.0
|
|
*/
|
|
public function getFormInfo() {
|
|
$form = array();
|
|
$form['heading'] = __( 'Sorry to see you go', 'shortpixel-image-optimiser' );
|
|
$form['body'] = __( 'Before you deactivate the plugin, would you quickly give us your reason for doing so?', 'shortpixel-image-optimiser' );
|
|
$form['options'] = array(
|
|
'temporary' => __('Temporary deactivation', 'shortpixel-image-optimiser'),
|
|
'setup' => __( 'Set up is too difficult', 'shortpixel-image-optimiser' ),
|
|
'docs' => __( 'Lack of documentation', 'shortpixel-image-optimiser' ),
|
|
'features' => __( 'Not the features I wanted', 'shortpixel-image-optimiser' ),
|
|
'better-plugin' => __( 'Found a better plugin', 'shortpixel-image-optimiser' ),
|
|
'incompatibility' => __( 'Incompatible with theme or plugin', 'shortpixel-image-optimiser' ),
|
|
'maintenance' => __( 'Other', 'shortpixel-image-optimiser' ),
|
|
);
|
|
$form['details'] = __( 'How could we improve ?', 'shortpixel-image-optimiser');
|
|
return $form;
|
|
}
|
|
|
|
public function deactivatePluginCallback() {
|
|
|
|
check_ajax_referer( 'shortpixel_deactivate_plugin', 'security' );
|
|
|
|
|
|
Log::addDebug('Deactive Plugin Callback POST', $_POST);
|
|
|
|
if ( isset($_POST['reason']) && isset($_POST['details']) && isset($_POST['anonymous']) ) {
|
|
require_once(\WPSPIO()->plugin_path() . 'class/view/shortpixel-plugin-request.php');
|
|
$anonymous = (intval($_POST['anonymous']) == 1) ? true : false;
|
|
$args = array(
|
|
'key' => $this->key,
|
|
'reason' => sanitize_text_field(wp_unslash($_POST['reason'])),
|
|
'details' => sanitize_text_field(wp_unslash($_POST['details'])),
|
|
'anonymous' => $anonymous
|
|
);
|
|
$request = new ShortPixelPluginRequest( $this->plugin_file, 'http://' . SHORTPIXEL_API . '/v2/feedback.php', $args );
|
|
if ( $request->request_successful ) {
|
|
echo json_encode( array(
|
|
'status' => 'ok',
|
|
) );
|
|
}else{
|
|
echo json_encode( array(
|
|
'status' => 'nok',
|
|
) );
|
|
}
|
|
}else{
|
|
echo json_encode( array(
|
|
'status' => 'OK',
|
|
) );
|
|
}
|
|
|
|
die();
|
|
|
|
}
|
|
|
|
}
|