first
This commit is contained in:
301
wp-content/plugins/wp-asset-clean-up/classes/PluginReview.php
Normal file
301
wp-content/plugins/wp-asset-clean-up/classes/PluginReview.php
Normal file
@@ -0,0 +1,301 @@
|
||||
<?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();
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user