wp_back/wp-content/plugins/wp-asset-clean-up/classes/PluginReview.php

302 lines
11 KiB
PHP
Raw Normal View History

2024-05-20 15:37:46 +03:00
<?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>&nbsp;&nbsp;&nbsp;
<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>&nbsp;&nbsp;&nbsp;
<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();
}
}
}