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();
|
||
|
}
|
||
|
}
|
||
|
}
|