587 lines
17 KiB
PHP
587 lines
17 KiB
PHP
|
<?php
|
||
|
namespace WpAssetCleanUp;
|
||
|
|
||
|
/**
|
||
|
* Class PluginTracking
|
||
|
* @package WpAssetCleanUp
|
||
|
*/
|
||
|
class PluginTracking
|
||
|
{
|
||
|
/**
|
||
|
* The data to send to the Asset CleanUp site
|
||
|
*
|
||
|
* @access private
|
||
|
*/
|
||
|
public $data;
|
||
|
|
||
|
/**
|
||
|
* Initiate Settings Class
|
||
|
*
|
||
|
* @var Settings
|
||
|
*/
|
||
|
public $settings;
|
||
|
|
||
|
/**
|
||
|
* @var bool
|
||
|
*/
|
||
|
public $showTrackingNotice = false;
|
||
|
|
||
|
/**
|
||
|
* PluginTracking constructor.
|
||
|
*/
|
||
|
public function __construct()
|
||
|
{
|
||
|
$this->settings = new Settings();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
public function init()
|
||
|
{
|
||
|
// Schedule
|
||
|
add_action('wp', array($this, 'scheduleEvents' ));
|
||
|
add_action('init', array($this, 'scheduleSend' ));
|
||
|
|
||
|
// Triggers when Buttons from the Top Notice are clicked and page is reloaded (non-AJAX call)
|
||
|
// This is a fallback in case there are JS errors and the AJAX call is not triggering
|
||
|
if (isset($_GET['wpacu_is_page_reload']) && $_GET['wpacu_is_page_reload']) {
|
||
|
add_action('admin_init', array($this, 'optInOut' ));
|
||
|
}
|
||
|
|
||
|
// Before "Settings" are saved in the database, right after form submit
|
||
|
// Check "Allow Usage Tracking" value and take action if it's enabled
|
||
|
add_action('wpacu_before_save_settings', array($this, 'checkForSettingsOptIn' ));
|
||
|
|
||
|
// Notice on the top screen within the Dashboard to get permission from the user to allow tracking
|
||
|
add_action('admin_notices', array($this, 'adminNotice'));
|
||
|
|
||
|
add_action('admin_head', array($this, 'noticeStyles' ));
|
||
|
add_action('admin_footer', array($this, 'noticeScripts' ));
|
||
|
|
||
|
// Close the notice when action is taken by AJAX call
|
||
|
add_action('wp_ajax_' . WPACU_PLUGIN_ID . '_close_tracking_notice', array($this, 'ajaxCloseTrackingNoticeCallback'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param bool $isAjaxCall
|
||
|
* @return bool|string|void
|
||
|
*/
|
||
|
public function optInOut($isAjaxCall = false)
|
||
|
{
|
||
|
if ( ! isset($_REQUEST['wpacu_action']) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$response = '';
|
||
|
$redirect = true;
|
||
|
|
||
|
if ($isAjaxCall) {
|
||
|
$redirect = false;
|
||
|
}
|
||
|
|
||
|
$wpacuAction = isset($_REQUEST['wpacu_action']) ? $_REQUEST['wpacu_action'] : '';
|
||
|
|
||
|
if ($wpacuAction === 'wpacu_opt_into_tracking') {
|
||
|
$response = $this->checkForOptIn();
|
||
|
}
|
||
|
|
||
|
if ($wpacuAction === 'wpacu_opt_out_of_tracking') {
|
||
|
$response = $this->checkForOptOut();
|
||
|
|
||
|
if ($redirect) {
|
||
|
// Reload the same page without the Asset CleanUp query action
|
||
|
wp_redirect(remove_query_arg(array('wpacu_action', 'wpacu_is_page_reload')));
|
||
|
exit();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $response;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Trigger scheduling
|
||
|
*/
|
||
|
public function scheduleEvents()
|
||
|
{
|
||
|
$this->weeklyEvents();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Schedule weekly events
|
||
|
*
|
||
|
* @access private
|
||
|
* @since 1.6
|
||
|
* @return void
|
||
|
*/
|
||
|
private function weeklyEvents()
|
||
|
{
|
||
|
if (! wp_next_scheduled('wpacu_weekly_scheduled_events')) {
|
||
|
wp_schedule_event(current_time('timestamp', true), 'weekly', 'wpacu_weekly_scheduled_events');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if the user has opted into tracking
|
||
|
*
|
||
|
* @access private
|
||
|
* @return bool
|
||
|
*/
|
||
|
private function trackingAllowed()
|
||
|
{
|
||
|
$allowUsageTracking = $this->settings->getOption('allow_usage_tracking');
|
||
|
return (bool) $allowUsageTracking;
|
||
|
}
|
||
|
/**
|
||
|
* Set up the data that is going to be tracked
|
||
|
*
|
||
|
* @access private
|
||
|
* @return void
|
||
|
*/
|
||
|
public function setupData()
|
||
|
{
|
||
|
$data = array();
|
||
|
|
||
|
// Retrieve current theme info
|
||
|
$themeData = wp_get_theme();
|
||
|
$theme = $themeData->get('Name') . ' ' . $themeData->get('Version');
|
||
|
|
||
|
$settingsClass = new Settings();
|
||
|
|
||
|
$data['php_version'] = PHP_VERSION;
|
||
|
$data['wpacu_version'] = WPACU_PLUGIN_VERSION;
|
||
|
$data['wpacu_settings'] = $settingsClass->getAll();
|
||
|
$data['wpacu_first_usage'] = get_option(WPACU_PLUGIN_ID.'_first_usage');
|
||
|
$data['wpacu_review_info'] = get_option(WPACU_PLUGIN_ID.'_review_notice_status');
|
||
|
$data['wp_version'] = get_bloginfo('version');
|
||
|
$data['server'] = isset( $_SERVER['SERVER_SOFTWARE'] ) ? $_SERVER['SERVER_SOFTWARE'] : '';
|
||
|
$data['multisite'] = is_multisite() ? 'Yes' : 'No';
|
||
|
$data['theme'] = $theme;
|
||
|
|
||
|
// Retrieve current plugin information
|
||
|
$adminPluginFile = ABSPATH . '/wp-admin/includes/plugin.php';
|
||
|
if (! function_exists( 'get_plugins') && is_file($adminPluginFile)) {
|
||
|
include $adminPluginFile;
|
||
|
}
|
||
|
|
||
|
$plugins = array_keys(get_plugins());
|
||
|
$active_plugins = Misc::getActivePlugins();
|
||
|
|
||
|
foreach ($plugins as $key => $plugin) {
|
||
|
if (in_array($plugin, $active_plugins)) {
|
||
|
// Remove active plugins from list, so we can show active and inactive separately
|
||
|
unset($plugins[$key]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$data['active_plugins'] = $active_plugins;
|
||
|
$data['inactive_plugins'] = $plugins;
|
||
|
$data['locale'] = get_locale();
|
||
|
|
||
|
$this->data = $data;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Send the data to the Asset CleanUp server
|
||
|
*
|
||
|
* @access private
|
||
|
*
|
||
|
* @param bool $override If we should override the tracking setting.
|
||
|
* @param bool $ignoreLastCheckIn If we should ignore when the last check in was.
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function sendCheckIn($override = false, $ignoreLastCheckIn = false)
|
||
|
{
|
||
|
// Allows us to stop the plugin's own site from checking in, and a filter for any related sites
|
||
|
if (apply_filters('wpacu_disable_tracking_checkin', false)) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (! $override && ! $this->trackingAllowed()) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// Send a maximum of once per week
|
||
|
$lastSend = $this->getLastSend();
|
||
|
|
||
|
if ( ! $ignoreLastCheckIn && is_numeric($lastSend) && $lastSend > strtotime('-1 week')) {
|
||
|
return 'Not Sent: Only Weekly';
|
||
|
}
|
||
|
|
||
|
$this->setupData();
|
||
|
|
||
|
$response = wp_remote_post('https://www.assetcleanup.com/tracking/?wpacu_action=checkin', array(
|
||
|
'method' => 'POST',
|
||
|
'timeout' => 8,
|
||
|
'redirection' => 5,
|
||
|
'httpversion' => '1.1',
|
||
|
'blocking' => false,
|
||
|
'body' => $this->data,
|
||
|
'user-agent' => 'WPACU/' . WPACU_PLUGIN_VERSION . '; ' . get_bloginfo('url')
|
||
|
));
|
||
|
|
||
|
Misc::addUpdateOption(WPACU_PLUGIN_ID.'_tracking_last_send', time());
|
||
|
|
||
|
return wp_remote_retrieve_body($response);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param $savedSettings
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function checkForSettingsOptIn($savedSettings)
|
||
|
{
|
||
|
// Send an initial check in when "Settings" are saved
|
||
|
if (isset($savedSettings['allow_usage_tracking']) && $savedSettings['allow_usage_tracking'] == 1) {
|
||
|
$this->sendCheckIn( true );
|
||
|
}
|
||
|
|
||
|
return $savedSettings;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check for a new opt-in via the admin notice or after "Settings" is saved
|
||
|
*
|
||
|
* @return bool|void
|
||
|
*/
|
||
|
public function checkForOptIn()
|
||
|
{
|
||
|
if (! Menu::userCanManageAssets()) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Update the value in the "Settings" area
|
||
|
$this->settings->updateOption('allow_usage_tracking', 1);
|
||
|
|
||
|
// Send the tracking data
|
||
|
$response = $this->sendCheckIn(true);
|
||
|
|
||
|
// Mark the notice to be hidden
|
||
|
Misc::addUpdateOption(WPACU_PLUGIN_ID . '_hide_tracking_notice', 1);
|
||
|
|
||
|
return $response;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return string
|
||
|
*/
|
||
|
public function checkForOptOut()
|
||
|
{
|
||
|
if (! Menu::userCanManageAssets()) {
|
||
|
return 'Unauthorized';
|
||
|
}
|
||
|
|
||
|
// Disable tracking option from "Settings" and mark the notice as hidden (to not show again)
|
||
|
$this->settings->deleteOption('allow_usage_tracking');
|
||
|
Misc::addUpdateOption(WPACU_PLUGIN_ID . '_hide_tracking_notice', 1);
|
||
|
|
||
|
return 'success';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the last time a checkin was sent
|
||
|
*
|
||
|
* @access private
|
||
|
* @return false|string
|
||
|
*/
|
||
|
private function getLastSend()
|
||
|
{
|
||
|
return get_option(WPACU_PLUGIN_ID . '_tracking_last_send');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Schedule a weekly checkin
|
||
|
*
|
||
|
* We send once a week (while tracking is allowed) to check in, which can be
|
||
|
* used to determine active sites.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function scheduleSend()
|
||
|
{
|
||
|
if (Misc::doingCron()) {
|
||
|
add_action('wpacu_weekly_scheduled_events', array($this, 'sendCheckIn' ));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns true or false for showing the top tracking notice
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function showTrackingNotice()
|
||
|
{
|
||
|
// On URL request (for debugging)
|
||
|
if ( isset($_GET['wpacu_show_tracking_notice']) ) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
// If another Asset CleanUp notice (e.g. for plugin review) is already shown
|
||
|
// don't also show this one below/above it
|
||
|
if (defined('WPACU_ADMIN_REVIEW_NOTICE_SHOWN')) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ($this->settings->getOption('allow_usage_tracking')) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (get_option(WPACU_PLUGIN_ID . '_hide_tracking_notice')) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (! Menu::userCanManageAssets()) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (false !== stripos(network_site_url('/'), 'dev') ||
|
||
|
false !== stripos(network_site_url('/'), 'localhost') ||
|
||
|
false !== strpos(network_site_url('/'), ':8888') // This is common with MAMP on OS X
|
||
|
) {
|
||
|
update_option(WPACU_PLUGIN_ID . '_tracking_notice', '1');
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
public function ajaxCloseTrackingNoticeCallback()
|
||
|
{
|
||
|
check_ajax_referer('wpacu_plugin_tracking_nonce', 'wpacu_security');
|
||
|
|
||
|
$action = isset($_POST['action']) ? $_POST['action'] : false;
|
||
|
|
||
|
if ($action !== WPACU_PLUGIN_ID . '_close_tracking_notice' || ! $action) {
|
||
|
exit('Invalid Action');
|
||
|
}
|
||
|
|
||
|
$wpacuAction = isset($_POST['wpacu_action']) ? $_POST['wpacu_action'] : false;
|
||
|
|
||
|
if (! $wpacuAction) {
|
||
|
exit('Invalid Asset CleanUp Action');
|
||
|
}
|
||
|
|
||
|
// Allow to Disallow (depending on the action chosen)
|
||
|
$response = $this->optInOut(true);
|
||
|
echo esc_html($response);
|
||
|
|
||
|
exit();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
public function noticeStyles()
|
||
|
{
|
||
|
?>
|
||
|
<style <?php echo Misc::getStyleTypeAttribute(); ?>>
|
||
|
.wpacu-tracking-notice {
|
||
|
border-left-color: #008f9c;
|
||
|
}
|
||
|
|
||
|
.wpacu-tracking-notice .wpacu-action-links {
|
||
|
margin: 0 0 8px;
|
||
|
}
|
||
|
|
||
|
.wpacu-tracking-notice .wpacu-action-links ul {
|
||
|
list-style: none;
|
||
|
margin: 0;
|
||
|
}
|
||
|
|
||
|
.wpacu-tracking-notice .wpacu-action-links ul li.wpacu-optin {
|
||
|
float: left;
|
||
|
margin-right: 10px;
|
||
|
}
|
||
|
|
||
|
.wpacu-tracking-notice .wpacu-action-links ul li.wpacu-optout {
|
||
|
float: left;
|
||
|
margin-right: 5px;
|
||
|
}
|
||
|
|
||
|
.wpacu-tracking-notice .wpacu-action-links ul li.wpacu-more-info {
|
||
|
float: left;
|
||
|
margin-top: 5px;
|
||
|
margin-left: 5px;
|
||
|
}
|
||
|
|
||
|
#wpacu-tracked-data-list {
|
||
|
margin: 14px 0;
|
||
|
}
|
||
|
|
||
|
#wpacu-tracked-data-list .table-striped {
|
||
|
border: none;
|
||
|
border-spacing: 0;
|
||
|
}
|
||
|
|
||
|
#wpacu-tracked-data-list .wpacu_table_wrap .table.table-striped th,
|
||
|
#wpacu-tracked-data-list .wpacu_table_wrap .table.table-striped td {
|
||
|
padding: 0.62rem;
|
||
|
vertical-align: top;
|
||
|
border-top: 1px solid #eceeef;
|
||
|
}
|
||
|
|
||
|
#wpacu-tracked-data-list .table-striped tbody tr:nth-of-type(even) {
|
||
|
background-color: rgba(0, 143, 156, 0.05);
|
||
|
}
|
||
|
|
||
|
#wpacu-tracked-data-list .table-striped tbody tr td:first-child {
|
||
|
font-weight: bold;
|
||
|
}
|
||
|
</style>
|
||
|
<?php
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
public function noticeScripts()
|
||
|
{
|
||
|
if (! $this->showTrackingNotice) {
|
||
|
return;
|
||
|
}
|
||
|
?>
|
||
|
<script type="text/javascript">
|
||
|
jQuery(document).ready(function($) {
|
||
|
var $wpacuTrackedDataList = $('#wpacu-tracked-data-list');
|
||
|
|
||
|
// Tracking Info Link Clicked
|
||
|
$('#wpacu-show-tracked-data').on('click', function(e) {
|
||
|
e.preventDefault();
|
||
|
|
||
|
if ($wpacuTrackedDataList.is(':hidden')) {
|
||
|
$wpacuTrackedDataList.slideDown('fast');
|
||
|
} else {
|
||
|
$wpacuTrackedDataList.slideUp('fast');
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// 'x' click from the top right of the notice
|
||
|
$(document).on('click', '.wpacu-tracking-notice .notice-dismiss', function(event) {
|
||
|
$('[data-wpacu-close-action="wpacu_opt_out_of_tracking"]').trigger('click');
|
||
|
});
|
||
|
|
||
|
// button click
|
||
|
$('.wpacu-close-tracking-notice').on('click', function(e) {
|
||
|
e.preventDefault();
|
||
|
|
||
|
$('.wpacu-tracking-notice').fadeOut('fast');
|
||
|
|
||
|
var wpacuXhr = new XMLHttpRequest(),
|
||
|
wpacuCloseAction = $(this).attr('data-wpacu-close-action'),
|
||
|
wpacuSecurityNonce = '<?php echo wp_create_nonce('wpacu_plugin_tracking_nonce'); ?>';
|
||
|
|
||
|
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_tracking_notice'; ?>&wpacu_action=' + wpacuCloseAction + '&wpacu_security='+ wpacuSecurityNonce));
|
||
|
});
|
||
|
});
|
||
|
</script>
|
||
|
<?php
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Display the admin notice to users that have not opted-in or out
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function adminNotice()
|
||
|
{
|
||
|
if (! $this->showTrackingNotice()) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$this->setupData();
|
||
|
|
||
|
$optin_url = add_query_arg(array('wpacu_action' => 'wpacu_opt_into_tracking', 'wpacu_is_page_reload' => true));
|
||
|
$optout_url = add_query_arg(array('wpacu_action' => 'wpacu_opt_out_of_tracking', 'wpacu_is_page_reload' => true));
|
||
|
|
||
|
?>
|
||
|
<div class="wpacu-tracking-notice notice is-dismissible">
|
||
|
<p><?php _e('Allow Asset CleanUp to anonymously track plugin usage in order to help us make the plugin better? No sensitive or personal data is collected.', 'wp-asset-clean-up'); ?></p>
|
||
|
<div class="wpacu-action-links">
|
||
|
<ul>
|
||
|
<li class="wpacu-optin">
|
||
|
<a href="<?php echo esc_url($optin_url); ?>"
|
||
|
data-wpacu-close-action="wpacu_opt_into_tracking"
|
||
|
class="wpacu-close-tracking-notice button-primary"><?php _e('Allow, I\'m happy to help', 'easy-digital-downloads'); ?></a>
|
||
|
</li>
|
||
|
<li class="wpacu-optout">
|
||
|
<a href="<?php echo esc_url($optout_url); ?>"
|
||
|
data-wpacu-close-action="wpacu_opt_out_of_tracking"
|
||
|
class="wpacu-close-tracking-notice button-secondary"><?php _e('No, do not allow', 'easy-digital-downloads'); ?></a></li>
|
||
|
<li class="wpacu-more-info"><span style="color: #004567;" class="dashicons dashicons-info"></span> <a id="wpacu-show-tracked-data" href="#">What kind of data will be sent for the tracking?</a></li>
|
||
|
</ul>
|
||
|
<div style="clear: both;"></div>
|
||
|
<div style="display: none;" id="wpacu-tracked-data-list">
|
||
|
<?php self::showSentInfoDataTable($this->data); ?>
|
||
|
</div>
|
||
|
<hr />
|
||
|
<p><strong>Note:</strong> This option can always be turned ON & OFF in <a style="text-decoration: none;" target="_blank" href="<?php echo admin_url('admin.php?page=wpassetcleanup_settings&wpacu_selected_tab_area=wpacu-setting-plugin-usage-settings#wpacu-settings-allow-usage-tracking'); ?>">"Settings" → "Plugin Usage Preferences" → "Allow Usage Tracking"</a></p>
|
||
|
</div>
|
||
|
</div>
|
||
|
<?php
|
||
|
if (! defined('WPACU_ADMIN_TRACKING_NOTICE_SHOWN')) {
|
||
|
define('WPACU_ADMIN_TRACKING_NOTICE_SHOWN', true);
|
||
|
}
|
||
|
|
||
|
// Only mark it as shown after it was printed
|
||
|
$this->showTrackingNotice = true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param $data
|
||
|
*/
|
||
|
public static function showSentInfoDataTable($data)
|
||
|
{
|
||
|
?>
|
||
|
<div class="wpacu_table_wrap">
|
||
|
<table class="table table-striped">
|
||
|
<tr>
|
||
|
<td style="width: 182px;">PHP Version:</td>
|
||
|
<td><?php echo esc_html($data['php_version']); ?></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Asset CleanUp Info:</td>
|
||
|
<td>Version: <?php echo esc_html($data['wpacu_version']); ?>, Settings & Usage Information</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>WordPress Version:</td>
|
||
|
<td><?php echo esc_html($data['wp_version']); ?></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Server:</td>
|
||
|
<td><?php echo esc_html($data['server']); ?></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Multisite:</td>
|
||
|
<td><?php echo esc_html($data['multisite']); ?></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Theme:</td>
|
||
|
<td><?php echo esc_html($data['theme']); ?></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Locale:</td>
|
||
|
<td><?php echo esc_html($data['locale']); ?></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Plugins:</td>
|
||
|
<td>The list of active & inactive plugins</td>
|
||
|
</tr>
|
||
|
</table>
|
||
|
</div>
|
||
|
<?php
|
||
|
}
|
||
|
}
|