302 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			302 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace WpAssetCleanUp;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class PluginReview
 | 
						|
 * @package WpAssetCleanUp
 | 
						|
 */
 | 
						|
class PluginReview
 | 
						|
{
 | 
						|
	/**
 | 
						|
	 * @var bool
 | 
						|
	 */
 | 
						|
	public $showReviewNotice;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var string[]
 | 
						|
	 */
 | 
						|
	public static $closingReasons = array('maybe_later', 'never_show_it');
 | 
						|
 | 
						|
	/**
 | 
						|
	 * PluginReview constructor.
 | 
						|
	 */
 | 
						|
	public function __construct()
 | 
						|
	{
 | 
						|
		// Notice to rate plugin on WordPress.org based on specific conditions
 | 
						|
		add_action('admin_notices', array($this, 'ratePluginNoticeOutput'));
 | 
						|
 | 
						|
		// Close the notice when action is taken by AJAX call
 | 
						|
		add_action('wp_ajax_' . WPACU_PLUGIN_ID . '_close_review_notice', array($this, 'ajaxCloseReviewNoticeCallback'));
 | 
						|
 | 
						|
		// Close the notice when action is taken by page reload (e.g. rate it later or never show the notice again)
 | 
						|
		add_action('admin_post_' . WPACU_PLUGIN_ID . '_close_review_notice', array($this, 'doCloseNotice'));
 | 
						|
 | 
						|
        // Notice styling
 | 
						|
        add_action('admin_head', array($this, 'noticeStyles'));
 | 
						|
 | 
						|
        // Code related to the AJAX calls and closing the notice
 | 
						|
        add_action('admin_footer', array($this, 'noticeScripts'));
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function ratePluginNoticeOutput()
 | 
						|
	{
 | 
						|
		// Criteria for showing up the review plugin notice
 | 
						|
		if ( ! $this->showReviewNotice() ) {
 | 
						|
		    return;
 | 
						|
		}
 | 
						|
 | 
						|
        // Show notice and delete the current status (if any)
 | 
						|
        delete_option(WPACU_PLUGIN_ID .'_review_notice_status');
 | 
						|
 | 
						|
        $goBackToCurrentUrl = '&_wp_http_referer=' . urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) );
 | 
						|
 | 
						|
        $closeNoticeUrl = esc_url(wp_nonce_url(
 | 
						|
            admin_url('admin-post.php?action='.WPACU_PLUGIN_ID.'_close_review_notice&wpacu_close_reason=_wpacu_close_reason_' . $goBackToCurrentUrl),
 | 
						|
	        WPACU_PLUGIN_ID . '_close_review_notice'
 | 
						|
        ));
 | 
						|
 | 
						|
        $closeNoticeMaybeLaterUrl  = str_replace('_wpacu_close_reason_', 'maybe_later',   $closeNoticeUrl);
 | 
						|
        $closeNoticeNeverShowItUrl = str_replace('_wpacu_close_reason_', 'never_show_it', $closeNoticeUrl);
 | 
						|
        ?>
 | 
						|
        <div class="notice wpacu-notice-info is-dismissible wpacu-review-plugin-notice">
 | 
						|
            <p><?php _e('Hey, you have been using Asset CleanUp for some time and already unloaded useless CSS/JS which would give your website a higher page speed score and better user experience.',
 | 
						|
                    'wp-asset-clean-up'); ?>
 | 
						|
                <br/> <?php _e('Could you please do me a BIG favor and give it a 5-star rating on WordPress to help us spread the word and boost our motivation?',
 | 
						|
                    'wp-asset-clean-up'); ?></p>
 | 
						|
            <p><strong><em>~ Gabriel Livan, Lead Developer</em></strong></p>
 | 
						|
            <p>
 | 
						|
                <a href="<?php echo esc_url(Plugin::RATE_URL); ?>"
 | 
						|
                   data-wpacu-close-action="never_show_it"
 | 
						|
                   class="wpacu-primary-action wpacu-close-review-notice button-primary"
 | 
						|
                   target="_blank"><?php esc_html_e('Ok, you deserve it', 'wp-asset-clean-up'); ?> :)</a>   
 | 
						|
 | 
						|
                <a href="<?php echo esc_url($closeNoticeMaybeLaterUrl); ?>"
 | 
						|
                   data-wpacu-close-action="maybe_later"
 | 
						|
                   class="wpacu-close-review-notice"
 | 
						|
                   rel="noopener noreferrer"><?php esc_html_e('Nope, maybe later', 'wp-asset-clean-up'); ?></a>   
 | 
						|
 | 
						|
                <a href="<?php echo esc_url($closeNoticeNeverShowItUrl) ?>"
 | 
						|
                   data-wpacu-close-action="never_show_it"
 | 
						|
                   class="wpacu-close-review-notice"
 | 
						|
                   rel="noopener noreferrer"><?php esc_html_e('Don\'t show this again', 'wp-asset-clean-up'); ?></a>
 | 
						|
            </p>
 | 
						|
        </div>
 | 
						|
        <?php
 | 
						|
        if (! defined('WPACU_ADMIN_REVIEW_NOTICE_SHOWN')) {
 | 
						|
	        define('WPACU_ADMIN_REVIEW_NOTICE_SHOWN', true);
 | 
						|
        }
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function noticeStyles()
 | 
						|
    {
 | 
						|
        ?>
 | 
						|
        <style <?php echo Misc::getStyleTypeAttribute(); ?>>
 | 
						|
            .wpacu-review-plugin-notice {
 | 
						|
                border-left: 4px solid #008f9c;
 | 
						|
            }
 | 
						|
        </style>
 | 
						|
        <?php
 | 
						|
    }
 | 
						|
 | 
						|
	/**
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function noticeScripts()
 | 
						|
    {
 | 
						|
        if ( ! $this->showReviewNotice() ) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        ?>
 | 
						|
        <script type="text/javascript">
 | 
						|
            jQuery(document).ready(function($) {
 | 
						|
                $(document).on('click', '.wpacu-review-plugin-notice .notice-dismiss', function(event) {
 | 
						|
                    $('[data-wpacu-close-action="maybe_later"]').trigger('click');
 | 
						|
                });
 | 
						|
 | 
						|
                $('.wpacu-close-review-notice').on('click', function(e) {
 | 
						|
                    $('.wpacu-review-plugin-notice').fadeOut('fast');
 | 
						|
 | 
						|
                    // If the primary action was taken, also perform the AJAX call to close the notice
 | 
						|
                    if (! $(this).hasClass('wpacu-primary-action')) {
 | 
						|
                        e.preventDefault();
 | 
						|
                    }
 | 
						|
 | 
						|
                    var wpacuXhr = new XMLHttpRequest(),
 | 
						|
                        wpacuCloseAction = $(this).attr('data-wpacu-close-action');
 | 
						|
 | 
						|
                    wpacuXhr.open('POST', '<?php echo esc_url(admin_url('admin-ajax.php')); ?>');
 | 
						|
                    wpacuXhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 | 
						|
                    wpacuXhr.onload = function () {
 | 
						|
                        if (wpacuXhr.status === 200) {
 | 
						|
                            } else if (wpacuXhr.status !== 200) {
 | 
						|
                            }
 | 
						|
                    };
 | 
						|
 | 
						|
                    wpacuXhr.send(encodeURI('action=<?php echo WPACU_PLUGIN_ID . '_close_review_notice'; ?>&wpacu_close_reason=' + wpacuCloseAction));
 | 
						|
                });
 | 
						|
            });
 | 
						|
        </script>
 | 
						|
        <?php
 | 
						|
    }
 | 
						|
 | 
						|
	/**
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function ajaxCloseReviewNoticeCallback()
 | 
						|
    {
 | 
						|
        $action = isset($_POST['action']) ? $_POST['action'] : false;
 | 
						|
 | 
						|
	    if ($action !== WPACU_PLUGIN_ID . '_close_review_notice' || ! $action) {
 | 
						|
		    exit('Invalid Action');
 | 
						|
	    }
 | 
						|
 | 
						|
        $closeReason = isset($_POST['wpacu_close_reason']) && in_array($_POST['wpacu_close_reason'], self::$closingReasons) ? $_POST['wpacu_close_reason'] : false;
 | 
						|
 | 
						|
	    if (! $closeReason) {
 | 
						|
		    exit('Invalid Reason');
 | 
						|
	    }
 | 
						|
 | 
						|
	    $this->doCloseNotice();
 | 
						|
    }
 | 
						|
 | 
						|
	/**
 | 
						|
     * Conditions for showing the notice (all should be met):
 | 
						|
     * 1) Used the plugin at least for a week (or a few days if at least 30 assets were unloaded)
 | 
						|
     * 2) At least 10 assets unloaded
 | 
						|
     * 3) The WIKI was read or one of the minify/combine options were enabled
 | 
						|
     *
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	public function showReviewNotice()
 | 
						|
    {
 | 
						|
        if ($this->showReviewNotice !== null) {
 | 
						|
            return $this->showReviewNotice; // already set
 | 
						|
        }
 | 
						|
 | 
						|
        // On URL request (for debugging)
 | 
						|
        if ( isset($_GET['wpacu_show_review_notice']) ) {
 | 
						|
	        $this->showReviewNotice = true;
 | 
						|
            return $this->showReviewNotice;
 | 
						|
        }
 | 
						|
 | 
						|
	    // If another Asset CleanUp notice (e.g. for plugin tracking) is already shown
 | 
						|
	    // don't also show this one below/above it
 | 
						|
	    if (defined('WPACU_ADMIN_TRACKING_NOTICE_SHOWN')) {
 | 
						|
		    $this->showReviewNotice = false;
 | 
						|
		    return $this->showReviewNotice;
 | 
						|
	    }
 | 
						|
 | 
						|
	    $screen = get_current_screen();
 | 
						|
 | 
						|
	    $doNotTriggerOnScreens = array(
 | 
						|
		    'options-general', 'tools', 'users', 'user', 'profile', 'plugins', 'plugin-editor', 'plugin-install'
 | 
						|
	    );
 | 
						|
 | 
						|
	    if (isset($screen->base) && in_array($screen->base, $doNotTriggerOnScreens)) {
 | 
						|
		    $this->showReviewNotice = false;
 | 
						|
		    return $this->showReviewNotice;
 | 
						|
	    }
 | 
						|
 | 
						|
	    $settings = new Settings();
 | 
						|
	    $allSettings = $settings->getAll();
 | 
						|
 | 
						|
        $conditionOneToShow = ( $allSettings['wiki_read'] == 1
 | 
						|
            || $allSettings['minify_loaded_css'] == 1 || $allSettings['combine_loaded_css'] == 1
 | 
						|
            || $allSettings['minify_loaded_js']  == 1 || $allSettings['combine_loaded_js']  == 1 );
 | 
						|
 | 
						|
        if ( ! $conditionOneToShow ) {
 | 
						|
	        $this->showReviewNotice = false;
 | 
						|
            return $this->showReviewNotice;
 | 
						|
        }
 | 
						|
 | 
						|
	    $noticeStatus = get_option(WPACU_PLUGIN_ID .'_review_notice_status');
 | 
						|
 | 
						|
	    if (isset($noticeStatus['status']) && $noticeStatus['status'] === 'never_show_it') {
 | 
						|
		    $this->showReviewNotice = false;
 | 
						|
		    return $this->showReviewNotice; // Never show it (user has chosen or the primary button was clicked)
 | 
						|
	    }
 | 
						|
 | 
						|
	    if (isset($noticeStatus['status'], $noticeStatus['updated_at']) && $noticeStatus['status'] === 'maybe_later') {
 | 
						|
		    // Two weeks after the review notice is closed to show up later
 | 
						|
		    $showNoticeAfterTimestamp = ($noticeStatus['updated_at'] + (DAY_IN_SECONDS * 14));
 | 
						|
 | 
						|
		    // If two weeks haven't passed since the user has chosen "Nope, maybe later" then do not show the notice yet
 | 
						|
		    if (time() < $showNoticeAfterTimestamp) {
 | 
						|
			    $this->showReviewNotice = false;
 | 
						|
			    return $this->showReviewNotice;
 | 
						|
		    }
 | 
						|
	    }
 | 
						|
 | 
						|
	    // Make sure that at least {$daysPassedAfterFirstUsage} days has passed after the first usage of the plugin was recorded
 | 
						|
	    $firstUsageTimestamp = get_option(WPACU_PLUGIN_ID.'_first_usage');
 | 
						|
 | 
						|
	    if (! $firstUsageTimestamp) {
 | 
						|
		    $this->showReviewNotice = false;
 | 
						|
	        return $this->showReviewNotice;
 | 
						|
        }
 | 
						|
 | 
						|
	    $unloadedTotalAssets = Misc::getTotalUnloadedAssets();
 | 
						|
 | 
						|
	    // Show the notice after one week
 | 
						|
	    $daysPassedAfterFirstUsage = 7;
 | 
						|
 | 
						|
	    // Unloaded at least thirty assets? Show the notice sooner
 | 
						|
	    if ($unloadedTotalAssets >= 30) {
 | 
						|
		    $daysPassedAfterFirstUsage = 4;
 | 
						|
        }
 | 
						|
 | 
						|
	    if ( (time() - $firstUsageTimestamp) < ($daysPassedAfterFirstUsage * DAY_IN_SECONDS) ) {
 | 
						|
		    $this->showReviewNotice = false;
 | 
						|
		    return $this->showReviewNotice;
 | 
						|
	    }
 | 
						|
 | 
						|
        $toReturn = ( $unloadedTotalAssets >= 10 ); // finally, there have to be at least 10 unloaded assets
 | 
						|
	    $this->showReviewNotice = $toReturn;
 | 
						|
 | 
						|
	    return $toReturn;
 | 
						|
    }
 | 
						|
 | 
						|
	/**
 | 
						|
     * Either via page reload or AJAX call
 | 
						|
	 */
 | 
						|
	public function doCloseNotice()
 | 
						|
    {
 | 
						|
        $doRedirect = isset($_GET['wpacu_close_reason']) && ! defined('DOING_AJAX');
 | 
						|
        $reason = isset($_REQUEST['wpacu_close_reason']) && in_array($_REQUEST['wpacu_close_reason'], self::$closingReasons) ? sanitize_text_field($_REQUEST['wpacu_close_reason']) : false;
 | 
						|
 | 
						|
        if (! $reason) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
	    $performUpdate = false;
 | 
						|
 | 
						|
        if ($reason === 'never_show_it') {
 | 
						|
            Misc::addUpdateOption(WPACU_PLUGIN_ID . '_review_notice_status', array('status' => 'never_show_it'));
 | 
						|
	        $performUpdate = true;
 | 
						|
        } elseif ($reason === 'maybe_later') {
 | 
						|
            // Set the current timestamp and show it later (e.g. in 2 weeks from now)
 | 
						|
	        Misc::addUpdateOption(WPACU_PLUGIN_ID . '_review_notice_status', array('status' => 'maybe_later', 'updated_at' => time()));
 | 
						|
	        $performUpdate = true;
 | 
						|
        }
 | 
						|
 | 
						|
        // AJAX call return
 | 
						|
        if ($performUpdate && $doRedirect === false) {
 | 
						|
            echo 'success';
 | 
						|
            exit();
 | 
						|
        }
 | 
						|
 | 
						|
        // The AJAX call should be successful
 | 
						|
        // This redirect is made as a fallback in case the page is reloaded
 | 
						|
	    if ( $doRedirect && wp_get_referer() ) {
 | 
						|
		    wp_safe_redirect( wp_get_referer() );
 | 
						|
		    exit();
 | 
						|
	    }
 | 
						|
    }
 | 
						|
}
 |