File "class-wp-statistics-admin-ajax.php"
Full path: /var/www/html/cemeau/wp-content/plugins/wp-statistics/includes/admin/class-wp-statistics-admin-ajax.php
File size: 22.08 KB
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?php
namespace WP_STATISTICS;
use WP_Statistics\Components\DateRange;
use WP_Statistics\Models\VisitorsModel;
use WP_Statistics\Service\Admin\NoticeHandler\Notice;
use WP_Statistics\Service\Analytics\DeviceDetection\DeviceHelper;
use WP_Statistics\Service\Geolocation\GeolocationFactory;
use WP_Statistics\Service\Geolocation\Provider\MaxmindGeoIPProvider;
use WP_Statistics\Utils\Request;
class Ajax
{
public function __construct()
{
add_action('init', [$this, 'registerAjaxCallbacks']);
}
/**
* Register AJAX callbacks
*/
public function registerAjaxCallbacks()
{
/**
* List Of Setup Ajax request in WordPress
*/
$list = [
[
'class' => $this,
'action' => 'clear_user_agent_strings',
'public' => false
],
[
'class' => $this,
'action' => 'query_params_cleanup',
'public' => false
],
[
'class' => $this,
'action' => 'delete_agents',
'public' => false
],
[
'class' => $this,
'action' => 'delete_platforms',
'public' => false
],
[
'class' => $this,
'action' => 'delete_ip',
'public' => false
],
[
'class' => $this,
'action' => 'delete_user_ids',
'public' => false
],
[
'class' => $this,
'action' => 'purge_data',
'public' => false
],
[
'class' => $this,
'action' => 'purge_visitor_hits',
'public' => false
],
[
'class' => $this,
'action' => 'visitors_page_filters',
'public' => false
],
[
'class' => $this,
'action' => 'page_insight_filters',
'public' => false
],
[
'class' => $this,
'action' => 'update_geoip_database',
'public' => false
],
[
'class' => $this,
'action' => 'admin_meta_box',
'public' => false
],
[
'class' => $this,
'action' => 'get_page_filter_items',
'public' => false
],
[
'class' => $this,
'action' => 'search_visitors',
'public' => false
],
[
'class' => $this,
'action' => 'store_date_range',
'public' => false
],
[
'class' => $this,
'action' => 'dismiss_notices',
'public' => false
]
];
$list = apply_filters('wp_statistics_ajax_list', $list);
foreach ($list as $item) {
$class = $item['class'];
$action = $item['action'];
$callback = $action . '_action_callback';
$isPublic = isset($item['public']) && $item['public'] == true ? true : false;
// If callback exists in the class, register the action
if (method_exists($class, $callback)) {
add_action('wp_ajax_wp_statistics_' . $action, [$class, $callback]);
// Register the AJAX callback publicly
if ($isPublic) {
add_action('wp_ajax_nopriv_wp_statistics_' . $action, [$class, $callback]);
}
}
}
}
/**
* Setup an AJAX action to delete an agent in the optimization page.
*/
public function delete_agents_action_callback()
{
global $wpdb;
if (Helper::is_request('ajax') and User::Access('manage')) {
// Check Refer Ajax
check_ajax_referer('wp_rest', 'wps_nonce');
// Check Exist
if (isset($_POST['agent-name'])) {
// Get User Agent
$agent = sanitize_text_field($_POST['agent-name']);
// Remove Type Of Agent
$result = $wpdb->query($wpdb->prepare("DELETE FROM `" . DB::table('visitor') . "` WHERE `agent` = %s", $agent));
// Show Result
if ($result) {
echo sprintf(__('Successfully deleted %s agent data.', 'wp-statistics'), '<code>' . esc_attr($agent) . '</code>'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
} else {
esc_html_e('Couldn’t find agent data to delete.', 'wp-statistics');
}
} else {
esc_html_e('Kindly select the items you want to work with.', 'wp-statistics');
}
} else {
esc_html_e('Unauthorized access!', 'wp-statistics');
}
exit;
}
/**
* Setup an AJAX action to delete a platform in the optimization page.
*/
public function delete_platforms_action_callback()
{
global $wpdb;
if (Helper::is_request('ajax') and User::Access('manage')) {
// Check Refer Ajax
check_ajax_referer('wp_rest', 'wps_nonce');
// Check Isset Platform
if (isset($_POST['platform-name'])) {
// Get User Platform
$platform = sanitize_text_field($_POST['platform-name']);
// Delete List
$result = $wpdb->query($wpdb->prepare("DELETE FROM `" . DB::table('visitor') . "` WHERE `platform` = %s", $platform));
// Return Result
if ($result) {
echo sprintf(__('Successfully deleted %s platform data.', 'wp-statistics'), '<code>' . esc_attr($platform) . '</code>'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
} else {
esc_html_e('Couldn’t find platform data to delete.', 'wp-statistics');
}
} else {
esc_html_e('Kindly select the items you want to work with.', 'wp-statistics');
}
} else {
esc_html_e('Unauthorized access!', 'wp-statistics');
}
exit;
}
/**
* Setup an AJAX action to delete a ip in the optimization page.
*/
public function delete_ip_action_callback()
{
global $wpdb;
if (Helper::is_request('ajax') and User::Access('manage')) {
// Check Refer Ajax
check_ajax_referer('wp_rest', 'wps_nonce');
// Check Isset IP
if (isset($_POST['ip-address'])) {
// Sanitize IP Address
$ip_address = sanitize_text_field($_POST['ip-address']);
// Delete IP
$result = $wpdb->query($wpdb->prepare("DELETE FROM `" . DB::table('visitor') . "` WHERE `ip` = %s", $ip_address));
if ($result) {
echo sprintf(__('Successfully deleted %s IP data.', 'wp-statistics'), '<code>' . esc_attr($ip_address) . '</code>'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
} else {
esc_html_e('Couldn’t find any IP address data to delete.', 'wp-statistics');
}
} else {
esc_html_e('Kindly select the items you want to work with.', 'wp-statistics');
}
} else {
esc_html_e('Unauthorized access!', 'wp-statistics');
}
exit;
}
/**
* Setup an AJAX action to delete user id data from visitors table.
*/
public function delete_user_ids_action_callback()
{
global $wpdb;
if (Helper::is_request('ajax') and User::Access('manage')) {
// Check Refer Ajax
check_ajax_referer('wp_rest', 'wps_nonce');
// Delete user ids
$result = $wpdb->query("UPDATE `" . DB::table('visitor') . "` SET `user_id` = 0");
if ($result) {
esc_html_e('Successfully deleted User ID data.', 'wp-statistics');
} else {
esc_html_e('Couldn’t find any user ID data to delete.', 'wp-statistics');
}
} else {
esc_html_e('Unauthorized access!', 'wp-statistics');
}
exit;
}
/**
* Setup an AJAX action to clear UAStrings data from visitors table.
*/
public function clear_user_agent_strings_action_callback()
{
global $wpdb;
if (Helper::is_request('ajax') and User::Access('manage')) {
// Check Refer Ajax
check_ajax_referer('wp_rest', 'wps_nonce');
// Delete UAStrings
$result = $wpdb->query("UPDATE `" . DB::table('visitor') . "` SET `UAString` = NULL");
if ($result) {
esc_html_e('Successfully deleted user agent strings data.', 'wp-statistics');
} else {
esc_html_e('Couldn’t find any user agent strings data to delete.', 'wp-statistics');
}
} else {
esc_html_e('Unauthorized access!', 'wp-statistics');
}
exit;
}
/**
* Setup an AJAX action to clean up query parameters from pages table.
*/
public function query_params_cleanup_action_callback()
{
global $wpdb;
if (Helper::is_request('ajax') and User::Access('manage')) {
// Check Refer Ajax
check_ajax_referer('wp_rest', 'wps_nonce');
// Get allowed query params
$allowedQueryParams = Helper::get_query_params_allow_list();
// Get all rows from pages table
$pages = $wpdb->get_results("SELECT * FROM `" . DB::table('pages') . "`");
if ($pages) {
// Update query strings based on allow list
foreach ($pages as $page) {
$wpdb->update(
DB::table('pages'),
['uri' => Helper::FilterQueryStringUrl($page->uri, $allowedQueryParams)],
['page_id' => $page->page_id]
);
}
_e('Successfully removed query string parameter data from \'pages\' table. <br>', 'wp-statistics');
} else {
_e('Couldn\'t find any user query string parameter data to delete from \'pages\' table. <br>', 'wp-statistics');
}
// Get all rows from visitors table
$referrers = $wpdb->get_results("SELECT * FROM " . DB::table('visitor'));
if ($referrers) {
// Update query strings based on allow list
foreach ($referrers as $referrer) {
$wpdb->update(
DB::table('visitor'),
['referred' => Helper::FilterQueryStringUrl($referrer->referred, $allowedQueryParams)],
['ID' => $referrer->ID]
);
}
esc_html_e('Successfully removed query string parameter data from \'visitor\' table.', 'wp-statistics');
} else {
esc_html_e('Couldn\'t find any user query string parameter data to delete from \'visitor\' table.', 'wp-statistics');
}
} else {
esc_html_e('Unauthorized access!', 'wp-statistics');
}
exit;
}
/**
* Setup an AJAX action to purge old data in the optimization page.
*/
public function purge_data_action_callback()
{
if (Helper::is_request('ajax') and User::Access('manage')) {
// Check Refer Ajax
check_ajax_referer('wp_rest', 'wps_nonce');
// Check Number Day
$purge_days = 0;
if (isset($_POST['purge-days'])) {
$purge_days = intval(sanitize_text_field($_POST['purge-days']));
}
echo Purge::purge_data($purge_days); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
} else {
esc_html_e('Unauthorized access!', 'wp-statistics');
}
exit;
}
/**
* Setup an AJAX action to purge visitors with more than a defined number of hits.
*/
public function purge_visitor_hits_action_callback()
{
if (Helper::is_request('ajax') and User::Access('manage')) {
// Check Refer Ajax
check_ajax_referer('wp_rest', 'wps_nonce');
// Check Number Day
$purge_hits = 10;
if (isset($_POST['purge-hits'])) {
$purge_hits = intval(sanitize_text_field($_POST['purge-hits']));
}
if ($purge_hits < 10) {
esc_html_e('View count must be 10 or more!', 'wp-statistics');
} else {
echo Purge::purge_visitor_hits($purge_hits); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
} else {
esc_html_e('Unauthorized access!', 'wp-statistics');
}
exit;
}
/**
* Show Page Visitors Filter
*/
public function visitors_page_filters_action_callback()
{
if (Helper::is_request('ajax') and isset($_REQUEST['page'])) {
// Run only Visitors Page
if ($_REQUEST['page'] != "visitors") {
exit;
}
// Check Refer Ajax
check_ajax_referer('wp_rest', 'wps_nonce');
// Create Output object
$filter = array();
// Browsers
$filter['browsers'] = array();
$browsers = DeviceHelper::getBrowserList();
foreach ($browsers as $key => $se) {
$filter['browsers'][$key] = $se;
}
// Location
$filter['location'] = array();
$country_list = Country::getList();
foreach ($country_list as $key => $name) {
$filter['location'][$key] = $name;
}
// Push First "000" Unknown to End of List
$first_key = key($filter['location']);
$first_val = $filter['location'][$first_key];
unset($filter['location'][$first_key]);
$filter['location'][$first_key] = $first_val;
// Platforms
$filter['platform'] = array();
$platforms_list = DeviceHelper::getPlatformsList();
foreach ($platforms_list as $key => $platform) {
$filter['platform'][$key] = $platform;
}
// Referrer
$filter['referrer'] = array();
$referrer_list = Referred::getList(array('min' => 50, 'limit' => 300));
foreach ($referrer_list as $site) {
$filter['referrer'][$site->domain] = $site->domain;
}
// User
$filter['users'] = array();
$user_list = Visitor::get_users_visitor();
foreach ($user_list as $user_id => $user_inf) {
$filter['users'][$user_id] = $user_inf['user_login'] . " #" . $user_id . "";
}
// Send Json
wp_send_json($filter);
}
exit;
}
/**
* Get Page Insight Filters.
*/
public function page_insight_filters_action_callback()
{
if (Request::isFrom('ajax') and User::Access('read')) {
if ("pages" !== $_REQUEST['page']) {
exit;
}
check_ajax_referer('wp_rest', 'wps_nonce');
$filter = [];
$filter['users'] = [];
$users = get_users(['has_published_posts' => true]);
foreach ($users as $key => $user) {
$filter['users'][esc_html($user->ID)] = esc_html($user->display_name) . ' #' . esc_html($user->ID);
}
wp_send_json($filter);
}
exit;
}
/**
* Setup an AJAX action to update geoIP database.
*/
public function update_geoip_database_action_callback()
{
if (Helper::is_request('ajax') and User::Access('manage')) {
// Check Refer Ajax
check_ajax_referer('wp_rest', 'wps_nonce');
$result = GeolocationFactory::downloadDatabase(MaxmindGeoIPProvider::class);
if (is_wp_error($result)) {
esc_html_e($result->get_error_message());
}
esc_html_e('GeoIP Database successfully updated.', 'wp-statistics');
} else {
esc_html_e('Unauthorized access!', 'wp-statistics');
}
exit;
}
/**
* Setup Admin Meta box render ajax
*/
public function admin_meta_box_action_callback()
{
if (Helper::is_request('ajax') and User::Access('read')) {
// Check Refer Ajax
check_ajax_referer('wp_rest', 'wps_nonce');
$metaboxName = sanitize_text_field($_GET['name']);
// Check Exist MetaBox Name
if (in_array($metaboxName, array_keys(Meta_Box::getList())) and Meta_Box::metaBoxClassExist($metaboxName)) {
$parameters = [];
foreach ($_GET as $key => $value) {
if ($value && !in_array($key, ['action', 'wps_nonce', '_'])) {
$parameters[$key] = sanitize_text_field($value);
}
}
$class = Meta_Box::getMetaBoxClass($metaboxName);
wp_send_json($class::get($parameters));
} else {
wp_send_json(array('code' => 'not_found_meta_box', 'message' => __('Invalid MetaBox Name in Request.', 'wp-statistics')), 400);
}
}
exit;
}
/**
* Get page filter items
*/
public function get_page_filter_items_action_callback()
{
if (Helper::is_request('ajax') and User::Access('read')) {
check_ajax_referer('wp_rest', 'wps_nonce');
$paged = Request::get('paged', 1, 'number');
$postType = Request::get('post_type', array_values(Helper::get_list_post_type()));
$authorId = Request::get('author_id', '', 'number');
$search = Request::get('search', '');
$page = Request::get('page');
$selectedPost = Request::get('post_id', false, 'number');
if (!$page) {
wp_send_json([
'code' => 'not_found_page',
'message' => esc_html__('Invalid Page in Request.', 'wp-statistics')
], 400);
}
$query = new \WP_Query([
'post_status' => 'publish',
'posts_per_page' => 10,
'paged' => $paged,
'post_type' => $postType,
'author' => $authorId,
's' => $search
]);
$posts = [];
if ($query->have_posts()) {
if ($paged == 1 && empty($search)) {
$allOption = [
'id' => Menus::admin_url($page),
'text' => esc_html__('All', 'wp-statistics')
];
if (!$selectedPost) {
$allOption['selected'] = true;
}
$posts[] = $allOption;
}
while ($query->have_posts()) {
$query->the_post();
$option = [
'id' => add_query_arg(['pid' => get_the_ID()], Menus::admin_url($page)),
'text' => get_the_title()
];
if ($selectedPost == get_the_ID()) {
$option['selected'] = true;
}
$posts[] = $option;
}
}
wp_send_json([
'results' => $posts,
'pagination' => [
'more' => $query->max_num_pages > $paged ? true : false
]
]);
}
exit;
}
public function search_visitors_action_callback()
{
if (Helper::is_request('ajax') and User::Access('read')) {
check_ajax_referer('wp_rest', 'wps_nonce');
$results = [];
$search = Request::get('search', '');
$visitorsModel = new VisitorsModel();
$visitors = $visitorsModel->searchVisitors([
'ip' => $search,
'username' => $search,
'email' => $search
]);
foreach ($visitors as $visitor) {
$option = [
'id' => Menus::admin_url('visitors', ['type' => 'single-visitor', 'visitor_id' => $visitor->ID]),
'text' => sprintf(esc_html__('Visitor (#%s)', 'wp-statistics'), $visitor->ID)
];
$results[] = $option;
}
wp_send_json(['results' => $results]);
}
exit;
}
public function store_date_range_action_callback()
{
if (Helper::is_request('ajax')) {
check_ajax_referer('wp_rest', 'wps_nonce');
$date = Request::get('date', [], 'array');
DateRange::store($date);
wp_send_json_success(['message' => esc_html__('Date range has been stored successfully.', 'wp-statistics')]);
}
exit;
}
public function dismiss_notices_action_callback()
{
if (!Request::isFrom('ajax')) exit;
check_ajax_referer('wp_rest', 'wps_nonce');
$noticeId = Request::get('notice_id');
if (!empty($noticeId)) {
$dismissedNotices = get_option('wp_statistics_dismissed_notices', []);
if (!in_array($noticeId, $dismissedNotices)) {
$dismissedNotices[] = $noticeId;
update_option('wp_statistics_dismissed_notices', $dismissedNotices);
}
wp_send_json_success(['message' => esc_html__('Notice dismissed.', 'wp-statistics')]);
} else {
wp_send_json_error(['message' => esc_html__('Invalid Notice ID.', 'wp-statistics')]);
}
exit;
}
}
new Ajax;